YouDuck.ai

バックラッシュと、エンコーダがどちら側にあるか

最終更新

バックラッシュは歯車伝達の遊びです。反転時、出力が動き出す前に入力側が少し回ります。

microduck_rl の各主タスクには、14 のサーボ関節それぞれに ±1°(合計 2°) の遊びを入れた Backlash の双子があります。

Mjlab-Velocity-Flat-Backlash-MicroDuck

タスク id の MicroDuck の前に -Backlash を挿入します。

要点はエンコーダの位置

ここが間違えやすく、最も学ぶ価値のある部分です。

実機のエンコーダは遊びの出力側にあります。

したがってシミュレーションもその構造に合わせる必要があります。公式実装は 2 つのことをしています。

  1. 各サーボに非駆動passive_<joint>_backlash ヒンジを追加する
  2. ファームウェアの PD エミュレーション(BacklashEncoderBamActuator)も joint_pos / joint_vel の観測も、バックラッシュを通して読む(qpos[servo] + qpos[backlash]

間違った側にモデル化すると

エンコーダを入力側にモデル化すると、ポリシーは関節位置を正確に知っていると信じ込みます。実機で読んでいるのは遊びの後の値です。

この差には厄介な性質があります。関節が静止している間は見えず、反転した瞬間にまとめて出るのです。ロボットは立っている間は正常で、歩き始めた途端におかしくなる——そして人は観測ではなく歩容ポリシーを疑いに行きます。

工学上の利点

観測次元も行動次元も変わらないため、ONNX の書き出しも実機のランタイムも一切変更が要りません。バックラッシュ有りで学習したポリシーと無しのものは、そのまま入れ替えられます。

実装は src/mjlab_microduck/tasks/backlash.py