发布于 

脑机接口与肌电:sEMG 信号处理与意图解码

意念控制机械臂的新闻里,主角吞下一口咖啡,机械臂把糖罐递过来,观众起立鼓掌。这条新闻不会告诉你的是:它背后的信号链路朴素得近乎寒酸——几个电极、一块放大器、一串滤波器、一个分类器,四级流水线依次接力,每一级都在和噪声赛跑。任何一级输掉这场比赛,"意念"就退化成随机数。

这篇沿这条流水线走一遍:信号从哪儿来、长什么样、怎么在 ROS 2 里实时洗掉噪声、抽什么特征、用什么分类器,最后变成机器人能执行的命令。四级流水线的关系不是串完即止——每一级的设计参数都被下一级倒逼:放大器增益由 ADC 量程定,滤波通带由特征频段定,窗口长度由分类器稳定性定,判决节奏由控制回路定。理解这条倒逼链,比记住任何一个公式都重要。

先从最上游的问题开始:你要的信号,到底从人身上的哪一站取。

一、EEG 还是 sEMG:先想清楚你要抢哪一级

生物电控制在人身上有两处可选的窃听点。EEG(脑电图)电极贴在头皮上,sEMG(表面肌电)电极贴在目标肌肉皮肤上,区别不只是贴的位置——是抢在神经通路的哪一级截获信号。

运动意图的完整链路是:运动皮层生成意图 → 信号沿脊髓下传 → 运动神经元发放 → 肌肉收缩 → 关节运动。EEG 截获第一级,sEMG 截获倒数第二级。

  • EEG 是信息上游:能截获"想动"这个念头本身,甚至对已经截肢、脊髓损伤的用户依然可用——念头还在发出,只是通路断了。代价是信号极弱且经过了颅骨与头皮的 heavily 衰减,空间分辨率以厘米计,今天可靠解码的类别数也就 2–4 类。
  • sEMG 是最后一级输出:运动神经元冲动传到肌肉,肌纤维去极化产生动作电位,在皮肤表面叠加成 sEMG。信号强、信噪比好、电极便宜,是康复机器人和商用假肢的主流派单。局限也直白:肌肉没有电就没有输出,脊髓损伤平面以下它无能为力——这时才轮到 EEG 出场。

两路信号的对比如下:

维度 EEG sEMG
截获位置 运动皮层(意图源头) 肌肉(最终输出)
幅度 5-300 μV 0-10 mV
训练负担 数周 几乎为零
可靠类别数 2–4 类 6–10 类
适用人群 含运动功能完全丧失者 需残余肌肉控制

工程选型的诚实结论:能贴肌肉就别贴头皮,sEMG 的工程难度比 EEG 低一个量级;只有当"肌肉不可用"或"需要的信息在更上游"时,才付 EEG 的税。好在两者最后汇进同一条解码流水线,所以这篇把并列着讲。

还有一条隐藏的时间线差异影响系统设计:EEG 的意图信号与动作结果之间隔着完整的运动通路(数百毫秒),sEMG 与动作之间只有电-机械延迟(约 100 ms)。这意味着 EEG 系统有更充裕的"提前量"但信号更脏,sEMG 系统信号干净但预算紧张——同一个"抢时间"的问题,两路信号给出的是方向相反的难题,流水线参数要按各自的时间线分别调。

二、信号长什么样:频谱决定一切

处理任何信号前先问两个问题:多大幅度、什么频段。答案直接决定放大器增益和滤波器通带——频谱是整条流水线设计约束的源头。

信号 幅度 能量集中频段 电极
EEG 5-300 μV alpha 8-13 Hz、beta 13-30 Hz 湿电极(含凝胶)
sEMG 0-10 mV 20-500 Hz 干/湿电极均可

EEG 的节律按频段命名是历史传统:delta 0.5-4 Hz(深睡)、theta 4-8 Hz(浅睡/冥想)、alpha 8-13 Hz(清醒闭眼,枕区最强)、beta 13-30 Hz(活跃思维与运动)。与运动意图解码关系最密切的是 mu 节律——频率与 alpha 重合但位于运动区,会在实际或想象运动时去同步。sEMG 没这种精细命名,它本质是大量运动单元动作电位的随机叠加,频谱像一个 20-500 Hz 的能量包,发力越强包越高。

两个量级差距是硬件设计约束的根源:EEG 放大器需要约 10^4 倍增益和 1 μVpp 级本底噪声,sEMG 只要几百倍。这也是为什么 ADS1299 这类专用 AFE 是 EEG 的标配,而 sEMG 用一颗仪表放大器就能起步——模拟前端这场战争记载在生物电模拟前端:ADS1299 与右腿驱动里,本篇专注数字侧。

采样率跟着频段走:EEG 存 250-500 SPS 就够(alpha/beta 最高 30 Hz,留足抗混叠余量),sEMG 要 1-2 kSPS(能量延伸到 500 Hz)。过采不增加信息只增加负担——8 通道 × 1 kSPS × float32 = 32 kB/s,看着不大,但 64 导系统就是 256 kB/s 起步,实时链路的每一跳(采集、网络、节点)都要过一遍这笔带宽账。

还有一个不能忽略的接口:电极与皮肤之间。湿电极靠凝胶导电,阻抗 1-10 kΩ;干电极直接接触,阻抗 100 kΩ-1 MΩ 且随压力晃动。电极阻抗不是常数,它随时间、汗液、机械压力漂移,是低频伪影和共模转差模的温床——这就是为什么采集系统都带阻抗监测。

50 Hz 工频是头号敌人,因为它的传播方式近乎无解:市电通过容性耦合灌进人体和导线,人人都是 walking 天线。EEG 的 alpha/beta 频段离 50 Hz 不远,sEMG 通带(20–500 Hz)干脆把它整个罩进去。更糟的是它以共模形式出现——叠加在两枚差分电极上的幅度几乎相同。这给了我们第一道防线:高 CMRR 差分放大后工频只剩零点几毫伏,残余部分交给数字陷波器。模拟端 CMRR 每掉 20 dB,数字端压力翻一个量级——信噪比的仗在模拟端打,数字滤波只是打扫战场。

三、意图怎么编码:三种范式

原始波形只是载体,解码前先要回答"用户用什么动作表达意图"。这叫范式(paradigm),三种主流方式按实现难度递减排列。

运动想象(MI):用户想象左手或右手握拳,不真的动。对侧运动皮层的相关频段功率会下降,称为事件相关去同步(ERD)——想象右手,左脑 C3 电极附近的 8-13 Hz 功率掉下去;想象左手则镜像地在 C4。分类器抓的就是这个左右不对称性。MI 的好处是纯内生信号、不需要外部刺激、截肢者也能用;坏处是 ERD 只有百分之几十的功率变化,淹没在个体差异里,用户要训练数周才能稳定产出这种脑态,在线准确率天花板约 80%。

SSVEP(稳态视觉诱发电位):屏幕上并排几个方块,各自以不同频率闪烁(比如 8 / 10 / 12 Hz),用户盯哪个,视觉皮层的 EEG 里就会混入哪个频率及其谐波的稳定成分。对一段 EEG 做频谱分析,哪个频率功率异常高,就知道用户在看哪块——相当于用眼睛"点菜单"。SSVEP 信息传输率是三种范式里最高的(熟练用户可达 60–100 bits/min),且几乎零训练;代价是要一直有闪烁刺激,长时间使用视觉疲劳,而且"眼睛看哪"和"心里想哪"偶尔会打架。

sEMG 激活度:最不神秘也最实用的一种。肌肉在发力前约 100 ms 就出现电活动——中枢先发电、肢体后动作,这段提前量称为电-机械延迟。在这 100 ms 里完成采集、滤波、分类,就能在用户"抬手"之前发出命令。这 100 ms 是本篇所有实时性设计的总预算,后面每一节都在省着花它。多通道 sEMG 配合模式识别,可区分手腕屈伸、握拳、张开等 6–10 类动作,康复外骨骼与商用假肢(如 Ottobock 的肌电手)的主流方案基本是它。

范式 载体 训练量 信息率 主要短板
MI EEG 数周 低(2–4 类) 准确率不稳
SSVEP EEG 几乎零 高 视觉疲劳
激活度 sEMG 几乎零 中 依赖残余肌肉

范式的选择本身就是产品定义:实验室选范式看信息量,产品选范式看谁能忍受。MI 用户要练三周才能到 75% 准确率,SSVEP 用户盯着闪烁屏二十分钟就眼睛发酸,激活度范式用户戴上就万事大吉——面向残障人士的产品几乎清一色选 sEMG,不是因为它先进,是因为它仁慈。

三点五、三种范式之外:混合与自适应的现实

前沿论文里还有一批混合范式值得知道,但先说清定位:它们是研究工具不是产品方案。混合 BCI 把 EEG 与 sEMG 叠加(EEG 出"要不要动"的开关、sEMG 出"怎么动"的细节),论文里能涨五到十个点准确率,代价是双套硬件、双套标定、双套故障模式——产品化时这三个代价每个都是杀手。另一路是把范式当传感器做融合(如 sEMG + 关节角度计 + IMU),这已经是多模态融合问题而非脑机接口问题。看到"准确率提升 10%"先问一句:加了几路硬件、标定时间翻了几倍,这个问题能把大部分论文创意和产品方案分开。

回到主线。范式定了、信号洗过了,接下来的问题是在线系统的真正敌人。这条链路上没有一个是重计算——IIR 滤波每样本几十次乘加,LDA 一次矩阵乘。真正的敌人是调度抖动:Linux 默认调度器的时间片粒度是毫秒级,一次随机的调度延迟就能吃光 50 ms 步进预算。所以在线节点要遵守普通 ROS 节点不遵守的纪律:回调里不做动态内存分配(预分配消息复用)、不用同步发布、线程绑核 + SCHED_FIFO 实时优先级(需要 root 或 rtprio 限额)、日志走异步 sink。这些不是玄学,是硬实时从"偶尔好"到"一直好"的全部差别。

四、ROS 2 实时信号流水线

工业现场没有"先录下来再离线分析"的 luxury,数据从 ADC 侧流进来就得在线处理。架构上推荐两级:采集端把样本打包推上网络,处理端跑滤波与伪影剔除,ROS 2 的组件机制(component)让两级可以同进程零拷贝,也可以跨机部署。

采集接入有两派。实验室派用 LSL(Lab Streaming Layer):采集程序把样本标记统一时间戳推给局域网,任何节点都能订阅,多模态设备(EEG + sEMG + 运动捕捉 + 反应键盘)自动对齐时钟——做实验和离线分析的神器。产品派走 SPI/DMA 直取板上 ADC,打包 UDP 发以太网,延迟更低更确定,不需要再挂一台 LSL 基础设施。ROS 2 侧统一写一个桥接节点,把两种来源都转成同一种消息:

bio_signal/msg/BioSignal:
  std_msgs/Header header     # stamp = 首样本采集时刻
  uint32[] channel_ids       # 通道号
  float32[] channels         # 本帧样本(逐通道交织)
  uint32 sample_rate         # Hz
  uint32 n_samples           # 本帧样本数

话题设计成两级:/signals/raw 承接桥接节点输出,/signals/clean 承接滤波节点输出,下游特征节点只订阅 clean。QoS 用 SensorDataQoS(best effort + 深度小):信号流是持续高速数据,丢一帧不致命,堵起来反而毁掉实时性——实时系统的第一美德是宁可丢、不要堵。

处理链的标准三件套:带通 → 陷波 → 伪影剔除。带通用 IIR 而不是 FIR:20-500 Hz 通带、同样陡的过渡带,FIR 要几百阶而 IIR 只要 4–6 阶,每微秒都要省。陷波器盯 50 Hz(及其谐波 100 Hz),Q 值取高让凹口足够窄,别误伤旁边的肌电能量。处理后的数据发 /signals/clean。

伪影剔除不能省。EEG 最大的污染源是眨眼:一次眨眼在额叶电极上制造 100-200 μV 的尖峰,比信号大一个数量级,且频谱恰好落在低频段。最简单有效的防线是阈值检测——滑动窗幅度超过 ±100 μV 直接把该窗标记为坏段,下游分类器跳过。更精细的做法用 ICA(独立成分分析)把眨眼成分分离后剔除,但 ICA 的计算开销决定了它主要用于离线;sEMG 端的对应麻烦是电极移动伪影(低频大摆动)和邻近肌肉的串扰(cross-talk),前者带通的高通端已在物理上压掉大半,后者只能靠电极间距与放置位置管理。

阈值怎么定有讲究:拍脑袋定 100 μV 对额叶通道太松(眨眼常超过)、对枕叶通道太紧(生理信号本来就大)。实践做法是让用户静坐两分钟无任务记录,取每通道幅度的 95 分位数乘 1.5 倍作为该通道自适应阈值——阈值本身也是特征,要按通道、按用户在线估计,而不是全局一个常数。

一个滤波节点骨架(C++,rclcpp,滤波系数离线预计算):

class FilterNode : public rclcpp::Node {
public:
  FilterNode() : Node("emg_filter") {
    sub_ = create_subscription<bio_signal::msg::BioSignal>(
      "/signals/raw", 10,
      [this](bio_signal::msg::BioSignal::SharedPtr msg) {
        for (size_t ch = 0; ch < msg->channels.size(); ++ch) {
          auto &st = states_[ch];
          double y = msg->channels[ch] - st.x1 * BP_A1 - st.x2 * BP_A2
                   + st.y1 * BP_B1 - st.y2 * BP_B2;
          double yn = y - st.n1 * NT_A1 - st.n2 * NT_A2
                   + st.ny1 * NT_B1 - st.ny2 * NT_B2;
          st.shift(msg->channels[ch], y, yn);
          msg->channels[ch] = yn;
        }
        if (window_peak(msg) > ARTIFACT_TH) return;
        pub_->publish(std::move(msg));
      });
    pub_ = create_publisher<bio_signal::msg::BioSignal>(
      "/signals/clean", 10);
  }
private:
  struct St { double x1{}, x2{}, y1{}, y2{},
              n1{}, n2{}, ny1{}, ny2{};
    void shift(double x, double y, double yn); };
  std::map<size_t, St> states_;
};

两个工程细节:滤波系数不用 ROS 参数服务器——系数在构造时烧死,避免运行时被改出震荡;窗函数、重采样、共平均参考(CAR)这些能前置到采集端的事就前置,ROS 节点只做必须在线的部分。

五、特征与分类:在 100 ms 预算内做决定

干净的信号到了分类器门口,先要压缩成特征向量——原始 8 通道 × 200 ms × 1 kHz 是 1600 个数,直接喂分类器既慢又容易过拟合。特征工程的本质是把 1600 个数压成几十个有物理含义的数。

时域特征便宜且能打,sEMG 的主力:

  • RMS(均方根):sqrt(mean(x^2)),反映激活强度,发力越大越高;
  • 过零率(ZC):波形穿越零线的次数,反映运动单元发放频率;
  • 波形长度(WL):曲线总路程,兼顾幅度与频率信息;
  • 斜率符号变化(SSC):过零率的二阶版,进一步刻画频率结构;
  • 通道间相关系数:抓协同收缩模式,对抓握类动作区分度好。

五个特征 × 8 通道 = 40 维,LDA 微秒级出结果,是嵌入式部署的最小可行集。

频域特征是 EEG 的主场:对每个通道做 Welch 谱估计,取运动区 C3/C4 的 8-13 Hz 与 13-30 Hz 带功率及左右比值,直接对应 ERD 现象。对 MI 任务,CSP(共空间模式)+ LDA 是二十年经典基线:CSP 学一组空间滤波器(电极加权和)使两类任务的功率方差比最大化——本质是自动找出"哪几个电极怎么组合最能区分左右想象",比手挑电极强得多。

分类器选择的真正约束是在线 latency 预算:

分类器 单次推理 倾向 适用
LDA < 0.1 ms 基线 MI / sEMG 多分类
SVM (RBF) ~1 ms 略高 小样本 sEMG
1D-CNN 5-20 ms 再高 端到端原始波形

规则直白:特征工程做得好,LDA 就够;想吃下原始波形和非线性结构,才上 CNN——但先把 20 ms 推理延迟放进总预算核对。GPU 不是免死金牌:外骨骼控制循环跑 100 Hz 时,留给分类器的时间可能不足 5 ms,而模型量化、ONNX Runtime 这类话题只在延迟核算过关后才值得讨论。

最后是滑动窗口的权衡,三个参数联动:

  • 窗长 200 ms:sEMG 特征稳定性的下限,再短 RMS 抖动大到没法用;EEG 的 ERD 分析常用 250-500 ms 换谱分辨率;
  • 步进 50 ms:每秒出 20 次判决,相邻窗有 150 ms 数据重叠;
  • 多数决:连续 3 次一致才输出,把误触发压下去一个数量级,代价是再花 100 ms。

窗长 + 步进 + 投票三个参数加起来正好吃满"肌肉先动 100 ms"的预算——调参时心里要有这本账:每加一个稳态判决,就从提前量里扣一笔。

这套参数的推导值得展开成一张延迟预算表,在线系统设计时照着填:

环节 预算 实测典型值 说明
电-机械延迟 +100 ms 50-150 ms 生理提前量,只此一项是"赚"的
采集与组包 ≤ 5 ms 2-3 ms 1 kSPS 时每样本 1 ms
网络传输 ≤ 2 ms < 1 ms 局域网 UDP
滤波(含陷波) ≤ 1 ms < 0.1 ms IIR 4-6 阶
窗口等待 200 ms - 窗长的本质是等待数据攒够
特征 + 分类 ≤ 5 ms 0.1-2 ms 视分类器
多数决 +100 ms - 2 个额外步进

从表里能读出一个反直觉的结论:计算环节几乎免费,时间全花在"等数据攒够"上。窗长 200 ms 占了总延迟的一半以上,而它由特征稳定性决定、由不得你压缩——这就是为什么后续优化方向都在算法侧(更短窗的稳定特征、递推式特征更新),而不是把 CPU 换成更快的。

六、闭环:从概率到轨迹,以及写回人体

分类器输出"用户想屈肘"只是一个类别标签,距离外骨骼关节轨迹还差一层映射。工程上把解码输出接进 ROS 2 的控制层,做成有限状态机 + 速度映射两层:状态机管理"待机/屈/伸/停"的切换,用持续 300 ms 的判决一致性防抖;速度映射把 sEMG 激活度这个连续量按比例变成关节速度指令,发布到 /joint_trajectory——激活度越高动得越快,用户获得直观的力度感。

这套两层结构是踩坑踩出来的形状。直接把分类结果当速度指令(屈/伸二值乘固定速度)的方案,会在分类器抖动时产生关节"抽搐"——用户体验一次就再也不敢戴;而把激活度直接当指令又会把分类噪声混进幅度。离散的意图走状态机防抖,连续的幅度走比例映射,两条信息流分而治之,是把"分类器输出"翻译成"机器动作"的关键一步。轨迹平滑与力控环节的实时总线设计,写在外骨骼那篇里:外骨骼柔顺控制:EtherCAT 实时总线与导纳控制。

还有一条反向通道值得单独讲:FES(功能性电刺激)。解码是"读出"人体意图,FES 是"写回"——对瘫痪肌肉施加 20-50 Hz 的电脉冲串,直接引发收缩,用于中风后步态纠正(刺激胫前肌纠正足下垂是最经典处方)。读出 + 写回合起来就是一套闭环康复系统:sEMG 检测残余自主收缩,FES 按比例补足缺失的力量,患者"越用力、机器帮越多"——这既是治疗(促进神经可塑性)也是辅助(完成动作)。

FES 与 sEMG 同机共存有个先天矛盾:刺激脉冲本身会串进 sEMG 放大器造成饱和,V 级刺激与 mV 级信号同场。工程解法是时序交错——刺激器与采集器同步,只在刺激脉冲的间歇期采样,配合放大器的快速恢复(去饱和)设计。这也是"四级流水线都在和噪声赛跑"的最后一例:这里的噪声干脆是我们自己发出去的。

闭环跑通后还有一个容易被忽略的长期问题:信号会漂。电极阻抗随汗液变化、用户疲劳导致激活模式改变、电极位置每天贴得略有不同——今天调好的分类器下周可能掉十个点。产品级系统要么内置定期重标定流程(引导用户做一分钟标准动作),要么用无监督自适应(Riemannian 几何类的域迁移是近年热点)在线追着信号漂移跑。"出厂调好"在生物电系统里是个伪命题,维护性才是工程化的真门槛。

七、验证与评估:别拿准确率骗自己

流水线搭完只是半程,评估方法不对,前面全白干。BCI 文献里被滥用最狠的指标是离线分类准确率——它掩盖了三件事:用了多少数据训练、跨了几个 session、有没有把测试数据的信息泄漏进特征选择。可信的在线评估至少要:

  1. 跨 session 测试:上午采的数据训练、下午的数据测试。生物电信号隔几个小时就漂(电极位置、皮肤状态、用户疲劳度),同 session 内的随机划分给出的准确率普遍虚高 10-15 个点。
  2. 信息传输率(ITR)代替裸准确率:ITR = (log2(N) + p·log2(p) + (1-p)·log2((1-p)/(N-1))) × 每分钟判决次数,同时计入准确率 p、类别数 N 和速度——准确率 95% 但每五秒出一判的系统,不如 85% 每秒一判的。
  3. 空闲态检测:真实使用中用户大部分时间不发出任何意图,分类器必须有一个"无命令"类,且它的误唤醒率要单独报告——实验室里没有空闲态的 90% 准确率,到用户头上就是每分钟几次的随机动作。

工程上还有一条隐性红线:新用户的标定时间。论文系统可以标定两小时,产品只能容忍两分钟——这直接决定了哪些"准确率高但标定重"的方法出不了实验室。自适应分类器(在线更新协方差的 adaptive LDA、域自适应)就是为压缩标定时间生的,值得在选型时优先考虑。

参考文献

  1. Wolpaw, J. R., & Wolpaw, E. W. (Eds.). Brain-Computer Interfaces: Principles and Practice. Oxford University Press, 2012.(BCI 范式、信号与临床应用的系统论述)
  2. Graimann, B., Allison, B., & Pfurtscheller, G. (Eds.). Brain-Computer Interfaces: Revolutionizing Human-Computer Interaction. Springer, 2010.(ERD/ERS 原理与 SSVEP 范式章节)
  3. Farina, D., et al. "The Extraction of Neural Information from the Surface EMG for the Control of Upper-Limb Prostheses: Emerging Avenues and Preliminary Challenges." IEEE Transactions on Biomedical Engineering, vol. 61, no. 4, 2014.(sEMG 解码的信息上限与现实挑战)
  4. Graupe, D., & Cline, W. K. "Functional Separation of EMG Signals via ARMA Identification Methods for Prosthesis Control Purposes." IEEE Transactions on Systems, Man, and Cybernetics, 1975.(肌电假肢控制的开端)
  5. Lab Streaming Layer Project. LSL Documentation, https://labstreaminglayer.org/.(多模态时间同步网络协议)
  6. Meng, F., et al. "Hybrid Brain-Computer Interface and FES System for Stroke Rehabilitation." IEEE Transactions on Neural Systems and Rehabilitation Engineering, vol. 29, 2021.(解码 + 电刺激闭环康复实例)

本篇的一切数字信号都从那块模拟板上出来:生物电模拟前端:ADS1299 与右腿驱动——EEG 的 μV 级信号如何在 50 Hz 市电海洋里被捞起、右腿驱动如何主动抵消共模,是信噪比战争的前一半战报。