YouDuck.ai

齿隙建模,以及编码器在哪一侧

最后更新

**齿隙(backlash)**是齿轮传动中的空程——换向时,输入端要先转过一小段角度,输出端才开始动。

microduck_rl 的每个主任务都有一个 Backlash 双胞胎,在 14 个舵机关节上各串联 ±1°(总计 2°) 的间隙:

Mjlab-Velocity-Flat-Backlash-MicroDuck

用法是在任务 id 里 MicroDuck 前面插入 -Backlash

关键在编码器的位置

这是最容易做错、也最值得学的一点。

真实机器人的编码器装在齿隙的输出侧

所以仿真必须匹配这个结构。官方实现做了两件事:

  1. 每个舵机加一个非驱动passive_<joint>_backlash 铰链
  2. 固件 PD 模拟(BacklashEncoderBamActuator)和 joint_pos / joint_vel 观测都透过齿隙读取,即 qpos[servo] + qpos[backlash]

建模在错误一侧会怎样

如果把编码器建模在齿隙的输入侧,策略会以为自己精确知道关节位置。而真机上它读到的是齿隙之后的值。

这个差异有一个很不友好的性质:静态时看不出来,换向时集中爆发。机器人站着不动一切正常,一开始走路就出问题——而你会去怀疑步态策略,而不是怀疑观测。

一个工程上的好处

观测维度和动作维度都不变,所以 ONNX 导出和机上运行时完全不需要改动。带齿隙训练的策略和不带齿隙的可以直接互换。

实现见 src/mjlab_microduck/tasks/backlash.py