1. 外骨骼运动控制到底在控制什么
聊外骨骼运动控制之前,先把一个常见误解掰开:很多人默认外骨骼就是"一个会自己动的架子,穿上它腿就被带着走"。真做过这套东西的人都知道,最难的部分从来不是让它动,而是让它在人想动的时候、以人想要的力度、沿着人想要的轨迹动。这三个条件里任何一个不满足,穿戴者立刻会觉得别扭——轻则像拖着沙袋,重则像被人硬掰着腿走。外骨骼运动控制的核心,本质上是解决"机器输出"与"人体意图"之间的对齐问题,而这个对齐过程,远比实验室里跑通一条正弦曲线要复杂。
我接触的第一个膝关节助力样机,控制逻辑非常简单:检测到膝盖开始弯曲就给电机一个固定的助力曲线。刚装上跑直线还行,一旦走曲线或者变速,人就开始跟机器"打架"。后来复盘发现,问题出在我们把它当成一个轨迹跟踪问题在解,而人体行走其实是一个意图协同问题。这个认知转变,是我在做外骨骼时最大的一次思路调整,也是这篇文章想重点讲清楚的东西。
从工程视角拆开,外骨骼运动控制大致可以分成三层。最底层是关节级伺服控制,负责让电机快速、稳定、准确地跟踪指令力矩或位置;中间层是步态与意图识别,负责判断人现在处于行走周期哪个阶段、想加速还是想停;最上层是人机协同策略,决定在什么相位给多少助力、用位置控制还是力控、灵敏度放大多少倍。这三层如果各自都没问题,但层与层之间的接口没对齐,整体体验依然会崩。我见过不少项目,电机电流环调得非常漂亮,步态识别准确率也高,最后败在相位延迟上——识别出来的意图已经过去了 150 毫秒,机器才回应,人自然会觉得"这东西抢拍"。
标题里提到"简单解读",我理解不是要把算法讲得浅,而是把那些绕在论文里的公式,翻译成能落地的判断依据。外骨骼适合谁看这部分内容:如果你在做康复训练机器人、工业负重助力、下肢助行器,或者只是对人机协同控制感兴趣,这套"感知—识别—协同—伺服"的拆解方式都能直接套用。它解决的不是某个具体参数怎么调,而是让你面对一堆传感器和电机时,知道先想清楚哪件事,再动手调哪件事。
2. 整体方案选型:为什么外骨骼控制链路是这么搭的
2.1 感知层:别把传感器堆成"数据垃圾场"
新手最容易犯的错,是把能买到的传感器全装上——IMU、编码器、力矩传感器、足底压力、肌电,一样不落。结果数据量爆炸,融合逻辑写不出来,系统里到处是互相矛盾的信号。我的经验是:感知层要围绕控制目标来选,不是围绕"信息全"来选。
一个判断标准很实用:问自己"这个传感器的数据,直接进入哪一层控制?"。进入伺服内环的信号,要求高采样率、低延迟、低噪声,比如关节编码器;进入意图识别的信号,可以容忍几十毫秒延迟,但要稳定、不漂移,比如 IMU 的关节倾角;进入安全逻辑的信号,要求绝对可靠,比如机械限位开关。按这个分类去筛,你会发现肌电信号(sEMG)通常只有资格当"辅助触发"——它响应确实快,但受汗液、电极贴合、肌肉疲劳影响太大,单靠它做连续控制,穿戴十分钟就会开始漂。
具体到硬件,常见的组合是这样:
| 传感器 | 主要用途 | 推荐采样率 | 常见坑 |
|---|---|---|---|
| 关节磁编码器(如 14 位绝对式) | 关节角度反馈、伺服内环 | 1 kHz | 磁铁偏心导致非线性误差 |
| IMU(大腿/小腿各一个) | 关节倾角、步态相位 | 200 Hz 以上 | 积分漂移,必须做姿态融合 |
| 关节力矩传感器 | 人机交互力矩、力控 | 1 kHz | 安装同轴度差带来串扰 |
| 足底压力鞋垫 | 支撑相/摆动相判别 | 100 Hz | 鞋垫形变导致零点漂移 |
| 电流采样 | 电机力矩估算、限幅保护 | 与控制环同频 | 摩擦和齿槽效应影响精度 |
这张表里我要特别说一下编码器和电流采样的配合。很多低成本方案不装力矩传感器,靠电机电流乘扭矩常数来估算输出力矩。这招能用,但误差来源很多:减速器的摩擦、传动效率随温度变化、齿槽转矩。我实测过同一台电机在不同温度下,电流—力矩系数能差 8% 到 12%。如果助力精度要求高,还是得上力矩传感器,哪怕只在关节处装一个。
2.2 执行层:电机、绳驱、气动到底怎么选
执行器选型直接决定控制方法的可用范围。这个决策一旦定下来,后面算法基本被锁死。
电机加谐波减速器是目前最主流的选择。谐波减速器零背隙、扭矩密度高,配上无刷电机,可以做到位置和力矩双向可控。缺点是反向驱动性差——一旦断电或者控制失效,关节会"锁死",这在穿戴设备上是安全隐患。所以我的做法是:失电时让驱动器主动进入阻尼模式,而不是靠机械自由,也不是硬锁。减速比的选择有个粗略算法:先估峰值力矩需求,再除以电机峰值扭矩。比如某膝关节峰值需要 30 N·m,电机峰值 0.6 N·m,理论减速比 50。但考虑到冲击载荷和效率,我一般取理论值的 1.3 到 1.6 倍,所以会选 80:1 左右。
**绳驱(鲍登线)**的好处是把电机从腿上挪到腰背,减轻远端惯量,穿戴者摆动腿时更轻快。代价是绳的弹性、摩擦和迟滞——控制上相当于引入了一个非线性弹簧,位置控制精度会打折,做力控更难。我建议绳驱方案一定要在关节端加速度反馈,不然迟滞会毁掉整个内环。
气动人工肌肉柔顺性极好,天然适合康复场景,但带宽低、非线性强,还得拖一根气管和气源。如果你的控制目标是"柔和地带动人做慢速康复动作",它很合适;如果想做快速助行,别碰。
选型时还有个隐性指标:你能不能接受反向驱动。外骨骼不是工业机械臂,人是要穿在里面的。我个人的底线是,任何工况下穿戴者都要能凭自身力量克服阻力,哪怕很小。这一点会反过来影响减速比、摩擦补偿和控制模式的选择。
2.3 控制器架构:上位机加实时 MCU 的分工
架构上我强烈推荐分层:上位机(Linux 或工控机)负责高层决策、状态机、数据记录、人机界面;实时 MCU(STM32F4/H7 一类)负责 1 kHz 的伺服环和安全逻辑。两者用 CAN 或 EtherCAT 通信,控制指令以 1 ms 周期下发。
这个架构其实借鉴了开源运动控制框架的思路。像 3D 打印机领域的 Klipper,就是把轨迹规划这种重计算放在上位机做,MCU 只负责精确生成脉冲,从而在廉价 MCU 上也能跑出很高精度。外骨骼完全可以照搬这个思想:把步态相位预测、协同策略、日志这些"重活"放到上位机,把力控环、限幅、看门狗这些"急活"留在 MCU。这样既省算力,又保证了实时性。
有个细节要注意:上位机和 MCU 之间不要传力矩原始指令这种要求高实时的量,而是传"期望关节角+阻抗参数"这类缓变量。真正的力矩计算尽量在 MCU 本地完成,减少通信延迟的影响。
3. 核心控制算法:从步态相位到关节力矩
3.1 步态相位识别:一切助力的时间基准
步态相位识别做不准,后面所有控制都是空中楼阁。它的本质是给"人现在走到哪一步"打一个实时标签。
工程上常用两种做法。第一种是有限状态机加阈值:用足底压力判断支撑/摆动,用髋关节角速度过零点判断摆动中期,简单可靠,延迟低。缺点是阈值对不同人、不同速度敏感,需要个体标定。第二种是连续相位估计,比如把髋关节角度归一化映射成一个 0 到 1 的相位变量,配合自适应振荡器(Adaptive Oscillator)做相位锁定。它输出平滑,适合做连续助力曲线,但稳态收敛需要几个步态周期。
我在样机上最后用的是混合方案:状态机负责"粗定位"和异常检测,振荡器负责"细连续"输出。这样既保证了起步阶段快速响应,又保证了稳态下的平滑。判断好坏的核心指标只有一个——相位延迟。我实测下来,延迟超过 100 ms,穿戴者就开始明显感觉"滞后";控制在 50 ms 以内,才会有"它跟我一起动"的感觉。这个数字受采样率、滤波窗口、通信周期共同影响,调滤波时一定要盯着它看。
3.2 位置、阻抗、导纳:三种模式别用混了
这是外骨骼控制里最容易搞混的部分。我用一句话区分:位置控制是"你听我的",阻抗控制是"我们商量着来",导纳控制是"我听你的"。
位置控制在康复被动训练里很常见,机器带动腿完成固定轨迹,力量由机器出。它的好处是简单、可预测、轨迹可复现。缺点是遇到阻力不会退让,如果人不配合,容易出现对抗甚至拉伤风险。
阻抗控制是把关节当成一个"虚拟弹簧阻尼器",输出力矩按位置偏差和速度偏差计算:
# 单关节阻抗控制,1 kHz 控制周期内执行 tau_ff = gravity_compensation(q) # 重力补偿前馈 tau_fb = K * (q_ref - q) + D * (dq_ref - dq) # 阻抗反馈项 tau_cmd = tau_ff + tau_fb - tau_friction # 摩擦补偿后输出 tau_cmd = clamp(tau_cmd, -TAU_MAX, TAU_MAX) # 硬限幅,安全底线这里 K 是虚拟刚度,D 是虚拟阻尼。K 挑大,关节就"硬",跟位置控制接近;K 调小,关节就"软",人推得动。调试时的经验是:K 从 20 N·m/rad 附近起试,D 大致取 K 的 1/30 到 1/50(按临界阻尼估算再打个折),然后根据实际"软硬手感"微调。
导纳控制反过来:传感器测到人施加的力矩,再决定让关节往哪走。它适合人主导的场景,比如助行器里人要控制方向,机器只负责放大。但导纳控制对力信号的噪声很敏感,力矩传感器没做好的话,关节会出现低频晃动。
实际项目里很少只用一种,多是分相位切换:摆动期用阻抗控制保证腿部轻快跟随,支撑期切换到助力力矩控制把体重分担掉。切换瞬间最容易出问题,必须做输出力矩的连续过渡,不能硬切,否则穿戴者会感到一下"顿挫"。
3.3 灵敏度放大与助力曲线:让人感觉"我还是我"
外骨骼有个很微妙的心理点:助力太弱没感觉,助力太强人会失去对自己身体的控制感,反而更紧张。所以助力策略上我倾向灵敏度放大而不是"全程托着"。简单说就是机器提供的力矩是人自身力矩的某个倍数,人出力多机器帮得多,人放松机器也跟着松。
落地做法是设计一条助力曲线,横轴是步态相位,纵轴是助力系数。比如支撑中期系数最大,摆动期系数减小,避免摆动腿被"甩"出去。曲线要根据使用者的身高体重、行走速度做参数化,不能一套曲线打天下。我踩过的坑是:早期用固定曲线,同一个使用者走快了以后,助力时机全部错位,反而变成了阻力。后来改成按步态周期长度做时间归一化,问题才解决。
4. 实操过程:从零搭一套能跑的控制链路
4.1 力矩需求估算与执行器匹配
动手之前先算账,这一步跳过后面全是返工。我以膝关节助力为例走一遍计算。
假设穿戴者大腿加小腿加足部质量约 10 kg,质心到膝关节距离约 0.3 m。当屈膝 30 度时,重力矩约为:
10 kg × 9.8 m/s² × 0.3 m × sin(30°) ≈ 14.7 N·m
再算外骨骼自身杆件:约 3 kg,质心距关节 0.35 m,同样角度下约 5.1 N·m。两项合计约 19.8 N·m。这还只是静态重力矩,行走时还要叠加惯性项和地面反力冲击,所以我一般乘 1.5 倍安全系数,得到峰值需求约 30 N·m。
接下来匹配电机:选峰值扭矩 0.6 N·m 的无刷电机,配 80:1 谐波减速器,理论输出 48 N·m,留出余量合理。再核对速度:步态周期约 1.1 s,摆动期约 0.4 s,膝关节摆动范围约 60 度,换算峰值角速度大致 3 rad/s。电机侧角速度就是 3 × 80 = 240 rad/s,约 2300 rpm,在无刷电机能力范围内。这一算,执行器就定下来了。
控制带宽方面,步态基频约 1 Hz,考虑到需要跟踪的谐波到 5 次,带宽做到 10 Hz 足够,所以 1 kHz 的伺服环绰绰有余。真正卡脖子的不是内环带宽,而是意图识别的延迟。
4.2 通信链路与实时性配置
硬件搭好后,通信链路是第二个坑区。我用的方案是:MCU 和电机驱动器之间走 CAN,波特率 1 Mbps;MCU 和上位机之间也走 CAN 或以太网。
CAN 总线上要算负载率。每个 1 ms 周期下发力矩指令给两个关节,加上驱动器回传状态,大概 6 到 8 帧,每帧约 110 位(含开销),1 ms 内总共约 900 位,1 Mbps 下占用率不到 10%,很安全。但如果你还在同一个总线上挂 IMU、力矩传感器的高频数据,占用率会飙升。我的做法是把实时控制流和非实时数据流分到不同总线,或者把高频感知数据在下位机预处理后再上传。
还有个隐藏问题:上位机如果不是实时内核,1 ms 周期的指令下发会有抖动,最坏情况可能几十毫秒。所以我绝不让上位机的时序影响内环——力矩计算和限幅全在 MCU 本地跑,上位机只负责给"目标参数"。MCU 里加上看门狗,一旦通信超时,立刻切入安全模式。
4.3 参数整定:从重力补偿到阻抗参数的调试顺序
调试顺序错了,会浪费大量时间。我的固定顺序是:先补偿,再位置,再阻尼,最后阻抗。
第一步,做重力补偿。把外骨骼空载挂在支架上,或者让穿戴者完全放松,用关节角度反查重力矩模型,实测修正系数。目标是让人在被动状态下感觉不到外骨骼自重。这一步没做好,后面所有参数都是在错误基线上调的。
第二步,调位置环。先只加 P,Kp 从很小的值开始(比如 0.5 N·m/deg),逐步加大直到出现轻微振荡,再回退 30%。然后加 D 抑制振荡。这一步要在关节悬空、人不在里面的状态下做,安全。
第三步,加阻尼和摩擦补偿。低速爬行是摩擦死区的典型表现,可以用库仑摩擦加 Stribeck 模型做前馈补偿。如果补偿过强,会出现低速抖动,这时要减小补偿系数或加滤波。
第四步,上阻抗控制。把 K、D 调到能让人轻松推动关节,同时松手后能稳定回位、不振荡。我常用一个土办法判断:穿戴者用力推关节再突然松手,如果关节在 1 到 2 个来回内稳定下来,参数就差不多;如果来回晃三下以上,说明 D 不够或者 K 太小。
4.4 相位对齐与穿戴标定
最后一步是最容易被忽视、却最影响体验的:穿戴标定。每个人的腿长、关节轴位置、绑带松紧都不同,机器识别出来的关节角和人体的实际关节角可能差好几度。穿好之后,让使用者做几次标准屈伸,记录编码器角度和 IMU 倾角的关系,做一次线性或二阶标定,把映射关系固定下来。绑带松动会直接改变人机轴的相对位置,所以我一般要求先固定好绑带再做标定,而且每次穿戴都重新做一次,花不了两分钟,但能省掉大量"为什么今天助力怪怪的"的排查。
5. 跨界借鉴:开源运动控制框架能教给外骨骼什么
5.1 RepRap 的思路:把运动学抽象干净
很多做 3D 打印机的朋友对 RepRap 的开源生态不陌生。它给外骨骼的第一个启发是运动学抽象要彻底。RepRap 用 G 代码描述目标位置,机器内部统一做逆运动学解算,把"我想去哪"和"电机怎么转"彻底分开。外骨骼其实也应该这样:上层只说"期望人机交互力矩"或者"期望关节轨迹",下层驱动器只认"位置/速度/力矩"。中间的解算逻辑单独成模块,方便替换和调试。
第二个启发是低成本硬件的快速迭代。RepRap 生态把步进电机驱动、控制板、固件的成本压得很低,几十块钱就能换一个模块。外骨骼如果一上来就用最贵的方案,调试成本会高得离谱。我的做法是先在低成本平台上把控制逻辑跑通,确认算法没问题,再换高性能执行器。很多逻辑问题跟硬件贵不贵无关。
5.2 Klipper 的架构:主机加 MCU 的分工哲学
Klipper 最值得外骨骼借鉴的是它的分层哲学:重计算放主机,精确定时放 MCU,两者通过简单的命令流同步。它的核心洞察是——高位计算不需要严格实时,低位执行必须严格实时,把两者拆开,各自做擅长的事。
外骨骼完全适用。步态预测、协同策略、数据记录这些任务,跑在 Linux 上,延迟几十毫秒无所谓;力控内环、安全限幅、急停响应,跑在 MCU 上,必须是微秒级确定性。我现在的架构就是这么分的,上位机甚至会跑一个简化版的状态机界面,实时显示相位、力矩曲线,方便现场调试。这个架构还有一个好处:上位机可以随时重启调试,不会影响下位机的安全逻辑。
5.3 加减速规划:S 曲线对人是"礼貌"的
运动控制领域通用的梯形加减速,在外骨骼上要慎用。因为梯形速度曲线的加速度是阶跃的,对应的加加速度(jerk)在切换点是无穷大,人感受到的就是一下"冲击"。S 曲线把加速度的导数也做了限制,力的变化平滑,穿在身上舒服很多。
我一般把关节的加加速度限制在 100 到 500 rad/s³ 这个量级起步,具体看关节惯量和使用者耐受度。调这个参数的时候不用太理论化,让使用者评价"有没有顿挫感",比看曲线更直接。规划层还可以加上前瞻(look-ahead):提前几个控制周期预测轨迹变化,把速度提前降下来,避免到了拐点才急刹。这个思路和打印机运动控制在拐角处的处理是同一套逻辑。
6. 常见问题与排查技巧实录
6.1 抖动、啸叫、延迟的速查表
调试期间最常见的三类问题,我整理了一张排查表,基本能覆盖八成现场情况。
| 现象 | 可能原因 | 优先排查方向 | 处理办法 |
|---|---|---|---|
| 关节高频抖动 | 增益过高、编码器噪声 | 看编码器信号频谱 | 降低 Kp 或加低通滤波 |
| 低频晃动 | 力信号噪声、阻尼不足 | 力矩传感器零漂 | 加死区、增大 D |
| 电机啸叫 | 电流环带宽、齿槽转矩 | 电流环参数 | 降电流环增益、加前馈 |
| 助力滞后 | 滤波窗口过长、通信阻塞 | 测端到端延迟 | 缩短滤波、降总线负载 |
| 助力忽强忽弱 | 相位识别抖动 | 看相位输出曲线 | 振荡器平滑、加滞后切换 |
| 关节发热严重 | 减速比偏小、持续堵转 | 看电流有效值 | 提高减速比、降限幅 |
这里我要补充一个反直觉的经验:抖动不一定是控制参数问题。我遇到过一次持续高频抖动,查了两天参数都没用,最后发现是编码器磁铁的固定螺丝松了,磁铁在微小摆动,反馈信号里带了机械噪声。所以排查顺序应该是先机械、再电气、最后算法。机械问题用算法永远压不住。
6.2 穿戴舒适性带来的控制问题
绑带松紧会直接影响控制效果,这一点很多纯控制背景的人意识不到。绑带太松,人机之间会有相对位移,编码器读到的关节角和人体实际关节角对不上,位置和阻抗控制的参考就错了;绑带太紧,压迫软组织,走几分钟就会因为血液循环问题产生不适,人会下意识改变步态,识别逻辑又跟着乱。
我的处理办法是:一是在绑带处加压力分布检测(哪怕只是几片压力传感器),把压力作为穿戴是否合格的判断;二是做在线自适应,把人机耦合刚度当成一个可估计的参数,缓慢调整标定映射。这套东西听着复杂,但实现起来其实就是在标定基础上加一个慢速修正项。
6.3 安全边界:必须假设"控制一定会失效"
外骨骼是穿戴在人体上的,安全逻辑不能建立在"控制系统不出错"的假设上。我给自己定的几条底线:所有力矩指令必须硬限幅,限幅值写在 MCU 里而不是上位机;关节必须有机械限位,软限位和机械限位双保险;失电时进入阻尼模式而不是锁死或自由;急停响应必须在 10 ms 内切断动力。
还有一条容易被忽略:异常状态要有明确的退出路径。比如系统检测到相位识别置信度太低,不应继续硬算,而应该平滑切换到透明度模式(只做重力补偿,不给助力),让人自己走。突然切断助力和突然加大助力都危险,平滑过渡才是正解。
6.4 我个人踩过的几个坑
第一个坑是过分追求算法复杂度。我早期用了一套比较重的模型预测控制,跑在样机上效果不错,但每次改一个参数就要重新整定一堆东西,迭代速度极慢。后来换回分层结构加简单阻抗控制,效果没差多少,但迭代快了好几倍。复杂算法留给确实需要它的场景,大部分助力场景,好的相位识别加合适的前馈就已经够用。
第二个坑是忽视数据记录。调试期如果没把关键信号(相位、力矩指令、实际力矩、延迟)同步记录下来,出问题只能靠猜。后来我加了一个 1 kHz 的环形缓冲,出问题时一键导出,排查效率完全不同。
第三个坑是过早穿到人身上测。控制逻辑没在悬空台架上稳定之前,不要让人穿。我见过为了赶进度提前上人的团队,结果一次参数失误就让测试者受了伤,项目直接延期三个月。安全永远排在进度前面。
最后分享一个我自己一直在用的小方法:给每个穿戴者都建一份"人机档案",记录他的标定参数、助力曲线、每次测试的主观感受评分。下一次调试时直接调用历史参数做起点,能省掉大量重复劳动。外骨骼这类设备,个体差异带来的影响比想象中大得多,把人的因素当成系统的一部分来管理,比单纯优化算法更能提升最终体验。