ニューヨーク上空をPS4コントローラで操縦！PX4連携可能な箱庭ドローンシミュレータの実力


ニューヨークのスカイラインを自由に飛び回ることができたら、あなたはどこを探検しますか？

なんと、PS4コントローラ一と「[箱庭](https://toppers.github.io/hakoniwa/)」というオープンソースのシミュレータを接続するだけで、デジタル空間上のさまざまな場所(※)でドローンを手軽に飛ばすことができちゃうのです！

(※) Unityアセットストアで3D配布されている場所ならどこでも

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/b2c816ee-abf4-3d6c-c5ef-a330c2b2599e.png)

上の画像は、[合同会社箱庭ラボ](https://hakoniwa-lab.net)が開発した [PX4](https://px4.io) 対応の箱庭シミュレータ上でドローン操作している風景です。

この記事では、PS4コントローラを使ってどのようにリアルなドローン飛行体験を再現したのか、そのプロセスと、このツールがどのようにドローン技術の開発とテストを変える可能性があるのかをご紹介します。

# はじめに

今回ご紹介するものは全て完全フリーでオープンソースだけで構築していますので、ゲーミングPCがあれば誰でも手軽にお試しいただくことができます。

以下に少しでも興味のある方は、ぜひ斜め読みしてみてください！「いいね」お願いします！

* ドローンシミュレータを使ってみたい方
* PX4を知りたい方、触ってみたい方
* Unityアセットストアで3Dモデルを利用してみたい方
* ドローンの物理式やドローン飛行の仕組みを数式/C言語実装レベルで理解したい方
* オープンソース「箱庭」について知りたい方

# PX4とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/716a7435-15cf-9efc-c314-eab543e5da1b.png)

[PX4](https://px4.io/)とは、高度なドローン制御と自律飛行を可能にするオープンソースのフライトコントロールソフトウェアプラットフォームです。BSD 3-Clause Licenseのもとで一般に公開されており、幅広い開発者コミュニティによる貢献とサポートを受けています。

主な特徴は以下の通りでです。

* [モジュール式のアーキテクチャ](https://docs.px4.io/main/en/modules/modules_main.html)
  * PX4はモジュール式で設計されており、異なるセンサーやアクチュエータに容易に対応できます。また、モジュール間の通信方式は ROSのトピックと同様な pub/subモデル([uORB](https://docs.px4.io/main/en/middleware/))でメッセージ交換する設計です。これにより、ドローンの設計者やオペレーターは、様々な構成のドローンに対応する柔軟性を持っています。
* [飛行ログ分析ツール](https://docs.px4.io/main/en/log/flight_log_analysis.html)
  * PX4のモジュールの通信やロギングデータは、ビジュアライズするためのツールが豊富にあります。
* [広範なサポート](https://docs.px4.io/main/en/hardware/):
  * PX4は、多くのハードウェアプラットフォームや飛行制御システムでサポートされており、幅広い用途やプロジェクトに適用可能です。
* [コミュニティによる開発とサポート](https://docs.px4.io/main/en/contribute/):
  * このプロジェクトは活発なコミュニティによって支えられており、定期的にアップデートが行われ、新しい機能が追加されています。
* [シミュレーション環境の統合](https://docs.px4.io/main/en/simulation/):
  * PX4はシミュレーション環境(Gazebo, Airsim, jmavsim)との連携が可能で、実際の飛行前にドローンの動作を安全にテストすることができます。

# ドローンシミュレーションの基本

PX4はドローンのフライトコントローラにインストールされ、PX4上で動作するアプリケーションがドローンを制御します。

ただ、いきなり本物の機体を飛ばしてしまいますと、失敗した時の代償が大きいですよね。高価な機体が壊れたり、どこかにぶつかって損傷を与えたりといったことが考えられます。

そのため、本物の機体を飛ばす前に、シミュレーション環境上でドローンを飛ばして動作チェックをした方が良いと思います。

そして、PX4には、シミュレータと連携するためのアーキテクチャが既に備わっています（下図）。

![スクリーンショット 2024-01-06 14.24.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/5844231c-5e42-cbb7-9931-77d26449f6d8.png)

PX4 on SITL と呼ばれるモードで PX4をビルドして起動すると、Simulatorと接続することができます。
現時点で、PX4はさまざまなシミュレータとの接続を可能にしていいます。以下、一例を挙げます。

* [Gazebo](http://docs.px4.io/main/en/sim_gazebo_gz/)
* [jMAVSim](http://docs.px4.io/main/en/sim_jmavsim/)

また、地上局のアプリーケーションである [QGroundControl](http://qgroundcontrol.com)との接続も本番環境と同様に接続可能ですので、シミュレーション環境上で機体を地上局から操作することもできてしまうのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/fffd36ae-4e05-6726-bddd-ec24e96841dc.png)

こんな感じで、機体の緯度軽度情報から実際の地図とマッピングしてくれて、機体を移動させたい場所に指示を出すことができます。赤い線は、実際に機体が移動した軌跡です。

# ニューヨーク上空のシミュレーション

さて、このように素敵な PX4 の環境を使って、実際にニューヨーク上空でドローンを飛ばすことは、多くの人にとって魅力的な体験です。しかし、現在サポートされているシミュレータ（Gazeboなど）では、このような複雑な環境を再現するのは少し骨が折れます。例えば、リアルな都市のスカイラインや建物の3DデータをGazeboのモデルとして統合する必要があります。

一方で、Unityアセットストアには、ニューヨーク市のリアルな3Dモデルが提供されておりますので、Unityと親和性の高い「箱庭」というシミュレータを使って、PX4と統合することで、リアルな都市環境でのドローン飛行をシミュレーションすることが可能なのです。

https://assetstore.unity.com/packages/3d/environments/urban/real-new-york-city-vol-1-208247

![スクリーンショット 2024-01-06 14.47.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/2683e70a-700f-7d0f-216f-e680d948f541.png)

# 実演します

論より証拠、箱庭を使ってニューヨーク上空を飛行する様をお見せします。

https://twitter.com/kanetugu2020/status/1743230196206158153


画面左側に VSCode上で実行されている、箱庭とPX4があります。そして、画面右側がUnityです。最初に箱庭とPX4を起動した後に、Unityを接続します。Unityには、Unityアセットストアでダウンロードしたニューヨークの3Dモデルが配置されています。

シミュレーション開始すると、ドローンは待機状態となりますので、[PS4コントローラー](https://www.amazon.co.jp/ワイヤレスコントローラー-DUALSHOCK-4-ジェット・ブラック-CUH-ZCT2J/dp/B01LPTFJ8W/ref=asc_df_B01LPTFJ8W/?tag=jpgo-22&linkCode=df0&hvadid=281708167656&hvpos=&hvnetw=g&hvrand=11686668277162981764&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009379&hvtargid=pla-524067794350&psc=1&mcid=f382575eb7c131cfb4e5cea879bfb508&th=1&psc=1)で操作きるようになります。

PS4コントローラの設定と操作方法はこちらの記事で詳細な説明があります。

https://qiita.com/ft28/items/9542ead1ab29df734f89#qgroundcontrolにおけるps4コントローラ設定


# 必要なもの

さて、こんな素敵なシミュレーション環境がオープンソースを利用して、完全フリーで利用できるようになりますが、必要なものって何にかと言いますと、一般的なゲーミングPCとPS4のコントローラーがあれば十分なのです。

* ハード
  * Unityがある程度サクサク動くパソコン（Windows or MacOS)
  * PS4コントローラ
* ソフト
  * [QGroundControl](http://qgroundcontrol.com)
  * [Unity](https://unity.com/ja)
  * [VSCode](https://azure.microsoft.com/ja-jp/products/visual-studio-code)

# セットアップ方法

そして、セットアップ方法ですが、箱庭ドローンシミュレータは、Github上で [TOPPERSライセンス](https://www.toppers.jp/license.html)で一般公開されています。

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

ニューヨークの3Dモデルの統合以外は、こちらに全てが記載されておりますので、興味のある方はぜひチャレンジしてみてください！

# ニューヨーク3Dモデルの統合方法

ここまでのセットアップが出来ていれば、あとはニューヨーク3Dモデルをダウンロードして、箱庭のUnityモデルに入れるだけです。

詳細な手順は省略しますが、基本的な手順を以下に示します。

1. 箱庭をインストールしたUnityエディタを開きます。
1. ニューヨーク3DモデルをUnityアセットストアからダウンロードし、インストールします。
1. ![スクリーンショット 2024-01-06 15.04.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/92332c6a-3e61-3397-17df-c69e1e7136c5.png)
1. インストール成功すると、上図のように、NYBlock02があることを確認します。
1. 次に、箱庭のUnityシーンを選択して、ダブルクリックします。
1. ![スクリーンショット 2024-01-06 15.06.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/7807368e-77ca-1e83-c046-f65d0a6f68e4.png)
1. そして、ヒエラルキービューを開き、下図のようにHakoniwa/ENV直下に、先ほどのNYBlock02をドラッグ＆ドロップします。
1. ![スクリーンショット 2024-01-06 15.07.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/ee6bc71d-938a-0552-25b7-35128e4e0d53.png)
1. 若干の位置調整をしてあげることで、下図のようにドローンとニューヨークの3Dモデルが統合されます。
![スクリーンショット 2024-01-06 15.09.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/d3f4a955-7262-f617-3d8b-82227cff87d2.png)


# ドローンの物理演算はどうやっているのか？

実は、ここで動作しているドローンは、Unityの物理エンジンを使っていないのです。

純粋に、ドローンの基本的な物理方程式をベースにして、数式をC言語に変換して、数値シミュレーションしているのです！！

![スクリーンショット 2024-01-06 15.22.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/15b8a02a-bb3d-6ffc-8351-605cc28a4666.png)

ドローンの物理式やドローン飛行の仕組みを数式/C言語実装レベルで理解したい方は、ぜひ、以下の解説を参照してください。

https://github.com/toppers/hakoniwa-px4sim/blob/main/drone_physics/README-ja.md


なお、2nd-releaseでは、MATLAB/Simulinkで生成されたプラントモデルのコードも取り込めるようにする予定です。乞うご期待ください！

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

# 箱庭のアーキテクチャと特徴

さて、ここまでお読みになった方は、相当技術的に明るい方だと思いますので、このシミュレーション環境の全体像をお見せしましょう。

![スクリーンショット 2024-01-06 15.28.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/6af9c5a0-3f97-ac15-8fa7-ca06c8da89dd.png)


左側の絵は、PX4と接続するための構成であり、先ほど説明した通りです。

右側の絵が、箱庭というシミュレータ側の構成になっております。

ドローンの物理式をC言語実装として駆動している部分が、hakoniwa-px4simというモジュールです。このモジュールがPX4と連携しながら、物理演算を実施しているのです。

そして、Unityとは「箱庭」という**シミュレーションハブ**が接続しています。

こういう構成をとっていますので、実は UnityなしでもPX4との連携シミュレーションが可能であるところが面白いところであり、すごく有意義なところになっています。

それは、GUIなしで、シミュレーションができるのです。つまり、CI/CDとの相性がすごく良いのです。

画面右下に、scenario controllerというものがありますよね。これが、与えられたテストシナリオベースにシミュレーションを自動実行するモジュールなのです。

こういう構成をとっていますので、最初はUnityを使って直感的な理解を進め、ある程度、制御がうまくいき出したら、さまざまなテストパターンでテストを自動実行することができますし、品質を安定させたコード管理も実現できるのです。

ちなみに、現在、箱庭ドローンシミュレーションの開発でもこの機能は十二分に活躍しておりまして、機体のパラメータ探索として利用しています。

これは、そのパラメータ探索結果をグラフ化したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/7d79a4e6-3876-53b3-8f80-0bb5adf15081.png)

赤くなっているところが、良い飛行をしたところで、青くなってるところが不安定な飛行になっているところです。夜間にパラメータ探索用のスクリプトを流して、朝、冴えた頭でグラフ化して分析をかけれるというわけです。

# 最後に

PX4と連携できるシミュレータはそれほど多くありませんが、国産で箱庭というドローンシミュレータが新しくラインナップされると思うと、とってもワクワクします。

![スクリーンショット 2024-01-06 15.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/62fb2ed3-6c76-4c1f-570e-18c86cd988a4.png)

もし興味のある方や開発を一緒にされたいと思われる方いらっしゃいましたら、ぜひ、一緒にやりましょう！