notes
Tools

MuJoCo でオムニ/メカナムの横滑りを表現する

MuJoCo の native 接触摩擦は等方なのでローラーの「軸方向に自由」を表現できない。回転だけ動いて並進で自転する症状と、plugin による対処

要点#

MuJoCo の接触摩擦は接地面内で等方 (係数 1 つ)。オムニ/メカナムの横方向自由は native では作れない。接地力を自前 (plugin) で計算するか、ローラーを body として作る。

症状 (3 輪オムニ、native 摩擦 μ=1.0)#

  • 純回転 (wz): 3 輪とも転がり方向だけで済むので正常に回る
  • 純並進 (vx): 各輪は目標速度に追従するのに chassis はほぼ動かず、自転する
    • 実測: 3 輪 fb (+0.47, −0.22, −0.22) m/s に対し chassis v_x 0.03 m/s、wz −0.5 rad/s
    • 転がり方向が指令方向から 60° ずれた 2 輪が横方向摩擦でロックされ、自由に転がる 1 輪の力だけが残るため
  • 縦横の摩擦係数を分けて書いても効かない。friction="1.0 0.05 0.001" の 3 値は sliding / torsional / rolling で、sliding は面内等方

対処#

  1. 接地力を計算する plugin を車輪ごとに置き、横方向の摩擦係数を 0、縦方向だけ有限にする
  2. wheel geom の native 摩擦を小さくする (例 0.02)。接触自体は残す (法線力は MuJoCo から取る)
  3. wheel geom に priority="1" を付ける。付けないと接触ペアの摩擦は両 geom の max になり、床の μ=1.0 に戻る
  4. 横軸 = wheel joint 軸を接地面に射影、縦軸 = 横軸 × 法線。joint 軸が radial なら横軸がローラー方向になる

例 (fibril_sim.tire_contact, linear_combined_slip):

<plugin plugin="fibril_sim.tire_contact">
  <config key="model" value="linear_combined_slip"/>
  <config key="wheel_geom" value="wheel0_geom"/>
  <config key="ground_geom" value="floor"/>
  <config key="normal_force_from_contacts" value="true"/>
  <config key="reference_normal_force_n" value="31.0"/>
  <config key="longitudinal_relaxation_rate_s_inv" value="20.0"/>
  <config key="longitudinal_friction" value="0.8"/>
  <config key="lateral_relaxation_rate_s_inv" value="1.0"/>
  <config key="lateral_friction" value="0.0"/>
</plugin>
<geom name="wheel0_geom" type="cylinder" size="0.05 0.015"
      friction="0.02 0.005 0.0001" priority="1"/>

力則: coef = clamp(rate × v_slip, ±μ)、F = −N × coef。rate は両方 > 0 が必須。

別解: ローラーを 1 個ずつ hinge 付き body にする。忠実だが body 数が 10 倍以上になる。

確認#

  • 3 軸それぞれ 2 s 指令して、定常の chassis 速度と wheel fb を並べる
  • 期待: 並進時 wz ≈ 0、回転時 変位 ≈ 0、wheel fb / R ≈ wz
  • 実測 (対処後): vx 0.5 指令で v_x 0.464、wz −0.001、Δyaw −0.3°/2 s

関連#

最終更新:

On this page