Unity＋Pythonでドローン制御：実習や授業にそのまま使える箱庭ドローンシミュレータ

🧑‍🏫 Windows PCひとつで、Python APIを使って、仮想ドローンに「飛べ！」「進め！」と命令を送ります。

難しい制御理論は必要ありません。数行のPythonコードだけで、ドローンが応答してくれる体験ができます。

本記事では、Unityと『箱庭ドローンシミュレータ』、Python APIを使って、仮想ドローンを操作する方法を、教育・実習向けに解説します。

---

# 🎯 想定読者

- Pythonを使って「プログラムでモノを動かす」体験をしたい学生・教育関係者
- 実機を使わずにドローン操作を学びたい方（Windowsのみで完結）
- Unityやシミュレーション技術に興味のあるエンジニア・研究者


では、早速始めましょう。

# 💻 Windows環境

必要なものはこれだけです。


| ツール                | 用途               | 備考              |
| ------------------ | ---------------- | --------------- |
| Windows 11 / WSL2  | ホスト環境            | WSL2は必須（WSL1不可） |
| Ubuntu 24.04.2 LTS | 箱庭ドローンシミュレータ | WSL2内で動かします     |
| UnityHub/Unity(6.1)          | 可視化（任意）          | 自機やセンサの3D表示が可能  |
| Visual Studio Code | Python プログラム編集とコマンド実行用| - |

# 🛠 環境セットアップ

まずは、WSL2を起動です！

## 📦 箱庭ドローンシミュレータ本体

```bash
git clone --recursive https://github.com/toppers/hakoniwa-drone-core.git
```

クローンする場所は、WSL2/Ubuntuのホーム直下に `project` ディレクトリ作成して、そこで行うのがお勧めです。


クローンおわったら、WSL に docker をインストールしよう！

https://github.com/toppers/hakoniwa-drone-core/blob/main/docs/tips/wsl/docker-setup.md

## 箱庭Webサーバー

```
git clone --recursive https://github.com/toppers/hakoniwa-webserver.git
```

クローンする場所は、WSL2/Ubuntuのホーム直下に `project` ディレクトリ作成して、そこで行うのがお勧めです。

## 🎮 Unity環境

```bash
git clone --recursive https://github.com/hakoniwalab/hakoniwa-unity-drone.git
```

クローンする場所は、Windowsのファイルシステム（例えば `/mnt/c`)直下に `project` ディレクトリ作成して、そこで行うのがお勧めです。


クローン終わったら、Unity Hubで下図のように `Add` をクリックして、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/d0cd559e-17a0-4b31-b50a-61101b54a6a9.png)

hakoniwa-unity-drone/simulation を追加してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/058c1fa6-f97d-424a-b6e2-722245ea53d9.png)

成功すると、下図のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/04792c0b-aa57-4f3d-b6c3-d577c4f895b8.png)

そして、`simulation` をクリックすると、Unityが起動します。（何回か再起動メッセージがでますが、めげずにがんばりましょう） 

起動後、下図のように、プロジェクトビューから、`Scenes/WebAvatar` をクリック！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/8f117fcd-518f-42b4-9e33-d45c716b7901.png)

ヒエラルキービューの `HakoniwaWeb` を選択して、Inspectorビューの `Server Uri` のIPアドレスを、WSL2のIPアドレスを指定します。

WSL2のIPアドレスは、Ubuntu 上で `ifconfig` で `eth0` のものを入力します。

例：
```
tmori@WinHako:~/qiita$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.31.9.252  netmask 255.255.240.0  broadcast 172.31.15.255
```

ちなみに、デフォルトで動くドローンはこちらっす。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/404f64c2-b52a-4524-ba41-13c911ae06d2.png)

## Visual Studio Code のセットアップ

箱庭ドローンを Python で動かすには、Visual Studio Code を利用すると便利です。以下、インストールとセットアップ手順を説明します。

（Visual Studio Code は、必須ではありません、使い慣れたものがあればそちらで）

### 🧑‍💻 Visual Studio Code のインストールとセットアップ

以下の公式サイトから、インストーラーをダウンロードして実行します。

🔗 [Visual Studio Code ダウンロードページ](https://code.visualstudio.com/)

インストール時、以下のチェックを入れておくと便利です：

✅ 「code コマンドを PATH に追加する」
✅ 「右クリックメニューに 'Open with Code' を追加する」

Pythonスクリプトを書く＆WSL2内で実行するために、Visual Studio Code（VS Code）をインストールしましょう。
また、WSL2との連携に必要な拡張機能も忘れずに入れます。

### WSL/Ubuntu 側から VS Code を起動する

Ubuntu（WSL2）で以下のコマンドを実行します：

```bash
cd ~/project
code .
```

起動時、以下のダイアログが出ますが、`Allow` をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/4004b7f9-2f55-4de0-8b80-3d02cda11ecb.png)

起動後、左の `EXPLORER` から、`hakoniwa-drone-core/drone_api/api_control_sample.py`を選択すると、中央にPythonコードが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/f5742cfa-890f-4027-a71a-92e0eba4cd57.png)

（サンプルコードの説明は後程説明します。）

### WSL2端末を２個起動

この後、箱庭ドローンシミュレータとPythonプログラムの実行をするために、Visual Studio Code 上で、WSLの端末を２個起動しておきましょう。

最初に、メニューの `View->Terminal`を選択しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/c94085eb-955a-4429-82a9-320e06b67db8.png)

成功すると、画面下に、端末が現れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/dd1882d1-778e-4453-ae81-f9b3f29d24ec.png)

この状態で、

```bash
wsl
```
と実行すれば、OKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/4eab2117-d3b0-4da7-bc32-d6c1dce9941f.png)

次に、端末の右上にある`Split Terminal` をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/696408b5-e9d8-4c49-9831-cb83008cdd7b.png)

すると、もう一つ端末が増えますので、こちらも `wsl` を実行しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/ba369570-73f5-46ed-bf29-017311acf2b5.png)


# お疲れさまでした、さっそく動かしてみましょう

さー、やりましょう。

## docker コンテナに入ります。

左側のWSLの端末(端末A)で、以下を実行してください。

```bash
bash hakoniwa-drone-core/docker/run.bash
```

右側のWSLの端末(端末B)で、以下を実行してください。

```bash
bash hakoniwa-drone-core/docker/attach.bash
```

その後、`hakoniwa-drone-core/drone_api` に移動しましょう。

実行例：

```bash
tmori@WinHako:~/project$ bash hakoniwa-drone-core/docker/attach.bash
root@WinHako:~/workspace# cd hakoniwa-drone-core/drone_api/
root@WinHako:~/workspace/hakoniwa-drone-core/drone_api# ls
README-ja.md  README.md  assets  libs  rc
root@WinHako:~/workspace/hakoniwa-drone-core/drone_api# 
```

## 箱庭ドローンシミュレータを起動だ！

端末Aで、以下を実行してください。


```bash
bash hakoniwa-drone-core/docker/tools/run-hako.bash api
```

## Unity を起動！

Unityのプレイボタンをクリックするだけです。

成功するとこんな形でドローンが待機状態になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/fbe05484-a1bd-4fb0-b076-64a750ac4a4e.png)

## Python プログラムを実行！

端末Bで、以下のコマンドを実行しましょう。

```bash
 python3 rc/api_control_sample.py ../config/pdudef/webavatar.json
```

成功すると、Unity上のドローンが動き出します。


[![操作デモ動画](https://img.youtube.com/vi/VMPGR3FiiRY/0.jpg)](https://www.youtube.com/watch?v=VMPGR3FiiRY)

# サンプルプログラムの解説(api_control_sample.py)

## 🚀 main関数で何が行われているか？

main 関数では、デモでお見せしたドローンの操作プログラムが書かれています。

全体として、以下のような流れです。
```
[接続] → [LiDAR取得] → [離陸] → [移動＆つかむ] → [戻る＆離す] → [再びLiDAR] → [カメラ撮影] → [着陸]
```

ドローン操作のAPIは、Pythonで定義されたもので、以下で仕様を公開しています（AirSim風のAPIです）。

https://github.com/toppers/hakoniwa-drone-core/tree/main/drone_api/libs

また、簡単なAPI紹介をこちらでもしておりますので、ぜひご覧ください。

https://www.docswell.com/s/kanetugu2015/524RVN-2024-05-18-111952

### ① シミュレータへの接続

まず、以下のコードで、対象ドローンへの接続をします。

```python
client = hakosim.MultirotorClient(sys.argv[1], "Drone")
client.confirmConnection()
client.enableApiControl(True)
client.armDisarm(True)
```

### ② LiDARデータの取得・解析

次に、ドローンの前方に装着しているLiDARのデータを取得します。

```python
lidarData = client.getLidarData()
...
filtered_points = points[numpy.any(condition, axis=1)]
```

### ③ ドローンの基本操作：離陸・移動・荷物操作

その後、ドローンの基本操作で、離陸して、目的地へ移動して、荷物を運搬するプログラムが続きます。

```python
client.takeoff(0.5)
client.moveToPosition(...)
client.grab_baggage(True/False)
```

### ④ カメラ画像の取得

荷物運搬後、ドローン全貌に設置されたカメラで画像を取得します。

```python
png_image = client.simGetImage("0", hakosim.ImageType.Scene)
```
### ⑤ 着陸と後処理

そして、最後は、着陸です。

```python
client.land()
```