齿隙建模,以及编码器在哪一侧
最后更新
**齿隙(backlash)**是齿轮传动中的空程——换向时,输入端要先转过一小段角度,输出端才开始动。
microduck_rl 的每个主任务都有一个 Backlash 双胞胎,在 14 个舵机关节上各串联 ±1°(总计 2°) 的间隙:
Mjlab-Velocity-Flat-Backlash-MicroDuck
用法是在任务 id 里 MicroDuck 前面插入 -Backlash。
关键在编码器的位置
这是最容易做错、也最值得学的一点。
真实机器人的编码器装在齿隙的输出侧。
所以仿真必须匹配这个结构。官方实现做了两件事:
- 每个舵机加一个非驱动的
passive_<joint>_backlash铰链 - 固件 PD 模拟(
BacklashEncoderBamActuator)和joint_pos/joint_vel观测都透过齿隙读取,即qpos[servo] + qpos[backlash]
建模在错误一侧会怎样
如果把编码器建模在齿隙的输入侧,策略会以为自己精确知道关节位置。而真机上它读到的是齿隙之后的值。
这个差异有一个很不友好的性质:静态时看不出来,换向时集中爆发。机器人站着不动一切正常,一开始走路就出问题——而你会去怀疑步态策略,而不是怀疑观测。
一个工程上的好处
观测维度和动作维度都不变,所以 ONNX 导出和机上运行时完全不需要改动。带齿隙训练的策略和不带齿隙的可以直接互换。
实现见 src/mjlab_microduck/tasks/backlash.py。