ゆるふわフィジカルAI
パソコンで作業中のゆるロボ

Sim2Realを成功させる5つのテクニック|実機で動かない理由と対策

2026-08-08 ・ 実践

#Sim2Real#シミュレーション#実践

シミュレーションでは完璧に歩くのに、実機に載せた瞬間に転ぶ。ロボット開発者が必ず通るSim2Realギャップです。この記事では、その原因と実務で効く5つの対策をまとめます。

なぜギャップが生まれるのか

シミュレータは現実の近似にすぎません。ズレの主な発生源は4つです。

ズレの原因具体例
物理パラメータ摩擦係数、重量、慣性が現実と微妙に違う
遅延実機はセンサー読み取り〜モーター反応に数ms〜数十msかかる
センサーノイズシミュレータの観測は完璧、実機はブレる
未モデル化要素ケーブルの張力、ギアのバックラッシュ、床のたわみ
⚠️

いちばん厄介なのは遅延

物理パラメータのズレは調整できますが、遅延は「未来を予測する」しかありません。シミュレータで遅延ゼロの前提で学習したAIは、実機で必ず振動します。

テクニック1: ドメインランダム化

最も効果が高く、最初にやるべき対策です。シミュレーション中に物理パラメータをわざとランダムに変動させます。

Python
# 学習のたびにパラメータを揺らす
friction = np.random.uniform(0.5, 1.5)      # 摩擦
mass_scale = np.random.uniform(0.8, 1.2)    # 重量 ±20%
motor_delay = np.random.uniform(0, 0.03)    # 遅延 0〜30ms

狙いは「正確なシミュレーション」ではなく**「どんな条件でも動くAI」**を作ること。現実がその変動範囲のどこかに収まっていれば、実機でも動きます。

🎯

ランダム化なし

  • 1つの理想条件で最適化
  • シミュレータ内では最高性能
  • 実機で即転倒
VS
🎲

ドメインランダム化

  • 数千通りの条件で学習
  • シミュレータ内の成績は少し落ちる
  • 実機でも動く

シミュレータ内のスコアがわざと下がるのがポイントです。ここを我慢できるかが分かれ目になります。

テクニック2: システム同定(実機に合わせ込む)

実機で簡単な動作をさせ、その結果からシミュレータのパラメータを補正します。

Python
# 実機で「関節を10度動かす」を実行し、応答を記録
# → シミュレータの応答と一致するようパラメータを最適化

ランダム化が「広く浅く」なら、こちらは「狭く深く」。両方やるのが最強で、システム同定で中心値を合わせ、その周辺をランダム化します。

テクニック3: 遅延をシミュレータに入れる

実機の遅延を測り、その分だけ観測を遅らせて学習します。

Python
# 30ms前の観測を使って行動を決める(実機の遅延を再現)
delayed_obs = observation_buffer[-3]  # 10msステップなら3つ前

これだけで実機の振動が劇的に減ります。測定は簡単(コマンドを送ってから動き出すまでを高速度カメラかログで計測)なので、費用対効果が非常に高い対策です。

テクニック4: 観測にノイズを足す

実機のセンサーはブレます。シミュレータの完璧な観測に慣れたAIは、ノイズで簡単に混乱します。

Python
obs = true_state + np.random.normal(0, 0.01, size=obs_dim)

IMUや関節エンコーダの実測ノイズ幅を調べて、その程度を混ぜるのが定石です(センサー超入門)。

テクニック5: 段階的に移す

いきなり全力で動かさず、安全域から詰めていきます。

安全な実機移行

🐢

低速で

まず1/4の速度

→
🪢

吊るして

落下防止しながら

→
🏃

全力へ

徐々に本来の速度

ヒューマノイドの開発動画でロボットが吊り下げられているのは、この段階にいるからです。

デバッグの進め方

実機で動かないとき、闇雲にパラメータを触るのは時間の無駄です。順番に切り分けます。

  1. 同じ指令を入れて、動きが同じか → 違えばモーター/減速機の特性差
  2. センサー値がシミュレータと同じ範囲か → 違えば単位やキャリブレーションのミス
  3. 遅延はどれくらいか → 測って学習に反映
  4. それでもダメ → ランダム化の範囲を広げて再学習

まとめ

  • Sim2Realギャップの原因は物理パラメータ・遅延・ノイズ・未モデル化要素
  • 最優先はドメインランダム化。シミュレータ内のスコア低下を受け入れる
  • 遅延の再現は費用対効果が最強
  • システム同定で中心を合わせ、ランダム化で幅を持たせるのが王道
  • 実機移行は低速・吊り下げから段階的に
📚 もう少し詳しく(背景と理論)気になる人向け・タップで開く

Sim-to-Real の障壁は、シミュレータと現実の物理・見た目の差であるreality gap です1。これを乗り越える代表的手法がドメインランダム化——摩擦・質量・照明・テクスチャなどをランダムに変えて学習し、実機を「多様なシミュレーションの一種」として扱わせる方法です(Tobin et al., 2017)2。

物理パラメータ自体をランダム化するダイナミクスランダム化(Peng et al., 2018)も有効で3、加えて実機データで模型を較正するシステム同定を併用します。「シミュレータをどこまで信じ、どこを埋めるか」が実装の核心です。

次の一歩 🌸

学習側の話は強化学習でロボットを歩かせる、実機に載せるハード面はJetson Thor入門へどうぞ。

Footnotes

  1. reality gap は接触・摩擦・センサーノイズ・遅延など、シミュレータが完全には再現できない現実との差。これが原因でシミュレータで完璧な方策が実機で失敗する。 ↩

  2. Tobin, J. et al. (2017). "Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World." IROS 2017. 見た目をランダム化して実画像に汎化させた。 ↩

  3. Peng, X. B. et al. (2018). "Sim-to-Real Transfer of Robotic Control with Dynamics Randomization." ICRA 2018. 物理パラメータをランダム化して頑健な方策を学習。 ↩

この記事をシェア:𝕏 で共有LINEで送る

🔥 この分野の最新トレンドをチェック →

学習コース

27 / 46 本目

学習コースの全体を見る

あわせて読みたい

Isaac Lab入門|強化学習フレームワークの導入とサンプル実行

Isaac Labとは、NVIDIAが提供するロボット向け強化学習フレームワークです。インストール手順、必要なGPU・OS要件、環境一覧の確認方法、最初のサンプルの動かし方をエンジニア向けに解説します。

MuJoCoのビューアが開かない・固まるときの原因と直し方

MuJoCoのビューアウィンドウが開かない、エラーで落ちる、真っ暗なまま固まるときの原因と直し方。DISPLAY未設定・macOSのmjpython・sync()忘れの3パターンを、公式ドキュメントと実際の動作確認で整理します。

Gymnasium入門|CartPoleで強化学習を体験する

Gymnasiumとは、強化学習の環境をPythonの共通インターフェースで扱えるFarama Foundation製のオープンソースライブラリです。CartPole-v1でreset/stepの基本ループを動かし、ランダム行動と自分で書いた方策で結果がどれだけ変わるかを比較しながら体験します。

IMUセンサーフュージョンをPythonで実装する|加速度計とジャイロから傾きを求める(相補フィルタ)

IMU(加速度計+ジャイロ)から姿勢の傾きを求める相補フィルタをPythonでゼロから実装。加速度計だけだとノイズだらけ、ジャイロだけだとドリフトで増え続ける様子を数値で確認し、2つを混ぜるとなぜ安定するのかを手を動かして理解します。