复刻 Microduck 的人迟早撞上一堵墙:舵机。
官方清单里写的是 Dynamixel XL330-M288,一只在 Robotis 官方 e-Manual 里能查到完整规格的舵机。它 18 克、减速比 288.4:1、堵转扭矩在 5V 下 0.52 N·m、空载 103 rev/min,12 位绝对编码器(AS5601),PID 控制,一条 TTL 半双工串行总线能挂 253 个 ID。参数扎实,但价格对复刻项目不友好,而且采购周期在有些地区偏长。
于是国产替代几乎是必经路。但这里有个坑比”买到手装不上”更深:Microduck 身上那 9 个 ONNX 策略,绑定的是 XL330 的动力学参数。 你换了舵机,这些策略就只剩”参考价值”——想让鸭子真走起来,你得重做执行器辨识,甚至重训策略。
这篇讲清楚 BAM 辨识这摊事:六个阶段各测什么、单摆台架怎么搭、换了国产舵机后哪些参数必须重来。
先搞清楚 BAM 是什么
BAM(Better Actuator Models)是 Rhoban Lab 提出的一个执行器建模框架,专门解决 sim2real 里”仿真舵机和真实舵机对不上”的问题。它的核心是把一个伺服舵机的动力学拆成 6 个独立阶段,每个阶段有自己可辨识的参数:
- M1 电机参数:反电动势系数 Kv、电阻、转矩常数 Kt。决定”给多少电压电流,马达出多少扭矩”
- M2 粘性摩擦:与速度成正比的阻尼项
- M3 库仑摩擦:与速度无关、方向相关的恒定摩擦
- M4 静摩擦:从静止到运动”打破”所需的最小力
- M5 反向间隙:齿轮啮合里的空程。换舵机最容易忽略的一项,直接导致步态里的”咔哒”抖动
- M6 弹性变形:负载下齿轮和输出轴的柔性
microduck_rl 仓库里把这些参数定义在 microduck_constants.py,对应的是 XL330 的出厂值。官方策略就是在这组参数上训出来的。你换成飞特 HL 系列,M1 到 M6 基本全对不上——不是”差一点”的问题,是量级都可能不对。
换舵机为什么必须重测,而不是直接抄参数
很多人问:BAM 参数不就是几个摩擦系数吗,抄 XL330 的然后微调不就行了?
不行。因为这几个参数之间有强耦合,而且是物理量纲。我给你捋一遍换了舵机会发生什么:
M1 电机参数直接受舵机品牌影响。 XL330 用的是 Cored(有刷)马达,官方 e-Manual 明确标了它 5V 下 1.47A 电流、0.354 Nm/A 的转矩常数。国产直流舵机马达绕线、磁钢磁通密度、减速比都不同,Kv 和 Kt 就没有可比性。你拿 XL330 的 M1 参数去驱动一个不同马达,仿真里”给这个扭矩”在真机上根本没这回事。
M5 反向间隙是国产舵机最需要盯的。 XL330 的齿轮是工程塑料,官方标 288.4:1 减速比,齿隙控制得不错。不少国产舵机为了降本,齿轮精度和材料有妥协,反向间隙可能大 2-3 倍。这在普通航模上无所谓,但在双足步态里是要命的——每步落地换向都在抖。
M4 静摩擦和 M6 弹性变形决定步态启动和负载响应。 启动时的静摩擦大了,策略感觉到”指令到了但关节没动”,波动会放大;弹性变形大了,输出轴在负载下”拧着走”,位置闭环的刚度就假了。
结论很直接:换舵机,BAM 六个阶段参数一个都别想省,必须基于你手里那一批真实舵机重测。
单摆台架:怎么测出 M1-M6
你不需要昂贵的测功机。BAM 辨识的核心装置是一个单摆台架——把一个已知质量的摆臂固定在舵机输出轴上,让舵机带动摆臂运动,同时记录编码器角度、速度、电流和温度。录下来这些时序数据,就能反向拟合 M1-M6。
实操节奏(microduck_rl 文档和社区共识)大致是:
- 先做 PING 和基线。确认舵机总线参数(波特率、ID、返回延迟),跑通闭环小步幅,确认舵机本身正常。这一步排掉”舵机是坏的”这种低级坑
- M1 辨识:给舵机开环电压阶跃,记录速度响应,拟合反电动势和马达时间常数。做多次取平均,排除个体偏差
- M2/M3/M4 摩擦项:让摆臂以不同速度匀速摆动,测维持匀速所需的力矩,拟合速度-扭矩曲线。低速段往静摩擦靠,高速段往粘性摩擦靠
- M5 反向间隙:用位置阶跃在零点附近来回小角度摆动,测”指令反向但输出暂不动”的角度死区
- M6 弹性变形:锁住输出轴,加递增负载测偏转角,画扭矩-形变曲线
关键是抽样不止测一只。同一型号不同个体,摩擦和间隙会有散布。官方训练对”一致性”有要求——你至少抽 5 只同型号舵机测,确认这批的一致性达标,再决定用哪组参数喂给训练。
换舵机后,策略要不要重训
这是被问得最多的问题。答案是:大概率要。
按 microduck_rl 的流程,官方 9 个 ONNX 策略绑定 XL330 的 BAM 参数。你换了舵机后,策略在真机上的表现取决于两件事:
- 如果新舵机的动力学和 XL330 特别接近(比如就是同规格、齿隙也小),可能勉强能走,但步态会抖、会容易摔
- 更常见的是差得明显:策略在仿真里”知道” XL330 的静摩擦和齿隙,真机换了个 M5、M6 都不同的舵机,策略直接懵圈
所以正确的复刻路径是:BAM 辨识 → 把新参数写回 microduck_constants.py → 冒烟测试(64 环境 5 迭代)→ 正式训练(4096 环境)→ ONNX 导出 → 真机验证。这个完整流水线我上一篇拆过,这里不再展开——重点是你得先把 BAM 参数这关过了,后面才有意义。
好消息是,训练本身不慢。4096 并行环境在 RTX 4090 上 1-2 小时能出一个能走的步态。瓶颈从来不在训练算力,而在 BAM 辨识的测量环节——那才是实打实要花一两周的地方。
对复刻者的一句实在话
国产替代不是”低配版”,而是”要重新校准的另一套系统”。XL330 之所以被官方选中,除了性能,还有它文档极其完整——e-Manual 里每个参数都有据可查,这对 sim2real 的模型辨识是巨大的资产。国产舵机的优势是价格和供应链,但它的代价是:你得自己把 M1-M6 测出来,替官方把”缺失的文档”补上。
如果你已经在复刻路上,我的建议是:舵机统一、批次一致、至少抽测 5 只、台架数据存档。把辨识当成一次性的工程投入,而不是”换好了就完事”。因为一个 BAM 参数对不上的鸭子,会在你满心期待它站起来的时候,扑通一声脸朝地。
数据来源:
- ROBOTIS. Dynamixel XL330-M288 官方 e-Manual(规格:18g、288.4:1、5V 下 0.52 N·m/103 rev/min、12-bit AS5601 编码器、PID、TTL 半双工总线)。EMANUAL.ROBOTIS.COM.
- Pollen Robotics. microduck 仓库. README(约 25cm/800g、RK3566、50Hz 控制循环、15 个舵机、ONNX 策略)。GitHub.
- Pollen Robotics. microduck_rl 仓库. microduck_constants.py, CLAUDE.md(BAM 参数定义、冒烟测试与训练流水线)。GitHub.
- Rhoban Lab. BAM: Better Actuator Models for Sim-to-Real Transfer. ICRA 2025.
- 复刻项目进度记录: duck.whatled.com.
