4、实验设计:受试者招募与伦理审批、实验范式设计、数据采集协议与流程
好,咱们进入实验设计环节。说实话,这一章是整个肌电协同研究的「地基」。地基没打好,后面算法再漂亮也是白搭。我见过太多同学,上来就调模型,结果数据一塌糊涂——电极贴歪了、动作没对齐、受试者中途放弃了……最后只能重做。
所以,咱们一步步来。从受试者怎么找,到实验怎么做,再到数据怎么存,我把我踩过的坑都告诉你。
4.1 受试者招募与伦理审批
先聊伦理审批。很多人觉得这是走形式,其实不是。伦理委员会要看你有没有保护受试者。我建议你提前准备三样东西:
- 知情同意书:写清楚实验目的、流程、风险、数据用途。别用太学术的语言,受试者得看懂。
- 受试者筛选标准:比如年龄范围、是否有神经肌肉疾病、皮肤是否过敏等。
- 数据隐私保护方案:数据怎么脱敏、谁有权访问、实验后怎么销毁。
受试者招募这块,我个人的习惯是:
- 健康受试者:10-20 人足够做 pilot study。如果做机器学习,建议 20 人以上。
- 患者群体:这个比较难。我建议先联系临床合作者,通过医院招募。人数少没关系,5-8 人也能发文章,但统计上要小心。
- 排除标准:皮肤破损、金属植入物、癫痫病史(尤其做动态运动时)。
嗯,这里有个小技巧:招募时给点小报酬,比如 50-100 元/小时,受试者配合度会高很多。别问我怎么知道的……
4.2 实验范式设计
实验范式说白了就是「让受试者做什么动作」。肌电研究里,常见的有三类。我分别说说。
4.2.1 等长收缩
等长收缩就是肌肉发力但关节不动。比如握拳、屈腕、伸肘。这种范式的好处是:
- 信号稳定,重复性好
- 容易控制发力大小
- 适合做力-肌电关系建模
我建议你设计 3-5 个不同发力等级,比如 20%、40%、60%、80% MVC(最大自主收缩)。每个等级保持 5 秒,中间休息 2 分钟。为什么休息这么久?因为肌肉会疲劳,信号会漂移。我曾经连续做 10 次 80% MVC,结果最后几次信号明显变形——白做了。
4.2.2 动态运动
动态运动更贴近实际应用,比如抓握、抬臂、行走。但信号也更复杂——有运动伪迹、肌肉长度变化、电极位移。
我常用的设计是:
- 单关节运动:肘屈伸、腕屈伸。速度控制在 30°/s 左右,用节拍器引导。
- 多关节协同:比如喝水动作(肩屈+肘屈+腕伸)。这个更难,但更有价值。
- 连续运动:比如从放松到抓握到放松,循环 10 次。注意标记每个阶段的起止时间。
你想想看,动态运动的数据处理起来更麻烦。但如果你要做假肢控制或人机交互,这一步绕不开。
4.2.3 手势识别
手势识别是肌电研究的热门方向。常见手势包括:握拳、伸掌、捏、OK、竖拇指等。我建议选 6-10 个手势,每个手势重复 10 次,每次保持 3 秒。
这里有个坑:手势之间要有足够的休息时间。我见过有人设计 1 秒切换,结果受试者手都抽筋了。我一般设 3 秒动作 + 3 秒休息。
| 手势 | 动作描述 | 保持时间 | 重复次数 |
|---|---|---|---|
| 握拳 | 五指用力握紧 | 3 秒 | 10 |
| 伸掌 | 五指完全张开 | 3 秒 | 10 |
| 捏 | 拇指与食指对捏 | 3 秒 | 10 |
| OK | 拇指与食指形成圆圈 | 3 秒 | 10 |
4.3 数据采集协议与流程
数据采集协议,说白了就是「每一步怎么做」。我建议写成标准操作流程(SOP),这样不同实验员做出来结果一致。
4.3.1 采集前准备
- 皮肤处理:用酒精棉擦拭电极放置处,去除油脂和死皮。如果汗毛多,建议剃一下。别笑,我见过信号差到没法看,最后发现是汗毛导致的。
- 电极放置:按 SENIAM 标准放置。双极电极间距 2 cm,参考电极放在骨性突起处(如腕部、肘部)。
- 设备检查:采样率至少 1000 Hz,增益 1000 倍,带通滤波 20-500 Hz。检查电极阻抗,低于 5 kΩ 才算合格。
4.3.2 采集流程
我一般按这个顺序来:
- 基线记录:让受试者完全放松,记录 10 秒静息肌电。用于后续去噪。
- MVC 测试:做 3 次最大自主收缩,每次 3 秒,取最大值。用于归一化。
- 正式实验:按随机顺序执行动作。每个动作前有提示音,动作结束后有休息。
- 重复测试:如果做可靠性分析,隔天再测一次。
4.3.3 数据存储格式
我推荐用 HDF5 格式存储。一个文件包含:
- 肌电信号(numpy array)
- 触发信号(时间戳)
- 受试者信息(年龄、性别、BMI)
- 实验参数(采样率、电极位置、动作标签)
举个例子,Python 里这样存:
import h5py
import numpy as np
with h5py.File('subject_01.h5', 'w') as f:
f.create_dataset('emg', data=emg_signal)
f.create_dataset('trigger', data=trigger_times)
f.attrs['sampling_rate'] = 1000
f.attrs['subject_id'] = 'S01'
f.attrs['gesture_labels'] = ['rest', 'fist', 'open']
嗯,这样存的好处是:一个文件搞定所有信息,不会丢。我早期用 CSV 存,结果每次都要写一堆脚本去对齐——烦死了。
4.4 本章知识体系
下面这张图,是我自己梳理的实验设计流程。你可以照着它一步步来,不容易漏。
好了,实验设计这块就聊到这儿。记住:好的实验设计,是成功的一半。另一半?是数据处理和算法——那是后面章节的事。