TBC-TJU/MetaBCI

在线实验的具体操作流程是什么?

Opened this issue · 3 comments

  很高兴可以使用贵校和贵团队开发的MetaBCI平台进行实验,但是我在进行运动想象的在线实验时产生了一些困惑,向您请教一下,主要问题是:在线实验的具体操作流程是什么?

  我使用了您项目中提供的范式demo-stim_demo.py,online=True作为在线实验范式,在线demo-Online_mi.py作为在线采集后台,我的操作流程是先运行范式界面,但是不进行任何操作(不点击enter),之后运行Online_mi.py,但是这样的操作流程会导致一些问题:
  第一个问题关于在线程序和刺激程序的连接,在运行Online_mi.py之后,切回在线范式时,在初始界面选中MI点击enter后,范式界面没有反应,不进入出现左右手的页面,而且FeedbackWorker在run()函数中,会产生except queue.Empty 异常,导致陷入循环等待。而在进行离线采集,online=false时,范式不用和在线程序进行连接时,可以正常运行,请问这是否代表我的在线程序和刺激程序并没有进行正确的连接,如何将在线程序和刺激程序进行正确的连接呢,仅仅保证lsl_source_id相同即可?
  第二个问题关于在线程序和NeuroScan的连接,我使用的是curry8的协议,NeuroScan36导联(不是64导联,此处有影响吗?),在ns.start_acq()里,会进行两次self.recv(​),其中第一次self.recv(​)可以正常运行,b_header ={bytes} b'DATA\x00 x01 x00 x01 x00 x00 x00 x00’,self._unpack_header(b_header)解析出来header = tuple <class 'tuple'>: ('DATA', 1, 1, 0),由于pkf_size=0,不从socket读取数据;但是第二次self.recv(​)运行异常,会陷入socket循环等待,主要原因是b_header ={bytes} b'x00 x00 x00 x04 x00 x00 x00 x00"x03 x00 x00',(此处有些异常,在第九位出现了双引号),self._unpack_header(b_header)解析出来为header = tuple <class 'tuple'>:( x00 x00 x00 x04', 0, 0, 570621952),其pkf_size=570621952,因此会从socket读取570621952数据,但是此时socket中并没有这么多数据,而且因为之前self.set_timeout(None),没有设置过期时间,因此陷入长时间的等待,请问这个问题是因为36导联或者是数据协议不同而产生的吗?
   非常感谢您的耐心阅读,我将会非常感谢您的回答!

很高兴您使用MetaBCI平台进行实验,我是负责范式与在线部分的人员,关于您的问题做以下解答:
第一个问题,具体在线流程为:首先打开NeuroScan“serve”模式;然后运行在线demo-Online_mi.py,等待程序终端内打印出模型正确率,出现“Connected”提示,此时NeuroScan采集软件显示脑电波形;最后运行范式demo-stim_demo.py,online=True。这是因为在线demo-Online_mi.py中定义了StreamInfo的连接,用于在线与范式之间的反馈传输。
第二个问题,是否将在线demo-Online_mi.py里NeuroScan的num_chans设置为36,如果已经设置,可能是由于数据协议不同。
希望对您的问题有所帮助!

您好,非常感谢贵团队的回复。按照您上次提供的在线操作流程,在运行Online_mi.py时,发现MetaBCI平台(此处作为client)和采集软件curry8(此处作为NeuroScan的sever)无法正常通信的情况,分析后发现是因为MetaBCI平台和curry8所使用的传输协议不同,MetaBCI平台使用12byte数据作为控制命令,并将12byte数据解析为(ch_id,w_code,w_request,pkg_size),但curry8使用20byte数据作为控制命令,并将20byte数据解析为(m_chId,m_wCode,m_wRequest,m_unSample,m_dwSize,m_dwSizeUncompressed),其中前三项长度和意义可以一一匹配,但第四项不同,因此,在MetaBCI平台和curry8进行指令交互时,会出现命令解析错误,导致scoket陷入长时间等待。请问贵团队使用的是什么采集软件?如果是curry8,想向您请教一下curry8的配置; 如果不是curry8,因为传输协议不同造成上述问题,那我使用时,需要修改的部分有哪些呢?amplifiers.py中的指令集_COMMANDS和接受函数recv()吗?

您好,如果还感兴趣,我最近合并了一个新的PR,里面包含了对curry 8在线协议的支持。
但是我这里没有curry 8的license,因此无法对这部分代码进行测试,如果可以想请你帮忙测试,有bug烦请沟通~~