GUI小部件是适合OpenBCI GUI界面窗格的小工具。GUI小部件的示例包括时间序列、FFT小部件、网络小部件等。
在每个小部件的左上角,都有一个下拉菜单,列出了所有可用的小部件。如果您单击下拉列表并从下拉列表中选择一个新的小部件,它将替换该窗口中的当前小部件。您可以通过单击GUI右上角的“layout”按钮来重新安排小部件的布局。
时间序列
时间序列是显示生物传感数据的主要部件。它对电生理信号进行实时处理和显示,每个图形代表一个电极在某个时间点检测到的电压。
它以电压为单位测量信号的绝对振幅,单位为μVrms(微伏,均方根)。
每一个超级皮层都配有与图形用户界面(GUI)相匹配的颜色编码曲线,这是跟踪哪个电极映射到哪个通道的有用方法。
①硬件设置
单击“硬件设置”按钮将打开一个菜单,允许您微调每个通道的PGA增益、偏差和其他硬件设置。
②其他设置
通道按钮:这些按钮代表每个连接的电极通道。您可以打开/关闭它们来控制是否要从该电极收集数据。
③视图设置
垂直刻度——控制时间序列中显示的μV范围。注意:设置为自动,以避免切断数据和显示良好的峰值和波谷,根据需要进行微调。
窗口——控制序列中显示的时间量。
④围栏/近围栏警告
这些警告表明没有信号或信号不良,您需要检查电极,以确保它们与您的身体接触良好。
⑤阻抗检查
发送一个测试电流下引脚检查阻抗。信息以kΩ表示。注意:在检查期间,数据将自动停止流式传输。
FFT图
这是生物传感工具的标准数据可视化功能。x轴显示各种频率,y轴显示每个频率的相应振幅,单位为μV。默认情况下,这些振幅以对数形式显示(推荐设置),但您可以在log/ln下拉列表中更改此设置。
注:FFT图中的每种颜色都经过颜色编码,以匹配时间序列中的通道。
①加速度计
每个OpenBCI板都配备了一个三轴加速计,数据从它流到这个小部件。这个加速度计测量板本身在XYZ轴上的加速度。
轴图形:在图形上直观地显示当前时刻的相对XYZ加速度
时间轴:显示随时间变化的相对XYZ加速度,按轴进行颜色编码。
②头部图
头部曲线图显示头部的哪些区域活动最频繁。一个区域的红色越深,该区域的大脑活动就越多。等高线也显示了连接不同区域的相似活动水平。
图上的每个数字对应于时间序列小部件中显示的电极通道。这些数字与Ultracortex Mark IV的建议装配相对应。但是,每一个都可以拖动到不同的位置进行定制配置。
③默认节点位置
基于10-20模型
P7和P8是节点T5和T6的新术语
④极性
与参考相比,引脚输入可以产生正值或负值。选择“+/-”将显示从参考测量的真实值。因此,如果电压测量值低于参考值,则值将显示为负值(或蓝色),如果电压测量值高于参考值,则值将为正值。或者,“+”将只显示绝对值,而不考虑信号是正还是负。
焦点小部件(暂时不推荐)
从guiv5.0.0开始,在实现更可靠和基于研究的Focus算法之前,这个特性暂时不推荐使用。如果您还想使用这个小部件,可以下载并运行guiv4.2.0。
这个小部件通过观察通道1和通道2上的α和β波水平来识别一种集中精神状态。它是基于支持聚焦状态的研究,阿尔法水平在0.7-2.0μV之间,β能级在0.0-0.7μV之间。如果你的数据超出这个比率,算法会声明你没有聚焦。
*为获得最佳结果,请尝试在FFT图中将“平滑”设置为0.98。
按键:当按键打开时,你可以执行任务,当你集中注意力时,你的向上箭头或空格键都会被按下。否则,它将被释放。
W_uFocus文件夹:此文件夹包含Focus小部件基于的原始数据,以及有关Arduino输出的材料(包括示例和说明)。
频带功率
频带功率小部件显示了不同脑电波类别的相对电压,每种脑电波都代表一个频率的子集,它代表不同的活动状态。这个小部件是一个很好的“一目了然”查看你大脑的活动。
*波浪类型
频率(Hz)描述
Gamma 32-100表示感知、学习和解决问题的任务以及警觉。当大脑多个部位有信息处理时,就会发生这种情况。
Beta13-32标志着正常的警觉意识和积极的思维。当你专注于工作、解决问题、学习新概念或积极交谈时,就会发生这种情况。
α8-13表示身心放松。当你闭上眼睛,当一个人在艺术上或在瑜伽的时候,它们就会发生。
θ4-8表示深度放松,创造力、洞察力、意识减退。它们是在做白日梦和冥想时学会的。
δ0.5-4表示睡眠,做梦。当我们享受恢复性、深度、无梦的睡眠时发生。
肌电图
简而言之,我们试图将肌肉的当前弯曲度映射到所述肌肉的“舒适弯曲范围”,然后将其表示为0到1之间的小数。理论上如果放松,值将为0,如果您灵活,则值将转到1。
电流EMG强度是一组在已知时间窗口内平均(或平滑)的原始电压值的集合。平均值越大,数据越平滑。我们建立了一个上限(圆形可视化器的外深蓝色圆)和一个较低的阈值(内部深蓝色圆),以不断更新“舒适的EMG范围”。然后我们将当前EMG(与通道颜色匹配的填充圆)值映射到上下阈值之间。
在每个通道的圆形可视化工具右侧的条形图中,更清晰地表示了这个伪模拟映射值。上限持续向下爬行,而较低的阈值不断向上爬,直到它们彼此之间距离最小ΔμV。这确保整个系统不会创建过大而不能影响肌肉弯曲的上/下弯曲范围。
小部件的下拉列表旨在允许您调整此关系的各种参数,有4个下拉列表用于控制某些参数:
①平滑
这是窗口的大小。如果我们将该值设置为最小设置为0.01秒(即降低平滑值),则数据将非常紧张,但响应迅速。或者,如果我们增加平滑度并将窗口设置为2.0秒,输出将非常平滑,但响应性要低得多。
②μV限制
这是任何单个数据块中允许μV值的截止点。超过该数字的任何μV值将被切断并设置为该上限μV。这是为了防止数据中不稳定的闪电实质上扭曲平均值。有时,丢弃的包和快速的身体运动会产生与肌肉活动无关的大尖峰。这有助于解释这些问题。
③蠕变
该值表示上限μV向下爬行的速度,以及下限向上爬行的速度。请注意,通过调整此值,上阈值环和下阈值环将更快地彼此接近。我们通常建议这是缓慢的。如果这太快,而且我们在肌肉**之间等待的时间太长,那么上阈值将逐渐接近下限,系统将变得敏感。
④最小ΔμV
该值设置上阈值和下限之间的最小电压范围。上限和下限不能接近此值。通过使该值变大,您将不得不更难弯曲,从0%到100%弯曲,在阈值逐渐接近彼此(也称为最小ΔμV)之后。
网络
网络小部件允许将数据流到其他应用程序。继续滚动以了解四种数据类型的解释:串行、UDP、OSC和LSL。要查看如何将其用于我们的不同应用程序,请查看我们的软件页面。
使用网络小部件,您可以发送时间序列、FFT、EMG、频带功率、加速度/辅助和脉冲数据。Accel/Aux选项允许您发送加速计、模拟读取或数字读取数据。确保打开相应的小部件,具体取决于您希望流的数据类型。所有可能输出的详细信息可在GUI网络指南中找到。
①串行
能够流式传输一种数据类型。数据以连续的数据包逐位按顺序发送。Serial是在使用OpenBCI和Arduino时可以使用的主要网络协议。
②波特率
以位/秒为单位的数据传输速率。这应该与为接收应用程序选择的波特率相对应。
③端口
接收设备的端口。例如,对于Arduino,这可能是一个带有***的“USB调制解调器”。
UDP协议
用户数据报协议主要用于在internet上的应用程序之间建立低延迟和允许丢失的连接。UDP协议允许向三个不同的应用程序发送最多三个不同的数据集。
LSL公司
实验室流媒体层是一个同步流数据的系统,用于实时分析或记录。LSL是将OpenBCI流发送到可以记录或操作数据的应用程序(如Matlab)的好方法。
FFT数据现在可以通过LSL发送,从guiv.4.1.5-beta.3开始。
对于某些数据类型,更改#Chan以匹配数据类型是有帮助的。示例:Focus是单个数字输出,所以只需将#Chan设置为1。下面是一个将3种数据类型流式传输到Python的屏幕截图:
您可以在这里找到示例Python脚本。注意:如果依赖项尚未安装,则需要执行pip install pylsl。
OSC公司
开放式声音控制是一种协议,用于连接声音合成器、计算机和其他多媒体设备,如音乐表演或演出控制。OSC的优势包括互操作性、准确性、灵活性以及增强的组织和文档。OSC使用MaxMSP、PureData和Resolume。
播放小部件
此小部件仅在播放模式下出现。它允许你选择不同的回放,而不必“停止系统”。小部件的右上角有一个按钮,允许您选择任何OpenBCI播放文件(.txt或.csv)。选择其他类型的文件可能会导致错误。
脉冲小工具
此小工具将只在实时模式下为Cyton显示。它使用模拟读取模式从Cyton上标记为D11的管脚获取数据。使用这些数据,小部件将计算每分钟心跳(BPM)和间隔时间(IBI)。使用Networking小部件时,此数据类型将发送BPM、Raw Signal和IBI。
自定义控件行为
本教程将向您展示如何为OpenBCI GUI创建自定义小部件。只需几个简单的步骤,您就可以将您的小型应用程序添加到OpenBCI GUI的下拉菜单中,以便实时运行专门的应用程序。这些小部件可以直接访问OpenBCI GUI的主数据结构,因此您可以在GUI中对脑电波和其他生物数据进行实验。
有用的背景技能
基于Java编程或Java处理的知识
从处理IDE运行OpenBCI GUI的经验
使用visualstudio代码或处理进行开发人员设置
或者,可以使用Atom对处理包进行编辑
①复制W_模板.pde文件重命名(&R)
W_模板.pde文件被设计为作为创建小部件的简单起点。首先,复制这个文件并将其重命名为W_myNewWidget.pde,其中“myNewWidget”是与新widget的用途相关的内容!尝试遵守命名约定,并将W_放在前面,以确保您的项目目录中的所有小部件彼此相邻。您需要记住重命名该类,以确保它是唯一的,而不是与W相同的类_模板.pde. 文件的第一个未注释行应为:
class W_myNewWidget extends Widget {
②将新的小部件添加到widgetManager.pde文件
在添加任何获取本地数据结构的花哨代码之前,请确保将新的小部件添加到widgetManager.pde文件。通过这样做,您可以确保新的小部件被添加到每个小部件的下拉菜单中。这是很有帮助的,因为现在你可以看到你正在做什么,当你继续开发你的小部件图形。
通过在此处添加,遵循全局实例化小部件的协议:
// MAKE YOUR WIDGET GLOBALLY W_timeSeries
w_timeSeries;W_fft w_fft;W_networking w_networking;W_BandPower w_bandPower;W_accelerometer w_accelerometer;W_ganglionImpedance w_ganglionImpedance;W_headPlot w_headPlot;W_template w_template1;W_emg w_emg;W_openBionics w_openbionics;W_Focus w_focus;W_PulseSensor w_pulsesensor;W_myNewWidget w_myNewWidget;
然后,确保“设置”小部件,并通过模仿设置代码行将其添加到所有小部件的数组中:
…
w_networking = new W_networking(_this);
w_networking.setTitle(“Networking”);
addWidget(w_networking, w);
w_myNewWidget = new W_myNewWidget(_this);
w_myNewWidget.setTitle(“My New Widget”);
addWidget(w_myNewWidget, w);
w_bandPower = new W_BandPower(_this);
w_bandPower.setTitle(“Band Power”);
addWidget(w_bandPower, w);
…
③如果需要,添加下拉菜单来控制你的小部件
注意:在编译GUI之前,需要重命名W底部的全局函数_myNewWidget.pde使它们与W底部的全局函数不同_模板.pde. 在运行GUI时,当小部件的nav中**相应的下拉列表时,这些功能会自动**。确保构造函数的addDropdown()函数中的字符串(例如:“Dropdown1”)与.pde文件底部相应全局函数的名称相同。所选菜单项的索引是传递到函数中的内容(即“int n”)。
//These functions need to be global! These functions are activated when an item from the corresponding dropdown is selected
void Dropdown1(int n){
println(“Item " + (n+1) + " selected from Dropdown 1”);
if(n==0){
//do this
} else if(n==1){
//do this instead
}
closeAllDropdowns(); // do this at the end of all widget-activated functions to ensure proper widget interactivity … we want to make sure a click makes the menu close
}
void Dropdown2(int n){
println(“Item " + (n+1) + " selected from Dropdown 2”);
closeAllDropdowns();
}
void Dropdown3(int n){
println(“Item " + (n+1) + " selected from Dropdown 3”);
closeAllDropdowns();
}
运行GUI,确保您可以在所有widget左上角的widget下拉菜单中看到您的新widget。如果看不到,请确保正确地执行了上述步骤。
④设计您的自定义小部件
探索现有的小部件是如何访问GUI内部的数据结构的,看看您是否可以做出一些很酷的东西!
一些很酷的事情要知道:
每个小部件都有x、y、w、h变量,分别对应于小部件的左边缘(水平像素位置)、小部件的上边缘(垂直像素位置)、像素宽度的#和像素高度的#。当调整屏幕大小或小部件在布局容器中循环时,这些变量会自动更新。在向小部件添加图形时,请根据这些变量执行所有操作,以确保响应能力。
除了在widgetManager.pde文件,你所有的代码都可以存在于W_myNewWidget.pde文件(如果操作正确)。
要了解如何访问全局数据结构,如FFT数据和时间序列数据,请查看其他小部件如何在其update()函数中访问数据
我们向小部件添加下拉列表和单选按钮等功能的一种方法是ControlP5库。
要了解有关小部件如何工作的更多信息,请查看小工具.pde文件。也就是说,我不建议改变任何东西!
⑤添加任何下拉设置到会话设置.pde
从guiv4开始,应用程序尝试自动保存和自动加载用户设置。否则,用户每次都需要重新配置GUI!因此,如果您在新的小部件中使用下拉列表,则需要在中包含这些设置软件设置.pde在save()和load()中。
上面有一些细节会话设置.pde那应该是有帮助的。只需遵循已经存在的样式即可从JSON中保存和加载。浏览save()或load()中的代码,您将看到一些您最喜欢的小部件的设置。以这个为例!
⑥初始测试
调试如果在小部件中添加了println()或verbosePrint(),则可以使用控制台日志功能来查看这些消息,或者只需在您喜欢的IDE中查看控制台。
屏幕大小调整当用户更改GUI屏幕大小时,某些对象可能需要调整大小或重新定位。这就是widget类具有screenResized()方法的原因。在调整图形用户界面大小后,有什么不显示的?这是您需要添加代码的地方。通常,对象x、y、宽度和高度是在小部件实例化时声明的,在screenResized()中使用相对定位再次声明。
设置要测试一切正常,您应该在Documents/OpenBCI_GUI/Settings/文件夹中的每个数据模式的设置JSON文件中看到数据。可以查看JSON文本。确认新的JSON对象和数据正在写入文件。最后,在配置小部件、保存和加载时确认设置工作正常。
GUI崩溃使用新小部件使GUI崩溃的最常见方法之一是绘制空数据,或者与draw()相关的其他错误。另一个常见的崩溃是一个异常,它将打印到Atom、VSCode或处理IDE的控制台。
⑦与全世界分享你的定制小工具
如果您制作了一个您认为其他人可以从中受益的功能性小部件,请通过向OpenBCI_GUI repo提交一个拉取请求来与全世界共享它!
“ 嘘!悄悄插播一条小广告 ”
BCIduino 8通道脑电放大器具体参数如下:
输入阻抗:1TΩ
输入偏置电流:300pA
输入参考噪声:1μVpp
采样速率:250 Hz/500Hz
共模抑制比:-110dB
可调增益放大倍数:1、2、4、6、8、12、2
分辨率:24 位 ADC,精度最高可达 0.1μV
功耗:正常工作时 39mW,待机时低至仅 10μW
采用可充电锂电池供电,进一步降低来自外部的干扰。
尺寸:50mm*50mm(实物测量,存在细微误差)
图1 BCIduino实物图
图2 BCIduino在普通嘈杂环境下、悬空状态的数据波形,可以观测到并无其他干扰出现
图3 OpenBCI在普通嘈杂环境下、悬空状态的数据波形(测量环境、测量时间、软件滤波器设置参数与图2BCIduino相同)
客官请留步
本篇由BCIduino脑机接口开源社区整理或撰写。BCIduino脑机接口社区由来自北京航空航天大学、康奈尔大学、北京大学、首都医科大学等硕博发起成立,欢迎扫码加入社群,备注"BCI",也欢迎采购BCIduino脑电模块(某宝搜索即可)