はじめに
Physical AI、つまり現実世界で動作するロボットやドローンのためのAI開発において、シミュレーションは欠かせない存在です。私自身、Unitree GO2の4足歩行ロボットでバックフリップをさせたり、ドローンを使ったコンクリート3Dプリンティング(Flying 3D Printer: F3DP)の研究に取り組んできました。
この記事では、sim2real(シミュレーションから現実への転移)における一つの逆説的な真実について書いてみたいと思います。
「シミュレーションは、真面目にモデル化しないほうがうまくいく」
…いきなり挑発的なタイトルですが、これには深い理由があります。
Sim2Realの本質的な課題
シミュレーションで学習したロボット制御を実機に移す際、最大の壁は「シミュレーションと現実のギャップ(Sim-to-Real Gap)」です。
例えば、GO2ロボットの歩行制御を強化学習フレームワークのGenesisやIsaac Labでトレーニングして実機に移すとき、こんな問題が起きます:
- 床の摩擦係数が違う → シミュレーションでは歩けたのに、実機では滑ってしまう
- モーターの応答特性が違う → 指令通りに動かない
- センサーノイズがない → 実機のノイズまみれの観測値に対応できない
- 重心位置の誤差 → 微妙なバランスの違いで転倒
私がGO2のバックフリップに挑戦したとき、まさにこの壁にぶつかりました。シミュレーションでは見事にバックフリップを決めるロボットが、実機では悲惨な結果に…。
「完璧なシミュレーション」という幻想
ここで多くの人が考えるのは、「じゃあシミュレーションをもっと精密にすればいいのでは?」ということです。
- 床の摩擦係数を実測して入力
- モーターの特性を詳細にモデリング
- ロボットの質量分布を精密計測
確かにこれは一つのアプローチです。しかし、現実問題として完璧なモデル化は不可能です。
理由は明白で、現実世界は無限に複雑だからです。床の摩擦一つとっても、場所によって違う、湿度で変わる、経年劣化する…。すべてをモデル化しようとすると、永遠に終わりません。
発想の転換:Domain Randomization
ここで登場するのが**Domain Randomization(ドメインランダマイゼーション)**という考え方です。
発想は単純です:
「シミュレーションを現実に合わせるのではなく、シミュレーション内でありとあらゆる環境を経験させる」
具体的には、トレーニング中に以下のようなパラメータをランダムに変化させます:
randomization_params = {
"friction": [0.3, 1.2], # 摩擦係数:ツルツル〜ザラザラ
"mass_scale": [0.8, 1.2], # 質量:軽い〜重い
"joint_stiffness": [10, 1000], # 関節剛性:柔らかい〜硬い
"com_displacement": [-0.05, 0.05] # 重心のずれ
}
フェイクでもいいのです。現実と全く同じパラメータである必要はありません。ピンポイントにリアルとシミュレーションの条件を合わせるのではなくバッファとして想定しうる幅のある条件の中でトレーニングをさせればいいのです。
重要なのは、「どんな環境でも対応できるロボット」を育てることです。
私の経験:GO2バックフリップの場合
GO2のバックフリップをsim2realで成功させるまでに、いくつかの重要な発見がありました。
1. 制御周波数とレイテンシの一致
シミュレーションを50Hzで実行してその条件でトレーニングをさせたのならば、実機の制御周波数もデプロイコードで一致させるようにすること。
2. PDゲインの調整
実機展開時に、Kp(剛性係数)を微調整する必要がありました。シミュレーションで学習したポリシーをそのまま使うのではなく、実機での応答を見ながら調整します。
3. そして何より、Domain Randomization
摩擦係数、質量、関節特性…これらをランダムに変化させながら学習させることで、「完璧なシミュレーション」を目指さずとも、実機で動くロボットを育てることができました。
驚くべきことに、たった2時間のシミュレーション訓練でバックフリップを習得し、実機転移に成功しました。人間がプログラムしたのではなく、AIが自分で学習した結果です。
會澤高圧コンクリートの公式youtube チャンネルAIZAWAchanよりなぜ「いい加減」がうまくいくのか
Domain Randomizationがうまくいく理由を、もう少し深掘りしてみましょう。
a.過学習の防止
特定の環境に最適化しすぎると、その環境でしか動かないロボットになります。様々な環境を経験させることで、汎化能力の高い制御が学習されます。
b.最悪ケースへの対応
ランダマイゼーションにより、意図せず「意地悪な」環境も経験することになります。摩擦が極端に低い床、重心がずれた状態…。これらを乗り越えて学習したロボットは、現実世界のちょっとした変動には動じません。
c.本質の抽出
パラメータが変化しても成功する制御を学習するということは、環境の詳細に依存しない本質的な動きを学習するということです。
まとめ:真面目にモデル化しない勇気
sim2realにおいて、シミュレーションの精度を上げることは一つの正解です。しかし、それが唯一の正解ではありません。
むしろ、「いい加減な」シミュレーションの中で多様な経験を積ませるというアプローチが、驚くほどうまくいくことがあります。
完璧を目指さない。むしろ、フェイクでもいいから様々な環境を用意する。その中で鍛えられたAIは、現実世界の不確実性に対して驚くほどロバストになります。
これは、ある意味で人間の学習にも通じるものがあるかもしれません。温室育ちより、様々な経験を積んだ人のほうが、未知の状況に対応できる…そんな話に似ています。
Physical AIの世界では、完璧な準備より適応力が勝つ。
従来のシミュレーションの精度の高さではなく、強化学習ではリアルの近傍にあるフェイクに価値があるのかもしれません。これがFake to Realに繋がります。
私の研究経験から得た、一つの教訓です。
おまけ:使っているツール・環境
参考までに、私が使っている環境を紹介します:
- シミュレーション環境: Isaac Sim / Isaac Lab, Genesis
- 強化学習フレームワーク: PPO (rsl-rl)
- ロボット: Unitree GO2
- 物理エンジン: PhysX, Warp
特にGenesisは、43万倍速という驚異的な速度でシミュレーションができ、Domain Randomizationを大規模に行うのに非常に便利です。
最後まで読んでいただきありがとうございました!
質問やコメントがあれば、お気軽にどうぞ。
よき計算生活を! 🤖