Isaac Sim Joint ゲイン調整 (Stiffness / Damping)
joint drive の stiffness / damping の意味、初期値の決め方、症状別の調整方法
要点: joint drive は PD 制御器。位置制御は stiffness 主体 + damping はその 1/10 程度から、速度制御は stiffness = 0 で damping のみ。調整は Gain Tuner を使う。
まず式を知る
joint drive が出すトルク (力) は:
- = Stiffness (位置誤差へのゲイン)
- = Damping (速度誤差へのゲイン)
- 出力は joint の Max Force で頭打ちする
つまり ros2_control の PD ゲインと同じ発想でよい。ただし USD の角度ドライブは degree 基準 (トルク/deg) なので、rad 基準の実機ゲインと数値を直接比較しないこと。
制御モード別の設定
| モード | Stiffness | Damping | 用途 |
|---|---|---|---|
| 位置制御 | 大 (主体) | Stiffness の 1/10 程度 | アーム関節、サーボ |
| 速度制御 | 0 | 大 (主体) | 差動駆動の車輪 |
| トルク制御 | 0 | 0 | 自前制御器から effort を直接入力 |
| 受動 joint | 0 | 小 (摩擦相当) | キャスター等 |
速度制御で stiffness が残っていると「目標位置 0 に引き戻されるバネ」が入った状態になり、車輪が回らない・振動する。速度制御の stiffness = 0 は必須。
初期値の決め方 (物理ベース)
勘ではなく固有振動数から逆算するのが確実。joint 周りの慣性 に対して:
- (固有振動数): 制御周期より十分遅く、目標応答より速く。目安 10〜50 rad/s
- (減衰比): 1 で臨界減衰 (行き過ぎなしの最速収束)。0.7〜1 が無難
最近の URDF Importer にはこの換算をやってくれる Natural Frequency / Damping Ratio 指定があるので、インポート時は生の stiffness よりこちらで指定する方が楽。
慣性が分からない場合の経験則 (卸庝スケールのロボット):
- アーム関節 (位置): stiffness 1e4〜1e5、damping はその 1/10
- 車輪 (速度): stiffness 0、damping 1e3〜1e5
- そこから 10 倍 / 1/10 刻みで振って当たりをつけ、微調整は 2 倍刻み
設定場所
- GUI: joint の prim を Stage で選択 → Property の Drive セクションで Stiffness / Damping / Max Force を編集 (Play 中も変更可。ただし Stop で巻き戻るので確定値は Stop 後に入れ直す)
- URDF Importer: インポートダイアログで joint ごとに一括指定
- Python:
from isaacsim.core.prims import Articulation
robot = Articulation("/World/robot")
robot.set_gains(kps=stiffness_array, kds=damping_array)Gain Tuner での調整手順
Isaac Utils > Gain Tuner (拡張の有効化が必要な場合あり) を使うと、スライダでゲインを変えながら目標軌道への追従をその場で確認できる。
重力なしで単体評価
まずロボット単体・重力影響の小さい姿勢で、joint 1 つずつステップ目標を入れて応答を見る。
stiffness を先に合わせる
damping を小さめに固定し、目標に届くまで stiffness を上げる。発振したら一段下げる。
damping で振動を止める
行き過ぎ・残留振動が消えるまで damping を上げる。上げ過ぎると応答が遈くなる。
実負荷で再確認
可邬重量を持たせる・地面に接地させるなど実使用条件で確認。重力で垂れるなら stiffness 不足か Max Force 飽和。
症状別の診断
| 症状 | 原因 | 対処 |
|---|---|---|
| 発振・ガタガタ震える | stiffness 過大 or damping 不足 | damping を上げる。止まらなければ stiffness を下げる |
| 目標に届かない・重力で垂れる | stiffness 不足 or Max Force 飽和 | stiffness を上げる。Max Force を確認 |
| 応答が遈い・ぬるっと動く | damping 過大 | damping を下げる |
| ロボットが弾け飛ぶ (explode) | ゲイン過大 × 物理 dt が粗い | ゲインを下げる、または物理の dt を細かく / solver iteration を増やす |
| 車輪が回らない (速度制御) | stiffness が 0 になっていない | stiffness = 0 にする |
| ゲインを上げても変化がない | Max Force で飽和済み | Max Force を実機相当の値に設定 |
安定性は物理ステップ周波数に依存する。デフォルト 60Hz で発振する高ゲインでも、物理 dt を細かくすれば安定することがある (設定: Physics Scene の Time Steps Per Second)。ただし計算負荷とトレードオフ。
実機との対応づけの注意
- シミュのゲインは「実機のモータドライバの振る舞いを再現するための値」であって、実機の PID 値をそのまま入れるものではない (単位系も deg/rad で違う)
- 実機が十分に剤い位置サーボなら、シミュ側は高 stiffness + 臨界減衰で「ほぼ理想的に追従する」設定に寄せるのが実用的
- sim-to-real を詰める段階ではステップ応答を実機とシミュで並べて比較し、立ち上がり時間とオーバーシュートを合わせる
関連
- /docs/ros/isaac-sim/isaac-sim-urdf-import
- /docs/ros/isaac-sim/isaac-sim-action-graph