🛠 箱庭ラボ日記──2026年5月30日


先日、ある方から、
「箱庭ドローンシミュレータで、バレーボールできますか?」
と聞かれました。

バレーボール。

正直戸惑いました…。

えっと、バレーボールって、いわゆる、ボールを飛ばしてやるやつ。ですよね?

え?
そんなん、ドローンでやるんだ。

(最初は、そう思いました。)

箱庭ドローンシミュレータは、ドローンを飛ばすためのシミュレータです。
姿勢制御、位置制御、センサ、物理エンジン、PX4接続、故障注入、風外乱。
そういうものを扱うために作ってきました。

なので、「バレーボールできますか?」と聞かれると、最初の反応としては、

いや、想定してません…。
ごめんなさい。

でした。

でもね。

少し考えました。

ドローンでボールを叩く。
ボールが跳ね返る。
別のドローンが返す。
また跳ね返る。

「やれるんじゃない?」

ってね。

だから、即答。(でもないけど

「はい、できますよー。」って。

頭の中で最初に思い浮かべたアーキテクチャは、こんな感じです。

箱庭ドローンシミュレータの中に MuJoCo がある。
その MuJoCo の中に、Drone だけでなく Ball も入れてしまう。

つまり、ドローンもボールも、同じ物理世界の中で動かす、という考え方です。

こうすると、話はわりと単純です。

ドローンが飛ぶ。
ボールがある。
両者が接触したら、MuJoCo が衝突を計算する。
ボールは跳ね返る。
ドローン側にも反力が返る。

要するに、ひとつの物理エンジンの中で全部やってしまう、という構成です。

実際、バレーボールのような動きをまず成立させるだけなら、この構成はとても素直です。
ボールの物理も、ドローンとの衝突も、同じ MuJoCo の中で閉じるので、実装としてはわかりやすい。

でも、なんか違和感。(あとでくるやつ

ボールを操作したいんですけど。

きました。

そのピュアな質問。(大好き。でも涙。

そうなんです。
そこなんです。

バレーボールをやるなら、ボールはただそこに置いてあるだけではダメなんです。

ボールを出したい。
ボールを飛ばしたい。
ボールの位置を変えたい。
ボールをリセットしたい。
場合によっては、外からボールを操作したい。

つまり、ボールは単なる障害物ではありません。
ボールは、ゲームの主役のひとつです。

ここで、最初に考えたシンプルな構成が、ガタガタと崩れて落ちていく音が聞こえました。

夜中に目覚めて眠れなくなるやつ。

その質問を見てしまいました。

あかん。眠れなくなった。

そこから、寝返りを打ちながら、頭の中でアーキテクチャ会議。

「ボールを箱庭ドローンシミュレータの中に入れるか?」

いや、ダメだ。箱庭ドローンシミュレータの責務から外れる。

「では、ボールを外部環境・オブジェクトとして組み込むか?」

いや、それは大改造になる。

「いよいよ、きましたね。Runtime Delegation!」

あかん、まてまて、それは早い、まだ早すぎる。(これは、1年くらい寝かしとくやつ

「ボールを、別のシミュレータで動かして箱庭で連携させる?」

……。

それだ。

それしかない。

「でも、ボールと箱庭ドローンはどうやって衝突させる?」

あ、平鍋さんと一緒につくった「Impulse」。あれを使おう。

別のシミュレータで起きた事象を、箱庭ドローンに衝撃として通知する仕組み。

これだ。

つまり、ボールとドローンを同じ MuJoCo の中で衝突させる必要はない。

ボール側のシミュレータで、ドローンとの接触を判定する。
そこで「衝突した」という事象を検出する。
そして、その衝突を Impulse として箱庭ドローン側へ送る。

箱庭ドローン側は、その Impulse を受け取って、ドローンに衝撃として反映する。

同じ物理世界にはいない。
でも、衝突の結果だけは伝搬する。

そして、頭の中で描いた絵がこれです。

「めっちゃ、箱庭っぽいやん!」

朝1時。ゴソゴソ起きだす。

やるか。

頭の中には、さっきの絵があります。

箱庭ロボットシミュレータ。
箱庭ドローンシミュレータ。
二つの MuJoCo。
共有メモリ。
Position。
Impulse。

よし、構成は見えた。

codex の残り残量をみる。

グッ……。

いけるのか?

賢く、すばやく、一気にやる。

codexを開く。

hakoniwa-drone-pro の MuJoCo 実装を理解させる。

hakoniwa-mujoco-robots の RigidBody 設計を理解させる。

impulse のPDUデータ構造を理解させる。

設計案を伝える。

実装させる。

「できた!」

気づけば、外が明るくなっていました。

朝7時。

画面には、箱庭ロボットシミュレータ側の MuJoCo。
ボールがあり、Mirror Drone がいる。

その裏側では、箱庭ドローンシミュレータ側の Source Drone が別プロセスで動いています。

Source Drone の Position が共有メモリに出る。
Robot Simulator 側では、それを Mirror Drone として受け取る。
Ball と Mirror Drone が接触する。
そこで Impulse が生成される。
その Impulse が共有メモリに出る。
Drone Simulator 側の Source Drone が、それを衝撃として受け取る。

同じ MuJoCo の中にはいない。
でも、つながっている。

別々の物理世界なのに、衝突の結果が伝わっている。

よかった。

でも、今から仕事かー。

なぜ、今日こんなことを書いているかというと。

ふと思い出したんです。

週末が待ち遠しくてしかたなかった、あの頃のことを。

Unityとつなぐ。
athrillとつなぐ。
ROSとつなぐ。
箱庭の中で、いろんな世界が接続されていく。

それは、ただの趣味でした。
ただの実験でした。

でも、その積み重ねが、今の箱庭ラボの基盤になっているような気がして。

ボール飛ばせるようになってよかった。

おしまい。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

PAGE TOP