📅  最后修改于: 2023-12-03 15:28:55.176000             🧑  作者: Mango
本人曾参与过一个脑机接口(Brain-Computer Interface,BCI)项目,以下是我的经验总结。
该项目旨在探索如何使用脑电波控制智能设备,实现人机交互。我们的团队设计并实现了一个能够从脑电波中提取信息、并以此控制智能设备的系统,该系统包括以下部分:
在这个项目中,我主要负责开发数据传输与处理部分的程序。
使用 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+ 扩展板控制智能设备,并将脑电数据转换为控制信号,实现了真正意义上的人机交互。在项目中遇到了一些困难,但通过不断尝试和调试,最终取得了令人满意的成果。