• 欢迎访问少将全栈,学会感恩,乐于付出,珍惜缘份,成就彼此、推荐使用最新版火狐浏览器和Chrome浏览器访问本网站。
  • 吐槽,投稿,删稿,交个朋友
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏少将全栈吧

Microduck 的 BAM 执行器建模:为什么 XL330 的摩擦学决定了 sim2real 的成败

Build in Public admin 52分钟前 3次浏览 已收录 扫描二维码

800 克的双足机器人,15 个舵机,要在仿真里学会走路再迁移到真机。听起来最大的挑战是 RL 算法?是奖励函数?其实都不是。Pollen Robotics 的工程师在 microduck_rl 仓库里写了一句话,基本上是整个项目的核心判断:在这个尺度上——微型舵机驱动一个 800 克的双足——执行器的保真度就是 sim2real 鸿沟的大部分。

他们用的工具叫 BAM,全称 Better Actuator Models,由 Rhoban 实验室开发,2025 年发表在 ICRA 上。这篇文章拆解 Microduck 怎么用 BAM 建模 Dynamixel XL330,以及为什么这一步做不好,整个 sim2real 链路就废了。

Coulomb 摩擦模型为什么不够用

MuJoCo、IsaacGym 这些仿真器默认的摩擦模型是 Coulomb-Viscous。说白了就是:摩擦力等于一个常数乘以正压力,再加上一个跟速度成正比的项。这在工业级大电机上大概够用,但在 XL330 这种微型舵机上会出大问题。

真实的舵机摩擦不是一条直线。它有 Stribeck 效应——低速时摩擦力反而更高,然后随着速度增加先降后升。它有负载依赖——你给关节加的载荷越大,摩擦力不是线性增长而是有个二次项。它还有 back-EMF——电机转动时产生的反电动势会实际降低你施加的控制电压。

BAM 的论文(Duclusaud et al., ICRA 2025)把这些现象统称为”extended friction”,核心贡献就是一套从真实轨迹数据拟合这些复杂摩擦模型的流程,以及一个现成的模型库。目前库里有 Dynamixel MX-64、MX-106、XL-320、XL330-M288-T、eRob80:50、eRob80:100 和 Feetech STS3215。

Microduck 用的那个 XL330 模型

Microduck 的 15 个舵机全是 Dynamixel XL330-M288-T。在 microduck_rl 里,BAM 为这个舵机建了一个 M6 级别的模型,包含以下物理特性:

  • 电压控制律:不是理想的力矩输出,而是模拟真实 PWM 驱动下的电压-电流-力矩关系
  • Back-EMF:电机转速越高,反电动势越大,实际加在绕组上的电压越低
  • Coulomb/Stribeck 摩擦:静摩擦 > 动摩擦,低速区有 Stribeck 负斜率段
  • 负载依赖摩擦:摩擦力不是常数,跟关节承受的力矩相关

代码层面,这些全封装在 FrictionDRBamActuator(位于 src/mjlab_microduck/actuator/friction_dr_bam.py)。名字里的 DR 是 Domain Randomization——同一个 BAM 模型,每个仿真环境实例会被随机扰动几个参数:电池电压、电压 sag(负载下的压降)、命令延迟、摩擦系数幅度。

这意味着 4096 个并行环境里,没有两只鸭子的舵机表现完全一样。策略必须对这整个参数分布鲁棒,而不是过拟合到一组标称参数。

电压控制 vs 力矩控制:为什么这一步很关键

大部分机器人仿真里,你给关节一个目标力矩,仿真器就施加那个力矩。但 XL330 不是力矩控制模式——它接收的是电压指令,经过内部 PWM、电流环、电机绕组,最终输出的力矩受 back-EMF 和电阻压降影响。你给同一个电压指令,关节转速 0 和转速 500 rpm 时输出的力矩是不一样的。

BAM 的建模方式不是在 MuJoCo 里加一个摩擦补偿器,而是把整个执行器从电压输入到力矩输出的传递函数都建出来。MuJoCo 的 actuator 定义里用的是 general 类型,gainprm 和 biasprm 配置成电压控制律的参数,摩擦通过 FrictionDRBamActuator 在每一步动态叠加。

这跟直接用 MuJoCo XML 里的 PD 控制器有本质区别。microduck_rl 的 infer_policy.py 有个 --no-bam 参数可以回退到 XML PD 执行器,用于对比。结论很明确:去掉 BAM,sim2real 直接失败。

域随机化怎么包在 BAM 外面

Microduck 的域随机化不是通用噪声。它随机化的四个参数都跟执行器物理直接相关:

  • 电池电压:满电 7.4V vs 低电量 6.0V,直接影响舵机最大输出力矩
  • Voltage sag:大电流时电池端电压会瞬间跌落,模型里模拟了这个 sag 的增益系数
  • 命令延迟:控制指令从生成到执行器实际接收的延迟,模拟通信链路的 latency
  • 摩擦幅度:BAM 模型的摩擦系数乘以一个随机缩放因子,覆盖个体差异和磨损

infer_policy.py 里的 --vin、--vin-drop-gain、--kp-fw 三个参数可以把训练时的 DR 范围固定到单一值,用于验证”标称条件下策略表现”。但正式训练永远开着 DR。

这种设计思路值得注意:域随机化不是往观测里加高斯噪声,而是对执行器的物理参数做结构化扰动。噪声模型本身有物理意义,不是超参数调出来的。

从 BAM 到 ONNX:一个完整的 sim2real 链路

BAM 建模 → 域随机化训练 → PPO 优化 → ONNX 导出 → 真机部署。这条链路里,BAM 是最底层的环节,也是最容易被忽视的。

Microduck 的做法值得每个做 sim2real 的人参考:不要假设仿真器的默认执行器模型够用。你的机器人越小、舵机越便宜、载荷越接近极限,执行器非线性对策略的影响就越大。XL330 一个舵机才几十美元,它的摩擦特性比一个几千美元的谐波减速器复杂得多——因为廉价舵机的加工精度低,齿轮间隙大,摩擦的随机性更强。

BAM 的价值在于把这件事标准化了。你不需要自己写摩擦辨识实验、自己拟合 Stribeck 曲线。Rhoban 已经替常见舵机做了一遍,模型开源,API 直接对接 MuJoCo CPU 和 MuJoCo Warp。Microduck 用的是现成的 XL330-M288-T 模型,开箱即用。

一个被低估的工程决策

回头看 Microduck 的技术栈选择,BAM 不是唯一选项。你可以用 MuJoCo 的 muscle actuator 类型近似,可以自己写个 MATLAB 辨识脚本导参数,甚至可以暴力调域随机化的范围让它”差不多”。Pollen 选了 BAM,意味着他们接受了一个判断:sim2real 的瓶颈不在算法层,而在物理建模层。

这个判断跟学术界近几年的趋势一致。2024-2025 年 ICRA 和 CoRL 上一大批 sim2real 论文都在往执行器建模这个方向投入,而不是继续调 PPO 的超参数。当你花两周时间调学习率没效果的时候,可能问题根本不在 RL——在执行器模型。

Microduck 把这条经验做进了开源仓库里。你想复刻,不需要从零开始建摩擦模型。装 BAM,配 XL330 的 M6 模型,开域随机化,训。sim2real 的门槛,被这个工程决策降低了一大截。

来源:

  • microduck_rl 仓库:github.com/pollen-robotics/microduck_rl
  • BAM 项目:github.com/Rhoban/bam
  • BAM 论文:Duclusaud et al., “Extended Friction Models for the Physics Simulation of Servo Actuators”, ICRA 2025
  • Microduck 官方:pollen-robotics.com/microduck
喜欢 (0)赏
[🍬谢谢你请我吃糖果🍬🍬~]
分享 (0)
关于作者:
少将,关注Web全栈开发、项目管理,持续不断的学习、努力成为一个更棒的开发,做最好的自己,让世界因你不同。