バックラッシュと、エンコーダがどちら側にあるか
最終更新
バックラッシュは歯車伝達の遊びです。反転時、出力が動き出す前に入力側が少し回ります。
microduck_rl の各主タスクには、14 のサーボ関節それぞれに ±1°(合計 2°) の遊びを入れた Backlash の双子があります。
Mjlab-Velocity-Flat-Backlash-MicroDuck
タスク id の MicroDuck の前に -Backlash を挿入します。
要点はエンコーダの位置
ここが間違えやすく、最も学ぶ価値のある部分です。
実機のエンコーダは遊びの出力側にあります。
したがってシミュレーションもその構造に合わせる必要があります。公式実装は 2 つのことをしています。
- 各サーボに非駆動の
passive_<joint>_backlashヒンジを追加する - ファームウェアの PD エミュレーション(
BacklashEncoderBamActuator)もjoint_pos/joint_velの観測も、バックラッシュを通して読む(qpos[servo] + qpos[backlash])
間違った側にモデル化すると
エンコーダを入力側にモデル化すると、ポリシーは関節位置を正確に知っていると信じ込みます。実機で読んでいるのは遊びの後の値です。
この差には厄介な性質があります。関節が静止している間は見えず、反転した瞬間にまとめて出るのです。ロボットは立っている間は正常で、歩き始めた途端におかしくなる——そして人は観測ではなく歩容ポリシーを疑いに行きます。
工学上の利点
観測次元も行動次元も変わらないため、ONNX の書き出しも実機のランタイムも一切変更が要りません。バックラッシュ有りで学習したポリシーと無しのものは、そのまま入れ替えられます。
実装は src/mjlab_microduck/tasks/backlash.py。