世界を数字で書き写す — 物理シミュレータは毎秒200回、何を計算しているのか【アヒルで学ぶフィジカルAI #2】
Ember 編集部 ・ 2026-08-28 ・ 約4分 ・ robotics
前回、ブラウザの中でアヒルがフットサルをしているのは「本物の物理シミュレータが動いているから」だと言いました。今回はその物理シミュレータ——FUTSAL DUCKSの場合はMuJoCoというソフトウェア——が、実際のところ何を計算しているのかを開けてみます。 先に結論を言ってしまいます。試合中のあの画面、アヒル8羽とボールが入り乱れるあの「世界」の全情報は、 たった175個の数字 です。アヒル1羽が21個、ボールが7個。それに速度の情報166個を足しても、341個。あなたのスマホの写真1枚が数百万個の数字でできていることを考えると、拍子抜けするほど少ない。 物理シミュレーションの第一歩は、この「世界を最小限の数字のリストに書き写す」という発想です。この数字のリストを<strong 状態(state)</strong と呼びます。今回の主役です。
道具箱① 状態 — 世界のセーブデータ いまこの瞬間の世界を凍結して、あとで完全に再現するには、何をメモしておけばいいでしょうか。 ボールなら直感的です。 どこにあるか (位置: x, y, z の3個)と、 どっちを向いているか (向き: 4個の数字で表します。後述)。合計7個。これに どう動いているか (速度3個と回転の速さ3個)を足すと13個。この13個をメモしておけば、ボールの未来は物理法則が決めてくれます。 アヒルはどうでしょう。アヒルの体は、胴体・頭・太もも・すね・足……と部品に分かれていますが、部品同士は関節でつながっていて、勝手な位置には行けません。だから全部品の位置をメモする必要はなくて、 胴体(根っこ)の位置と向き: 7個 (ボールと同じ) 各関節の曲がり角度: 14個 (このロボットの関節は14個) の合計 21個 で、アヒルの姿勢は完全に決まります。膝の角度さえわかれば、すねの位置は計算で出るからです。この「世界を決めるのに必要な最小限の数字の個数」を 自由度 と呼びます。MuJoCoの内部では、この数字のリストに qpos という名前がついています。 だから試合の世界は、 これだけ。マルチプレイ対戦のとき、ホストが他のプレイヤーに送っている「世界の現在の状況」も、実質この341個の数字です(だから通信量が小さくて済む)。 ひとつ補足。「向きが4個の数字」というのは奇妙に見えるかもしれません。向きは角度3つ(前後の傾き・左右の傾き・回転)でも表せそうですが、角度3つ方式には特定の姿勢で計算が壊れる有名な弱点があり、実務では クォータニオン という4個の数字のセットを使います。今は「3Dの向きは4個の数字で持つのが業界の常識」とだけ覚えれば十分です。 道具箱② タイムステップ — 時間を細切れにする 状態が決まったら、次は時間を進めます。物理法則(力と運動の関係)は「今この瞬間の変化率」しか教えてくれないので、コンピュータは時間を細かく刻んで、少しずつ進めます。 高校物理の等加速度運動を思い出してください。ごく短い時間 Δt の間なら、 この2行を延々と繰り返すのが、シミュレーションの心臓部です(実物はもっと洗練された計算をしますが、骨格はこれです)。 このゲームでは Δt = 0.005秒 。つまり世界は1秒間に 200回 更新されます。なぜこんなに細かいのか。Δtを大きくすると計算は楽になりますが、精度が壊れます。想像してください。Δt = 0.1秒だと、時速数kmで動く足先は1ステップで数cm「ワープ」します。ワープの途中に床があったら? 衝突を見逃して、足が床にめり込みます。二足歩行のように接触が連続する対象では、時間の刻みの粗さは即、破綻につながります。 道具箱③ 接触力 — シミュレータの一番難しい仕事 重力の計算は簡単です。モーターの力も、指令がわかっていれば簡単。物理シミュレータの仕事の9割は、実は 接触 です。 足の裏が床に触れた瞬間、床は足を押し返します(そうでなければ足は床を突き抜けます)。この押し返す力は、教科書の重力のような「式に代入すれば出る力」ではありません。 「めり込まない」「滑るときは摩擦の法則に従う」という条件を満たすように、逆算で求める力 です。8羽のアヒルの足×床、アヒル×ボール、アヒル同士——毎ステップ、数十個の接触点すべてについて、この逆算を連立で解いています。1秒に200回。 そして摩擦。摩擦は普段は悪者扱いされますが、歩行においては主役です。<strong 摩擦がなければ歩けません。</strong 歩くとは「足の裏で地面を後ろに押し、摩擦の反作用で前に進む」ことだからです。ツルツルの氷の上で歩けないのは、脚の性能の問題ではなく、地面が力を返してくれないからです。シミュレータの摩擦係数を少し変えるだけで、同じ「脳」を持ったアヒルが歩けたり転んだりします。フィジカルAIの難しさの何割かは、この接触と摩擦の気難しさに由来します(最終回のsim2realで再登場します)。 MuJoCoという道具 この計算を全部やってくれているのが MuJoCo (ムジョコ, Multi Joint dynamics with Contact)です。名前のとおり「多関節+接触」に特化した物理エンジンで、もともと研究者が開発し、2021年にDeepMind(Googleの AI 研究部門)が買収して、いまは 無料・オープンソース です。ロボット学習の研究論文で最もよく使われるシミュレータのひとつで、冒頭のゲームではそれをWebAssemblyという技術でブラウザ内で動かしています。 研究の現場と同じ道具が、高校生のブラウザでそのまま動く。これが2020年代にフィジカルAIを学び始める人の幸運です。 観察課題 ゲームを開いて、今回の言葉で世界を見直してみましょう。 1. キックオフ直後の整列 を見てください。全員がピタッと同じ姿勢で静止しています。これは「リセット」、つまり341個の数字を初期値に書き戻す操作です。セーブデータのロードと完全に同じことです。 2. アヒル同士がぶつかる瞬間 を見てください。押し合いの力は誰もプログラムしていません。接触の逆算が勝手に生み出しています。 3. 🛼 ローラーモード では、アヒル1羽の数字は21個ではなく 25個 になります。足に受動車輪が4個増えたぶんの自由度です。体に部品を足すことは、状態の数字を増やすこと——「体の設計」と「数字のリスト」が直結している感覚、次回の主役です。 次回は、その「体の設計」の話。アヒルの体が、実は 1本のテキストファイル で書かれていること、モーターが「目標角度」という一種の願い事で動いていることを見ていきます。