この記事では、Windows 11 / WSL2 / Docker + Windows 側ゲームパッドの構成で、
MuJoCo 版の箱庭ドローンシミュレータを一通り動かすまでの手順をまとめます。
ゴールはシンプルです。
- MuJoCo viewer が立ち上がる
- Windows 側のゲームパッド入力で機体が動く
「とにかく一度 MuJoCo 版のサンプルを手元で動かしてみたい」という方を対象にしています。
細かいパラメータ調整や独自機体のカスタマイズは、まずこれが動いてから、で大丈夫です。
※本手順は v3.7.0 時点の構成を前提にしています。
なお、ゲームパッドなしで試したい方は、こちらの記事を参照ください。
全体構成(ざっくり)
- Windows: ゲームパッド入力(
rc-endpoint.py) - WSL2/Docker: MuJoCo / drone service / web bridge
- 通信: PDU endpoint 経由で接続
「Windows 側の入力」と「WSL2/Docker 側のシミュレーション」を分離しつつ、
箱庭の launcher でまとめて起動する、というのが今回の全体像です。
この記事でやること
WSL2 側で以下のコマンドを叩いて、MuJoCo サンプルが動くところまで持っていきます。
bash tools/launch-docker-mujoco-web-bridge-rc.bash
この launcher は内部で次をまとめて起動してくれます。
- WSL2/Docker 側の MuJoCo / drone service / web bridge
- Windows 側の
rc-endpoint.py(PowerShell 経由で起動)
前提環境
OS・ミドルウェア
- Windows 11
- WSL2 / Ubuntu
- WSL2 内で docker が動いていること
- Windows に PS4 / PS5 系ゲームパッドを接続済み
必要な repo
以下の 2 つを同じ親ディレクトリに clone しておきます。
/home/<user>/project/hakoniwa-drone-core ← シミュレータ本体
/home/<user>/project/hakoniwa-pdu-endpoint ← Windows 側 RC endpoint のインストーラが使う
cd /home/<user>/project
git clone https://github.com/toppers/hakoniwa-drone-core.git
git clone https://github.com/hakoniwalab/hakoniwa-pdu-endpoint.git
※重要:この 2 つのリポジトリは 同じディレクトリ階層に置いてください。
install-rc-endpoint-win.bashが相対パス前提で参照するためです。
hakoniwa-drone-core は対象バージョンに合わせて submodule も初期化しておきます。
cd /home/<user>/project/hakoniwa-drone-core
git fetch --tags
git checkout v3.7.0
git submodule update --init --recursive
手順
1. Windows 側のディレクトリを作る
RC endpoint のインストール先を先に作っておきます。PowerShell で実行してください。
mkdir C:\project\rc-endpoint
2. WSL2 側で docker を使えるようにする
docker がまだ使えない場合は以下を実行します。
bash docker/wsl-docker-install.bash
bash docker/wsl-docker-activate.bash
詳細は docs/tips/wsl/docker-setup.md を参照してください。
3. Linux 配布バイナリと Docker イメージを用意する
hakoniwa-drone-core の Releases から lnx.zip を取得し、repo ルートで展開します。
v3.7.0 Release:
https://github.com/toppers/hakoniwa-drone-core/releases/tag/v3.7.0
cd /home/<user>/project/hakoniwa-drone-core
unzip lnx.zip # lnx/ ディレクトリが生成されます
次に Docker イメージを取得します。
bash docker/pull-image.bash
取得できたか確認します。
docker images | grep hakoniwa-drone-core
4. Windows 側の RC 実行環境をインストールする
WSL2 側で以下を実行します。
bash tools/install-rc-endpoint-win.bash 'C:\project\rc-endpoint'
このコマンドが行うのは主に次の内容です。
-
rc-endpoint.pyと関連 config を Windows 側へコピー - Windows 側へ
pygameをインストール -
hakoniwa-pdu-endpointのインストーラを呼び出し、hakoniwa-pdu/ runtime bundle をセットアップ - 起動用の
launch-rc-endpoint-win.ps1を生成
既定パスに合わせる場合は引数なしでも動きます。
bash tools/install-rc-endpoint-win.bash
5. MuJoCo サンプルを起動する
WSL2 側で以下を実行します。
bash tools/launch-docker-mujoco-web-bridge-rc.bash
内部では config/launcher/docker-mujoco-web-bridge-rc-win.launch.json が使われ、
Docker 側では config/drone/mujoco/drone_config_0.json を起点に
drone.xml が読み込まれます。
つまり今回動かしているのは config/drone/mujoco のサンプルです。
起動確認
以下が確認できれば成功です。
- MuJoCo viewer が立ち上がる
- Windows 側で
rc-endpoint.pyが起動する - ゲームパッド入力で機体が動く
- 端末に
axis event/button eventが流れる
ログはどこを見るか
起動時に見るログは 3 系統あります。
1. launcher ログ
config/launcher/logs/drone-service.outconfig/launcher/logs/web-bridge-game.outconfig/launcher/logs/*.err
drone-service や web-bridge-game が起動しない場合は、まずここを確認します。
2. シミュレーションログ
drone_config_0.json の simulation.logOutputDirectory で出力先が決まります。
current のサンプルでは . になっているので、drone_log0/ などが生成されます。
センサ値や controller 出力を確認したい場合はこちらです。
3. RC endpoint のログ
rc-endpoint.py は標準出力 / 標準エラーへ直接出力します。
launcher のログファイルではなく、実行中の端末出力を見てください。
補足: 設定ファイルの関係
ここまでは、サンプルをそのまま動かすだけなら基本的に設定変更は不要です。
以下は「何が動いているのか」を理解したい場合や、カスタマイズ時の参考にしてください。
今回の MuJoCo サンプルでは、主に 3 つのファイルが関係します。
| ファイル | 役割 |
|---|---|
config/drone/mujoco/drone.xml |
MuJoCo 側の物理モデル(機体の正本) |
config/drone/mujoco/drone_config_0.json |
MuJoCo と drone service を繋ぐ接着層 |
config/controller/param-api-mixer-mujoco.txt |
controller の制御パラメータ |
drone.xml
機体形状・質量・慣性・ロータ配置・world 設定など、物理 plant の定義がここに集約されています。
drone_config_0.json
drone.xml への参照・controller の設定・PDU / service の設定をまとめたファイルです。
physicsEquation = "MuJoCo" の指定と mujoco.modelPath による drone.xml の参照が、
MuJoCo 連携の起点になります。
物理モデルそのものを変えたいなら drone.xml、
MuJoCo と service / controller の繋ぎ方を変えたいなら drone_config_0.json、
という切り分けを覚えておくと迷いにくいです。
param-api-mixer-mujoco.txt
PID・各種上限値・制御モードなどの内部制御の基準値です。
drone_config_0.json の controller.paramFilePath から参照されます。
プロペラ名は揃えておく
drone_config_0.json の components.droneDynamics.mujoco.propNames に
MuJoCo モデル内のプロペラ名を列挙します。
現在のサンプルでは prop1 / prop2 / prop3 / prop4 を使っています。
drone_config_0.json ではこうなっています。
"mujoco": {
"modelName": "drone_base",
"propNames": [ "prop1", "prop2", "prop3", "prop4" ],
"modelPath": "config/drone/mujoco/drone.xml"
}
一方、drone.xml 側では対応するプロペラ body がこう定義されています。
<body name="prop1" pos="0.18 -0.18 0.02" childclass="black">
<body name="prop2" pos="-0.18 0.18 0.02" childclass="black">
<body name="prop3" pos="0.18 0.18 0.02" childclass="black">
<body name="prop4" pos="-0.18 -0.18 0.02" childclass="black">
このように、propNames の各要素が drone.xml の body name を参照しています。
このため、drone.xml 側のプロペラ body 名もこれと一致させる必要があります。
数だけでなく、順序と名前の両方を合わせておくのが安全です。
順序がズレると、モータと制御信号の対応関係が崩れ、意図しない挙動になります。
座標系もそのまま同一ではない
もう 1 つ注意点があります。
drone.xml の配置と drone_config_0.json の thruster.rotorPositions は、同じ座標系の値ではありません。
-
drone.xmlは MuJoCo 側のFLUX: ForwardY: LeftZ: Up
-
drone_config_0.jsonのrotorPositionsは箱庭側のFRDX: ForwardY: RightZ: Down
つまり、少なくとも Y 軸の向きは反対です。
そのため、drone.xml の pos をそのまま rotorPositions にコピペしてよいとは限りません。
例えば prop1 を見ると、drone.xml では次の位置です。
<body name="prop1" pos="0.18 -0.18 0.02" childclass="black">
一方、drone_config_0.json の thruster.rotorPositions はこうなっています。
"rotorPositions": [
{
"position": [0.18, 0.18, 0],
"rotationDirection": 1.0
},
{
"position": [-0.18, -0.18, 0],
"rotationDirection": 1.0
},
{
"position": [0.18, -0.18, 0],
"rotationDirection": -1.0
},
{
"position": [-0.18, 0.18, 0],
"rotationDirection": -1.0
}
]
prop1 に対応する先頭要素は position: [0.18, 0.18, 0] です。
X は同じ forward 方向ですが、Y は Left と Right で向きが逆です。
Z については、rotorPositions の値は反トルク計算に使用するものであり、
物理的な取り付け高さをそのまま反映する必要がないため 0 としています。
Y 軸の違いを意識せずに値を移すと、ローター配置や回転方向の解釈を誤りやすくなります。
よくある詰まりどころ
| 症状 | 確認すること |
|---|---|
| docker が使えない | WSL2 側の docker セットアップが完了しているか |
| RC installer が失敗する |
hakoniwa-pdu-endpoint が隣接ディレクトリに clone されているか |
launch-rc-endpoint-win.ps1 が見つからない |
インストール先のパスが合っているか |
| joystick イベントが出ない |
rc-endpoint.py が古い可能性。install-rc-endpoint-win.bash を再実行する |
参考
GitHub
-
hakoniwa-drone-core
https://github.com/toppers/hakoniwa-drone-core -
v3.7.0 Release
https://github.com/toppers/hakoniwa-drone-core/releases/tag/v3.7.0 -
hakoniwa-pdu-endpoint
https://github.com/hakoniwalab/hakoniwa-pdu-endpoint
ドキュメント
-
Docker セットアップ
https://github.com/toppers/hakoniwa-drone-core/blob/main/docs/tips/wsl/docker-setup.md -
RC endpoint
https://github.com/toppers/hakoniwa-drone-core/blob/main/docs/tips/wsl/docker-rc-endpoint.md -
Launcher
https://github.com/toppers/hakoniwa-drone-core/blob/main/docs/tips/wsl/docker-launcher.md -
v3.7.0 変更点
https://github.com/toppers/hakoniwa-drone-core/blob/main/docs/upgrade_v3.7.0.md
解説記事
- 箱庭ラボ v3.7.0 リリース解説
https://hakoniwa-lab.net/2026/04/10/news-40/