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

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

2026-08-08実践

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

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

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

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

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

いちばん厄介なのは遅延

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

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

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

# 学習のたびにパラメータを揺らす
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: システム同定(実機に合わせ込む)

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

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

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

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

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

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

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

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

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

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. 物理パラメータをランダム化して頑健な方策を学習。

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

学習コース

27 / 46 本目

学習コースの全体を見る

あわせて読みたい

A*経路探索をPythonで実装する|ロボットの「最短ルート」を見つける

ロボットや自律移動の経路計画で定番のA*(エースター)アルゴリズムをPythonでゼロから実装。ヒューリスティックがなぜ探索を速くするのか、グリッド上で障害物を避けて最短経路を見つける流れを、動くコードで理解します。

SLAM(自己位置推定と地図作成)をPythonで実装する|占有格子地図とパーティクルフィルタ

「地図が無いと自分の位置が分からず、位置が分からないと地図が作れない」というSLAMの鶏と卵問題を、占有格子地図とパーティクルフィルタでPython実装。ロボットが自分の位置と周囲の地図を同時に組み立てる仕組みをコードで理解します。

PID制御をPythonで実装する|ロボットを"ちょうどよく"目標へ動かす

ロボット制御の基本「PID制御」をPythonでゼロから実装。比例・積分・微分の3項が何をしているのか、ゲイン調整で挙動がどう変わるのかを、動くシミュレーションコードで手を動かして理解します。

ロボティクス転職に効くポートフォリオの作り方【GitHub活用】

フィジカルAI・ロボティクス領域への転職や就職で評価されるポートフォリオの作り方を解説。何を作るべきか、GitHubの見せ方、READMEの書き方、動画の重要性まで実践的にまとめました。