Windows11＋MINI-PCでコンパクトにPX4連携ドローンシミュレーションをやろう

# はじめに

[箱庭ドローンシミュレータ](https://github.com/toppers/hakoniwa-px4sim)は、誰でも手軽に利用できることを目指しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/747648b6-3311-97a8-de2d-72b324ecfc73.png)
図：[ニューヨーク上空をPS4コントローラで操縦している風景](https://qiita.com/kanetugu2018/items/11f9c90aa2711eba5f7f)

この記事では以下の２点をお話しします。

1. 低価格でリーズナブルなスペックのMINI-PCで動作確認したこと
1. 箱庭ドローンシミュレータをWindowsアプリで動かせるようにしたこと

# MINI-PC

![スクリーンショット 2024-02-24 18.43.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/30cb5cfd-573a-b443-54da-b381e4561acb.png)

価格は３万円前後で販売されているMINI-PCを利用しました。
スペックは以下の通りです。

* メモリ： 16GB
* CPU： Intel(R) N100 4コア
* GPU: Intel(R) UHD Graphics 7.9GB
* SSD: 500GB
* OS: Windows11

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

これまで、箱庭ドローンシミュレータをWindowsで動かそうと思った場合、箱庭側のプログラムは、WSL2上にインストールした docker が必要でした(下図)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/c8d665a9-2b90-b430-5c44-72c3d6e4d779.png)

上図の通り、左側の箱庭プログラムは、WSL2及びDocker環境で動作し、UnityとはTCP及びUDPで通信しています。モジュール間の結合を疎結合にしているのでこういう構成になっていますが、弱点は以下の２点です。

1. 通信オーバーヘッドは避けられない
1. 環境構築でつまづく可能性が多かった（Dockerとか通信ポートのセキュリティ設定など）

今回、異なるパターンの箱庭のアーキテクチャ（下図）をWindowsで実行できるように。

![スクリーンショット 2024-02-24 18.23.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/2b73bf47-5316-9b81-45c0-47f0bbcd0414.png)

特徴的なポイントは以下の通りです。

* MacOS、Ubuntu、Windowsともに同じアーキテクチャ
* 共有メモリベースでの通信であるため、通信オーバーヘッドはそれほど大きくない
* 環境構築が容易（DockerとかWSL2とかインストールしなくてもよい）

# インストール手順

インストール手順は以下の通りです。たったの３ステップで終わります！
（READMEのインストール作業はもう少し多いです...。)

1. 箱庭ドローンシミュレータ一式をダウンロード
1. 解凍してREAMDE.txtを読む
1. インストールを実施する

基本的には、READMEの手順を実施いただければインストールできますが、いくつか補足するポイントをご説明します。

## ファイル内訳

ダウンロードしたファイルを解凍するとたくさんのファイルが見えると思いますが、重要なファイルは以下の通りです。

```
hakoniwa-px4-win
├── README.txt
├── hakoniwa
│   ├── DroneWinNative
│   │   └── model.exe ... Unityアプリです
│   ├── bin
│   │   └── run-win.bat
│   └── config
│       ├── cpp_core_config.json ... 箱庭コンフィグファイルです
│       └── drone_config_0.json ... 機体パラメータ定義ファイルです
├── out
│   └── build
│       └── x64-Debug
│           └── hakoniwa
│               └── src
│                   └── hako-px4sim.exe ... 箱庭ドローンシミュレータのWindowsアプリです
└── px4
    └── simstart.bash ... Windows用のPX4起動スクリプトです
```

# インストール時のポイント

インストール作業では以下を実施する必要があります。

1. 環境変数の設定
1. RAMDISKの作成
1. 箱庭のコンフィグファイルの設定
1. PX4の準備

# シミュレーション実行

シミュレーション実行は以下の３ステップです。

1. [PX4を起動](https://github.com/toppers/hakoniwa-px4sim/blob/main/README-ja.md#%E7%AB%AF%E6%9C%ABa)
2. hakoniwa\bin フォルダをエクスプローラで開き、run-win.bat をダブルクリック
3. hakoniwa\DroneWinNative フォルダをエクスプローラで開き、model.exe をダブルクリック

[![Windows版箱庭ドローンシミュレータのデモ](http://img.youtube.com/vi/ryD9-AnFGHM/hqdefault.jpg)](https://www.youtube.com/watch?v=ryD9-AnFGHM "Windows版箱庭ドローンシミュレータのデモ")

# 開発者ノート

ここまでは、どれだけ簡単に箱庭ドローンシミュレータを使えるようになったかの説明でしたが、実はここに行き着くまでに大変苦労しましたので、苦労話を書かせてください。

これまで箱庭は、UbuntuやMacOSのようなPOSIX系のOSに焦点を当てていましたが、今回はじめて箱庭のソースコードを全て Mirosoft Visual Studio を使ってビルドできるするというチャレンジをしました。

# Windowsでのビルド方法

対象コードは以下の３つのリポジトリです。

* [hakoniwa-core-cpp](https://github.com/toppers/hakoniwa-core-cpp) 
* [hakoniwa-core-cpp-client](https://github.com/toppers/hakoniwa-core-cpp-client)
* [hakoniwa-px4sim](https://github.com/toppers/hakoniwa-px4sim)

ここで、箱庭のコードは全て cmake でビルドできるようにしています。
これをそのまま Visual Studio で使えないか？と思って調べたところ、Visual Studio では、対象プロジェクトをそのままオープンしてあげると、自動で cmake が始まり、ビルドできるということがわかりました（これには驚きでした）。

# ビルド地獄

そして、ビルド地獄の始まりです。

## 1日目

まず、hakoniwa-core-cppとhakoniwa-core-cpp-clientですが、これらは以前から MingWでビルドしていたので、割とすんなり行ったのですが、それでも半日くらいかかりました...。

最難関は、hakoniwa-px4sim です。このコードは試作用に作ってきたコードが沢山あり、Windowsとの互換性は気にせず作ってきてました。

ファイル数は１００個弱、ソース規模は、10kstep強。

そして、ビルドを始めたら大量のそうめちゃくちゃ大量の警告とエラーログが出ました。そして心が砕かれ、１日目の作業を終了しました。

## 2日目

出てきた警告とエラーを全てチェックして、課題を整理したところ、以下の９個に集約できました。この調査で半日かかりました。

- [x] M_PI の定義がWindowsにはなない
  - osdep.h を drone_physics 直下に配置し、そこで定義する 
- [x] 日本語のコメントはエラーになる
  - 日本語コメントは削除する
- [x] 警告：引数変数・ローカル変数とクラスメンバの変数名が重複すると警告発生
  - 引数、ローカル側の変数名を変更する
- [x] TCP通信用のAPIがWindowsでは異なる
  - windows版を作成する
- [x] TCP通信用の初期化API WSAStartup を最初に呼び出さないといけない。
  - 起動処理で呼び出す
- [x] ダイナミックローディング用のAPIがWindowsでは異なる
  - windows版を作成する
- [x] usleep がWindowsにはない
  - windows版を作成する
- [x] unistd.hがWindowsにはない
  - osdep_api.hでをhakoniwa側に作成しそこで対応する
- [x] pthreadがWindowsにはない
  -  C++のスレッドを使う

移植で一番怖いのは、デグレです。

今回、デグレないように、実施したことは以下あたりです。

* 既存コードは基本変更しない
* 変更する場合は、入念にコードレビューする
* 可能なら単体テストをしっかりやる
* 追加機能開発が必要な場合は、シンプルな設計と修正コードの局所化
* ChatGPTを最大限に利用する
  * 自分が作ったコードは、レビューしてもらう
  * ChatGPTに作ってもらったコードは、自分がレビューする
* そして、これまでの機能テストを一通り実施する


なお、これがその時の issueです。

https://github.com/toppers/hakoniwa-px4sim/issues/167

とっても大変な作業でしたが、なんとか２日でおさまりました...。

おつかれさまでした！また頑張っていきますー。