📜  项目经验 | (脑机接口)(1)

📅  最后修改于: 2023-12-03 15:28:55.176000             🧑  作者: Mango

项目经验 | (脑机接口)

本人曾参与过一个脑机接口(Brain-Computer Interface,BCI)项目,以下是我的经验总结。

项目概述

该项目旨在探索如何使用脑电波控制智能设备,实现人机交互。我们的团队设计并实现了一个能够从脑电波中提取信息、并以此控制智能设备的系统,该系统包括以下部分:

  • EEG 采集设备:使用 Emotiv EPOC+ 头戴设备采集 14 个 EEG 信号通道的数据。
  • 数据传输与处理部分:使用 Python 编写数据处理程序,通过 WiFi 将数据传输到控制端。
  • 控制端设备:使用 Raspberry Pi3 控制板和 GrovePi+ 扩展板,实现将控制信号转换为动作的功能。
  • 终端设备:通过 WiFi 连接到控制端的智能设备,例如小车、机器人等。
个人主要工作

在这个项目中,我主要负责开发数据传输与处理部分的程序。

EEG 信号采集

使用 Emotiv EPOC+ 头戴设备采集 14 个 EEG 信号通道的数据,并使用 Python 编写 Emotiv SDK 的封装程序,实现数据的实时采集和存储。

import emotiv
import csv

# 创建一个连接对象,连接 Emotiv EPOC+ 头戴设备
connection = emotiv.Emotiv()

# 获取所有可用的传感器点数
sensors = connection.get_sensors()
sensor_points = {}
for sensor in sensors:
    sensor_points[sensor['name']] = sensor['id']

# 创建 CSV 文件,存储脑电数据
with open('eeg_data.csv', 'w', newline='') as csvfile:
    fieldnames = ['F3', 'FC5', 'AF3', 'F7', 'T7', 'P7', 'O1', 'O2', 'P8', 'T8', 'F8', 'AF4', 'FC6', 'F4']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()

    while True:
        # 获取最新一次的脑电数据
        packet = connection.dequeue()

        # 将数据保存到 CSV 文件中
        data = {}
        for name, id in sensor_points.items():
            data[name] = packet.sensors[id]['value']
        writer.writerow(data)
数据传输与处理

编写 Python 程序,从 EEG 采集程序中读取采集到的脑电数据,通过 WiFi 传输到控制端,并进行数据处理,提取出实时控制需要的参数。

import socket
import struct
import csv
import time
from threading import Thread

# 创建 UDP 套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('0.0.0.0', 5555))

# 向控制端发送数据的函数
def send_data():
    while True:
        # 从 CSV 文件中读取最近一次的脑电数据
        with open('eeg_data.csv', newline='') as csvfile:
            reader = csv.DictReader(csvfile)
            data = list(reader)[-1]

        # 将数据打包成二进制格式,并发送到控制端
        message = struct.pack('14f', float(data['F3']), float(data['FC5']), float(data['AF3']), float(data['F7']), float(data['T7']), float(data['P7']), float(data['O1']), float(data['O2']), float(data['P8']), float(data['T8']), float(data['F8']), float(data['AF4']), float(data['FC6']), float(data['F4']))
        sock.sendto(message, ('192.168.0.100', 6666))

        # 每隔 10 毫秒发送一次数据
        time.sleep(0.01)

# 开启一个新线程,执行 send_data 函数
send_thread = Thread(target=send_data)
send_thread.start()

# 接收控制端的数据,处理完毕后执行相应的动作
while True:
    # 接收控制端发送的数据
    data, _ = sock.recvfrom(1024)

    # 解包得到控制参数
    left_right, forward_backward = struct.unpack('2f', data)

    # 根据控制参数,执行相应的动作
    if forward_backward < -50:
        # 后退
        pass
    elif forward_backward > 50:
        # 前进
        pass
    if left_right < -50:
        # 左转
        pass
    elif left_right > 50:
        # 右转
        pass
结论

通过这个项目,我学习了如何使用 Emotiv EPOC+ 头戴设备采集脑电数据,并使用 Python 编写数据处理程序和数据传输程序。此外,我还学会了如何使用 Raspberry Pi3 和 GrovePi+ 扩展板控制智能设备,并将脑电数据转换为控制信号,实现了真正意义上的人机交互。在项目中遇到了一些困难,但通过不断尝试和调试,最终取得了令人满意的成果。