2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windows 11 / WSL2 / Docker + ゲームパッドで MuJoCo 版 箱庭ドローンシミュレータを起動する

2
Posted at

この記事では、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.out
  • config/launcher/logs/web-bridge-game.out
  • config/launcher/logs/*.err

drone-serviceweb-bridge-game が起動しない場合は、まずここを確認します。

2. シミュレーションログ

drone_config_0.jsonsimulation.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.jsoncontroller.paramFilePath から参照されます。

プロペラ名は揃えておく

drone_config_0.jsoncomponents.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.xmlbody name を参照しています。
このため、drone.xml 側のプロペラ body 名もこれと一致させる必要があります。
数だけでなく、順序と名前の両方を合わせておくのが安全です。

順序がズレると、モータと制御信号の対応関係が崩れ、意図しない挙動になります。

座標系もそのまま同一ではない

もう 1 つ注意点があります。
drone.xml の配置と drone_config_0.jsonthruster.rotorPositions は、同じ座標系の値ではありません

  • drone.xml は MuJoCo 側の FLU
    • X: Forward
    • Y: Left
    • Z: Up
  • drone_config_0.jsonrotorPositions は箱庭側の FRD
    • X: Forward
    • Y: Right
    • Z: Down

つまり、少なくとも Y 軸の向きは反対です。
そのため、drone.xmlpos をそのまま rotorPositions にコピペしてよいとは限りません。

例えば prop1 を見ると、drone.xml では次の位置です。

<body name="prop1" pos="0.18 -0.18 0.02" childclass="black">

一方、drone_config_0.jsonthruster.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 方向ですが、YLeftRight で向きが逆です。
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

ドキュメント

解説記事

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?