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 は面内等方
対処
- 接地力を計算する plugin を車輪ごとに置き、横方向の摩擦係数を 0、縦方向だけ有限にする
- wheel geom の native 摩擦を小さくする (例 0.02)。接触自体は残す (法線力は MuJoCo から取る)
- wheel geom に
priority="1"を付ける。付けないと接触ペアの摩擦は両 geom の max になり、床の μ=1.0 に戻る - 横軸 = 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
関連
最終更新: