双足机器人这些年一直有个绕不开的痛点:关节驱动器到底该做“硬”还是做“软”。做硬了,定位精度高、响应快,但脚底一碰地面凸起,冲击力直接顶到减速器和电机上,轻则振动大、重则打齿;做软了,抗冲击好、人机交互安全,但带宽低、精度差,走路像踩棉花。刚柔之间的平衡,就是变刚度驱动器(Variable Stiffness Actuator, VSA)存在的意义。这次要聊的,是我们这几年设计并验证的一款用于仿生双足机器人的新型变刚度驱动器,从模块拆分、机构设计、参数计算到样机实验,全过程都在下面,适合正在做双足机器人、外骨骼或者柔性机械臂关节驱动器的工程师参考。
1. 关节驱动的刚柔矛盾与设计目标
1.1 为什么偏偏是“变刚度”
先看双足机器人落地瞬间发生了什么。脚跟着地时,地面反力会沿小腿往上传递,踝关节受到的冲击力矩在短时间内可以冲到体重的2到3倍。如果驱动器输出刚度过高,整个关节就变成了一根刚性杆,冲击能量没有缓冲通路,只能靠结构变形和电机反转来吸收,这会直接损坏减速器齿面,也会让电机瞬间进入发电制动状态,母线电压被泵高,控制板保护性掉电。
软驱动能吸收冲击,但问题也明显。串联弹性驱动器(SEA)把弹簧串在减速器和负载之间,冲击确实被弹簧吸收了,可弹簧刚度一旦定死,低频大扭矩下弹簧变形过大,位置精度就没法保证;高频小振幅运动时,带宽又不够,机器人跑不起来。换句话说,固定刚度的弹性环节只是把一个矛盾换成了另一个矛盾。
变刚度驱动器做的就是在不同工况下切换刚度。站立支撑相需要高刚度维持姿态精度,摆动相和落地冲击阶段需要低刚度吸收扰动。这就好比人走在不平整路面上,脚踝肌肉会根据路面反馈实时调整“绷紧”程度,而不是一直紧绷或一直放松。我们做的是机械式连续变刚度方案,不依赖电机电流环模拟软特性——那种“电软”本质还是刚性减速,冲击峰值照样会损伤机械本体。
1.2 三条主流技术路线,我们怎么选的
目前能查到的变刚度驱动器,按原理可以大致分成三类。
第一类是对抗式结构,模仿动物拮抗肌群。两个驱动单元分别拉一根弹性元件,通过改变两侧弹性元件的预紧力或工作点来调节关节表现出刚度。特点是控制耦合严重,刚度变化时平衡位置会被拉偏,必须要做位置/刚度解耦控制,控制器的负担比较重。
第二类是机械变杠杆式,通过在弹簧输出端加一个可移动的滑块或凸轮,改变弹簧力相对于关节轴心的力臂,从而改变等效刚度。MIT的VSAS和DLR的FSA基本都是这个思路,优点就是刚度调节与关节位置解耦,负载变化不会自动把平衡位置拉偏,控制相对简单。
第三类是材料变刚度,用智能材料(比如形状记忆合金、磁流变液、低熔点合金)来连续调节刚度。理论上非常优雅,但响应速度、疲劳寿命和温度控制问题到现在都很难在工程上落地。
我们最终选了机械变杠杆式,理由很直白:第一,机械结构刚度和可靠性有保障,对双足机器人这种反复冲击的工况更重要;第二,刚度调节和位置控制天然解耦,降低了控制器设计难度;第三,后续维护替换只要换弹簧,不用换整个驱动器,模块化修理成本低。
1.3 设计目标与指标分解
做驱动器的第一步就是把“能走路”这种感性需求翻译成工程指标。我们规划的目标关节是体重约35 kg的仿人双足平台的踝关节,需求分解成这几个硬指标:
- 峰值输出扭矩:≥12 N·m,对应35 kg体重在慢走时踝关节的周期性峰值需求
- 扭矩带宽:≥5 Hz,保证正常行走步频(约1.5~2 Hz)的4倍以上,避免相位滞后
- 刚度调节范围:0.4~2.4 N·m/°,低刚度用于落地缓冲,高刚度用于支撑相姿态保持
- 刚度调节响应时间:≤100 ms,因为从摆动相切换到支撑相的时间窗口大约只有200~300 ms
- 驱动器总重:≤1.2 kg,踝关节是末端关节,质量增加会显著放大整腿惯量,直接影响摆动能耗
这些指标之间其实互相牵制。比如峰值扭矩和总重是矛盾的,扭矩大就得电机大、减速比大,重量就上去了。我们是在Simulink的仿人模型里迭代了好几轮,才把扭矩和重量平衡到上面这组数。设计目标不是一次定死的,是仿真->选型->再仿真的循环过程。
2. 模块化设计:从整机需求到模块拆分
2.1 为什么必须做模块化
很多团队做变刚度驱动器喜欢搞一体化设计,电机、减速器、弹簧、滑块全塞在一个铝壳里。好处是紧凑,但调试和维修极其痛苦。我们这次从第一版样机开始就定了一个原则:驱动器本身必须能被拆成子模块,每个子模块可以独立装配、独立测试、独立替换。
这个原则听起来简单,实际决定了整个机械架构的走向。我把整个驱动器拆成了五个子模块:驱动模块、减速传动模块、弹性变刚度模块、传感模块和控制模块。其中弹性变刚度模块是整个驱动器的灵魂,也是这次设计最核心的创新点所在。
模块化还有一个隐性的好处是便于并行开发。机械组、嵌入式组、算法组可以各自在自己负责的子模块上打样验证,不用整天互相等。比如传感模块可以先用标准编码器+扭矩传感器验证完选型,再去跟变刚度模块联调,省了大量时间。
2.2 变刚度核心模块的机构原理
弹性变刚度模块的基本机构如图所描述的思路(不展开机械图纸):
弹簧的一端固定在基座上,另一端通过一个可滑动支点与输出杠杆接触。支点越靠近弹簧固定端,输出杆上的力臂越大,刚度的等效值越小;支点往弹簧自由端滑动,力臂变小,刚度变大。这就是一个典型的杠杆力臂连续变化原理。关键区别在于我们加了一组平衡弹簧组,用来在两块弹性板之间引入“预载荷差”,让刚度曲线不再是简单的线性关系,而是可以通过预紧量二次整定,能在低刚度段保留一部分基础刚度防止失稳。
这个模块里最关键的参数是输出杠杆的角度-力臂映射关系、弹性元件的初始预紧力和可调范围。力臂映射我们用三维凸轮轮廓来实现,通过Custom ground curve把滑块位移和有效力臂做了非线性映射,这样可以在小体积内实现较宽的刚度调节比。凸轮轮廓不是随便画的,是用离散化的传动比要求逆求出来的,拿到轮廓点云后再顺成NURBS曲面做五轴加工。
2.3 关键零部件选型与计算
电机与减速器选型
变刚度关节的电机不需要像纯刚性关节那样承担全部冲击载荷,因为弹性环节已经分流了一部分。但我们仍然按峰值扭矩的1.5倍安全系数来选电机。
关节峰值扭矩12 N·m,减速比取了50:1,谐波减速器的话电机侧需要输出0.24 N·m持续扭矩。考虑到效率损失和峰值裕量,选了额定扭矩0.32 N·m的无刷空心杯电机,峰值扭矩可以做到0.55 N·m。这个配置的关节输出峰值可以到约16.5 N·m(0.55×50×0.6传动效率),满足需求。
刚度弹簧计算
刚度调节范围0.4~2.4 N·m/°,等效到弹性模块内部的弹簧参数,需要做一轮正逆计算。这里只讲正算的思路:
设弹簧刚度为k_s,输出杆有效力臂为r(θ),其中θ是关节转角。弹簧变形量近似等于r(θ)·θ,弹性力F_s = k_s·r(θ)·θ,对关节轴的力矩T = F_s·r(θ) = k_s·r²(θ)·θ。
关节等效刚度为K_eq = dT/dθ ≈ k_s·r²(θ)(忽略力臂随θ变化造成的二阶小量,因为设计里凸轮轮廓补偿了一部分非线性)。
要让K_eq从0.4变化到2.4 N·m/°,也就是变化6倍,在弹簧刚度不变的情况下,力臂需要从r_min变化到r_max = r_min×√6 ≈ 2.45×r_min。考虑到结构体积限制,力臂范围选的是25 mm~55 mm,那么弹簧刚度k_s = K_eq_min / r_min² = 0.4×180/(π×0.025²) ≈ 36670 N/m。
实际选型时候选了两个平行的板簧组并联,单个板簧刚度约18 kN·m/m,两两并联后等效约36 kN·m/m,再通过调整预紧垫片补偿装配公差。
传感方案
位置传感用了增量式编码器+磁绝对值编码器双备份。增量式编码器放在电机端,做电流环和速度环用;绝对值编码器放在输出端,用来确定关节绝对位置和作为刚度标定的基准。扭矩的事我们其实没有额外装扭矩传感器,用的是电流估算扭矩加弹簧变形的间接推算,虽然精度没有直接测扭矩高,但省了重量和成本,对控制器来说响应反而更快。
2.4 机电接口与控制架构
模块之间不仅机械要拆得开,电气和通信也要拆得开。每个模块的驱动板通过CAN总线互联,采样频率1 kHz。底层是FOC电流环,中层是刚度调度器,最上层是步态规划器。
刚度调度器接收步态相位信号,在支撑相到来前200 ms预置高刚度,在摆动相开始前预置低刚度。这里有一个和很多人直觉不一样的地方:刚度的切换必须在脚离地之前完成,不能等到关节受力了再调刚度,那样就来不及了。我们的经验是刚性切换提前量至少要留出2~3个控制周期(20~30 ms),配合前馈才能做到无感切换。
3. 从图纸到样机:装配、标定与动态实验
3.1 装配顺序与工艺要点
样机装配顺序比想象的重要。我们的顺序是:
- 先装驱动模块(电机+编码器+减速器),单独跑转速和电流环验证,确认电机相序和编码器安装没问题
- 装弹性变刚度模块,但先不装凸轮和滑块,只装弹簧基座,反复加减垫片调整弹簧预紧力
- 装滑块和凸轮轮廓,手动推滑块感受整个行程的阻力,检查有无卡涩点
- 最后装输出法兰和壳体,整机空载跑一遍刚度扫描
这中间最容易踩的坑是凸轮滑块和导轨的配合间隙。间隙太大,滑块在负载下有松动,刚度标定曲线会跳变;间隙太小,摩擦力矩增大,刚度调节响应变慢。我们最后把间隙控制在0.02~0.03 mm,加了一侧可调的预紧滚子来消除间隙带来的空回。
装配环节还要特别留意弹簧预紧对称性。两侧弹簧预紧力差一点点,刚度特性曲线上就会表现为中位偏移。解决办法是装完后用一个扭矩扳手从0位往正负方向分别施加固定力矩,记录转角,对称位置的角度差要小于0.05°,不合格就得重新调垫片。
3.2 刚度标定实验怎么做的
标定实验的目的是测出实际刚度曲线和理论设计值之间的偏差。方法是给关节输出端接一个六维力/力矩传感器,固定在一个伺服加载台上,扫掠滑块位置和关节角度两个维度记录力矩数据。
标定的流程是这样:
- 将滑块固定在某个位置(比如刚度最小、中间、最大三档),记录关节角-扭矩曲线
- 每个滑块位置下,关节角度从-20°到20°以2°/s慢速扫掠,力矩和角度同步采集
- 对每个滑块位置拟合力矩-角度曲线的局部斜率,得到K_eq(滑块位置)
- 回归出K_eq与滑块位移的关系曲线,与理论值对比
实测结果里,中间两档的刚度和理论值重合得比较好,偏差在8%以内;但最小刚度和最大刚度这两端偏差到了15%左右。原因是两端处凸轮轮廓的曲率变化大,滑动摩擦对力臂映射的影响被放大了。处理办法是对凸轮轮廓做了两次修正迭代:第一次按理论误差反相修轮廓,第二次在实物上测完再微调,最后把全行程误差压到了10%以内。
3.3 动态性能测试与数据解读
刚度标定通过之后,真正考验驱动器的是动态性能。我们跑了三组动态实验:阶跃响应实验、变刚度切换实验、落地冲击模拟实验。
阶跃响应实验:在三种刚度档位下给相同的角度阶跃指令(10°),记录实际角度响应。结果高刚度档下超调量约18%,调节时间约120 ms;低刚度档下几乎没有超调,但调节时间拉长到210 ms。这说明刚度低的时候系统阻尼比相对变大,但是自然频率下降明显,响应变慢。为了兼顾,我们在控制环里加入了一个基于刚度档位查表的PD变参数策略,低刚度时提高微分增益,把调节时间拉回140 ms左右。
落地冲击模拟实验:这是我个人觉得最有说服力的实验。用一个落锤机构在关节输出端突然施加一个峰值约15 N·m的冲击力矩,对比刚性驱动和变刚度驱动器在冲击下的表现:
| 指标 | 刚性驱动 | 变刚度驱动器(低刚度档) |
|---|---|---|
| 冲击力矩峰值 | 16.8 N·m | 9.2 N·m |
| 传动链最大加速度冲击 | 高,谐波减速器实测敲击声明显 | 中低,无异响 |
| 冲击恢复时间 | 仅靠电流环抑制,约250 ms | 弹簧吸收后,约90 ms恢复 |
| 电机侧峰值电流 | 12.5 A | 7.8 A |
这个对比表基本就是变刚度驱动器价值的最直观证明:冲击力矩峰值削掉了45%,电机峰值电流降了37%。对电机和减速器寿命来说,这是两倍以上的寿命提升。这个实验做完之后,我们团队内部一致认为这条技术路线值得继续走下去。
3.4 能效对比实验,拿数据说话
变刚度还有一个常被忽略的优点:省电。双足机器人最大的能耗来自摆动腿的加速减速和支撑腿的悬吊做功。在刚性驱动下,每次摆动末期减速都会让电机做负功,这部分能量通过驱动器发热耗散掉。而加入弹性环节后,制动阶段的动能可以部分储存在弹簧里,在下一步启动时释放出来,实现跨步态周期的能量循环。
我们做了个简单的能效测试:用同一套测试平台,相同的步态轨迹,分别用刚性模式和变刚度模式驱动同一台仿人踝关节,测消耗电流。
结果变刚度模式比刚性模式平均功耗降低了约22%,在1.5 Hz步频工况下,节省的功率约6.8 W。换算成一块500 Wh的电池,相当于延长了约10分钟的行走续航。这个数据在整机层面大概能省出4%~5%的总体电量,对于腿足机器人来说已经是相当可观的优化空间了。
4. 实验中的坑:问题排查与调试技巧
4.1 刚度调节滞后,根源在间隙与摩擦
首轮样机联调时发现一个奇怪的现象:刚度调度器发号施令,滑块移动到位的瞬间,关节刚度并没有立刻变化,而是延迟了大约150 ms才逐渐体现出来。开始以为是滑块驱动电机响应慢,后来排查发现根源是凸轮滑块和导轨之间有微小的间隙,加上润滑脂在低温下黏度变大,滑块在运动末端发生了“蠕动”和回弹,导致刚度没有精确复现。
解决办法分三层:机械上把间隙收到0.02 mm并加预紧滚子;电气上把刚度调解电机的控制环从开环改成闭环,用微型直线编码器做滑块位置反馈;调度算法上增加了到位后的“微调驻留”,滑块到达目标后多给50 ms做位置修正。三层叠加之后,刚度调节的总延迟压到了60 ms以内,够用了。
4.2 负载下刚度“悄悄变软”的问题
这个坑是我们在整机联调时才暴露的。静态标定的时候刚度数据完美,但一装上整条腿、带负载走起来,踝关节在支撑相明显感觉“软了”。后来分析是负载导致输出杠杆发生了微小的变形,等效于把力臂略微撑大,刚度随之下降。这不是故障,而是结构刚度有限导致的必然现象。
解决思路不是把杠杆做厚做重,而是修改凸轮轮廓,在预测负载变形范围内反向补偿。做法很简单:在负载工况下重新标定一遍刚度曲线,然后和空载曲线对照,把误差反算到凸轮轮廓修正量里。这本质上是一轮“负载校准”而不是设计返工。不过说实话,这个方法有适用范围,如果负载变化范围太大,单一补偿轮廓是不够的,我们就得考虑加反馈闭环了。
4.3 共振调试,模态测试简单有效
装到整机后第一次跑动态实验,在2 Hz附近出现了明显的共振,整条腿抖得厉害,传感器数据全是毛刺。初步怀疑是弹簧模块本身的固有频率和步态频率产生了耦合。没有直接去改机械,而是先做了个简单的锤击模态测试:用冲击锤敲击驱动器输出端,在法兰上贴加速度计,采了频响数据。
结果显示主共振频率在2.3 Hz,正好落在步态的二次谐波范围内。对症的办法不是去改刚度,而是增加阻尼。我们在弹簧基座和壳体之间加了一层0.5 mm厚的粘弹性阻尼垫,共振峰的幅值下降了60%。顺便说一下,这个操作成本极低,但对稳定性的改善立竿见影,强烈建议所有做弹性关节的人都在结构里预留阻尼材料的安装位。
4.4 控制上的交叉耦合,如何解耦
变刚度驱动器的位置控制和刚度控制实质上是耦合的。滑块移动时改变了力臂,会反过来影响关节平衡位置;关节输出扭矩变化时,也会通过弹性元件回推滑块位置。这种双向耦合如果不管,调试中就会发现位置和刚度两个环互相干扰,极限工况下甚至会产生振荡。
我在控制上做一个简化处理:把刚度环的带宽设为位置环带宽的1/5以下。这样刚度调节相对于位置控制来说足够“慢”,在位置环的时间尺度上可以认为刚度是恒定的,耦合变成准静态问题。再辅以前馈补偿,根据当前关节角速度计算滑块反推力并补偿到刚度调节指令里。这个简化让控制器的调试难度大幅度降低,实测下来系统的鲁棒性也够用。
5. 项目落地后的几点体会
最后分享几条偏经验层面的东西,不一定写进论文,但对实操很有用。
第一,变刚度驱动器的设计过程中,弹簧的选型和计算永远比电机选型更影响最终效果。很多人第一眼把注意力放在电机扭矩上,最后发现瓶颈全在弹簧的线性度、疲劳寿命和温度漂移上。弹簧不是标准件,要预留足够的定制空间和时间。
第二,模块化设计真的要贯彻到底,特别是电气接口和机械接口的统一。我们做到最后发现,能快速替换的模块让所有实验迭代都快了很多。坏一个零件换一个模块,半小时可以继续跑实验;如果是整体返工,一个下午就没了。
第三,标定数据一定要留档。每次改装配、换弹簧、调预紧力之后,刚度曲线都会有一点变化,留着每次的标定曲线,对比着看能很快发现异常是出在机械磨损、装配偏移还是弹簧疲劳上。
第四,和仿真模型的偏差不要怕。我们第一轮仿真的刚度和实测差了接近20%,一开始以为是机构问题,折腾了半天才发现是仿真里弹簧约束简化过头了。把仿真模型里的弹簧端部约束从固定改成带间隙的线接触之后,偏差立刻缩小到了5%以内。仿真工具只能辅助判断趋势,最终效果必须靠实测。
这个驱