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

Microduck 背隙仿真:2 度的齿轮间隙,差点毁掉整个 sim2real

Build in Public admin 2小时前 4次浏览 已收录 扫描二维码

Microduck 的背隙(Backlash)仿真:为什么 2 度的齿轮间隙,差点毁掉整个 sim2real

Meta Description: 一个 25cm 的小鸭子,14 个舵机关节,每个关节里藏着 ±1° 的齿轮背隙。仿真里不加它,策略在真机上就是站不稳。拆解 Microduck 的 Backlash 建模:被动铰链、穿过背隙的观测读取、以及为什么奖励和动作维度一个都不用改。


第一次在真机上把训好的 Duck 放上桌,它没摔。但也没站稳——脚尖一直在抖,像在踩一块看不见的棉花。我们盯着 MuJoCo 里那个站得笔直的影子,怎么也想不通:仿真里明明稳如老狗,怎么一上真机就变了个人?

后来才明白,问题根本不在策略。在那个 25cm、800g 的小身板里,藏着 14 个舵机的机械真相:每一个关节都有齿轮间隙。仿真里那根”刚体连杆”,在真机上其实是松的。

这就是背隙(backlash),RL 仿真里最容易忽略、却也最能坑人的东西。

先搞清楚:背隙到底是什么

背隙就是齿轮啮合时齿与齿之间那点空隙。电机反转的时候,齿轮要先吃掉这段空隙才能带动输出轴。等你真机转到一个精确角度,命令是到了,可执行端还差着那 1°。

单个看,±1° 好像无所谓。但这是每帧 50Hz 的控制循环,叠加 14 个关节,再加上 PPO 策略对观测噪声本来就敏感——这点松,足够让一个”让身体躺在地上的驱动模型”直接翻车。

官方的解法很 Direct:给每个关节单独建一个 Backlash 任务。任务 ID 里插一个 -Backlash,比如 Mjlab-Velocity-Flat-Backlash-MicroDuck,训练时就跑在”带 2° 总间隙”的模型上。

关键设计一:背隙不是改参数,是加关节

大多数人的第一反应是给关节加个随机噪声糊弄过去。官方没这么干。

他们把背隙做成了一根真正的铰链。在 MJCF 模型里,每个舵机后面串一个 unactuated 的 passive__backlash hinge——一根没有驱动器、纯粹物理模拟的被动旋转副。±1° 的间隙就是这根铰链的行程。

为什么要这么较真?因为齿轮间隙不是噪声,是有方向、有动力学的东西。电机反转时它会瞬时空转,负载变化时它会跟着动。纯随机噪声模拟不出这种”方向相关的死区”,而一根真实铰链能。

关键设计二:观测要”穿过”背隙读

这里有个非常容易被绕进去的细节。

Microduck 的编码器装在输出侧——也就是背隙铰链的后面。这意味着真机看到的关节位置,是 qpos[servo] + qpos[backlash],命令到达输出端的真实角度,包含了那段未吃掉的间隙。

所以官方的固件 PD 仿真 BacklashEncoderBamActuator,以及 joint_pos/joint_vel 观测,全都是穿过背隙读的。仿真里观测和真机观测对上了,policy 学到的增益才迁移得过去。

这个取舍很聪明:观测和动作维度一个都没变。所以 ONNX 导出不用改,runtime 不用改,热切换不用改。背隙变成了纯环境层的东西,对上层策略完全透明。

为什么 61 维观测是这一切的基础

所有背隙变量能这么优雅地塞进去,靠的是一个底层设计:跨所有策略共享的 61 维观测契约。

48 维是本体感受(proprioception),剩下的就是命令位:[twist(3), head_pose(4), body_pose(6)]。哪个任务不用某个命令槽,就把它补零,而不是删掉。

正是因为每个策略都读同一套 61 维,Microduck 才能在真机上热切换 walk / recover / trick 任意一个策略。背隙建模只是在这个统一契约上又加了一层机械真实,不破坏规矩。

我们的复刻踩坑

复刻阶段我们一开始偷懒,直接用了官方不带背隙的模型训。训出来的策略在仿真 viewer 里溜达得风生水起,一上真机就露馅。

查了半天,最后是把 *_backlash.xml 的生成脚本 add_backlash.py 跑起来,换成带背隙的模型重训。同样的步数,策略在真机上的抖动肉眼可见地少了——不是消失,是”性感地稳住了”。

这轮的教训很朴素:sim2real 的差距,很大程度上是执行器保真度的差距。这个尺度的机器——小舵机带 800g 的身板——执行器建模几乎就是 gap 的全貌。BAM 模型已经精确到了电压控制律、反电动势、库仑/Stribeck 摩擦,背隙是最后一块拼图。

小结

如果你也在训小机器人,记住三点:

一,背隙不是噪声,是带方向和动力学的真实铰链,值得用真铰链来建模。

二,观测和真机要同侧——编码器在输出侧,观测就穿过背隙读,别自己脑补一个”理想角度”。

三,全链路都用统一的观测契约,让机械细节成为环境层的事,别让它污染策略导出和部署。

仿真里那个站得笔直的鸭子没有骗你。它只是没见过真机的齿轮。


参考来源:Pollen Robotics 官方 microduck_rl 仓库(README、backlash.py、friction_dr_bam.py、mdp.py、CLAUDE.md);microduck 官方仓库(架构文档 docs/design/architecture.md)。数据与架构细节均取自官方源码,未编造任何数字。

喜欢 (0)赏
[🍬谢谢你请我吃糖果🍬🍬~]
分享 (0)
关于作者:
少将,关注Web全栈开发、项目管理,持续不断的学习、努力成为一个更棒的开发,做最好的自己,让世界因你不同。