WSL2上のPX4シミュレータにWindows上のQGroundControlからアクセスする

# はじめに
PX4、ArduPilotのGCSであるQGroundControlの調査・検証用にPX4シミュレータ環境が必要になったため、WSL2を使って構築してみました。

本来はUbuntu、Windowsのいずれかに寄せた方がよいかと思いますが、プログラミングは普段慣れてるWindowsで、PX4のビルドと実行は安定している（ハマりが少ない）Ubuntuで、というニーズを想定しています。

# 動作環境
![PX4WSL2QGC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106662/3d51947b-0fb2-e1ad-2754-f319931d600f.png)


|Software|Version|Commnets|
|----|----|----|
|Windows|10|ホストOS|
|[QGroundControl](http://qgroundcontrol.com/)|4.0|GCS(GroundControlStation)。Windowsに導入|
|WSL|2|Windowsに導入|
|Ubuntu|20.04LTS|ゲストOS。WSL2に導入|
|[jMAVSim](https://github.com/PX4/jMAVSim)|2021/10時点最新|Java製シミュレータ。Ubuntuに導入|
|[PX4](https://github.com/PX4/PX4-Autopilot)|1.13|フライトコントロールソフトウェア。Ubuntuに導入|



------
## WSL2&Ubuntu導入(Windows)
1. 下記記事を参考にWSL2とUbuntuをインストール。
    https://qiita.com/pyon_kiti_jp/items/0be8ac17439abf418e48

1. 下記記事を参考にUbuntuのGUI環境をセットアップ。
    https://qiita.com/ryoi084/items/0dff11134592d0bb895c

## QGroundControl導入(Windows)
1. http://qgroundcontrol.com/ を開いて上部メニューの `DOWNLOADS` > `WINDOWS` をクリック。
2. ダウンロードされたインストーラを開いて指示に従いインストールを完了させる。 

## PX4セットアップスクリプト実行(Ubuntu)
* 参考URL ... https://docs.px4.io/master/en/dev_setup/dev_env_linux_ubuntu.html  
 
1. GitHubからソースコードを取得

    ```bash
    $ git clone https://github.com/PX4/PX4-Autopilot.git --recursive
    ```

1. セットアップスクリプトを実行。  

    ```bash
    $ bash ./PX4-Autopilot/Tools/setup/ubuntu.sh
    ```

## jMAVSimに必要なJava環境導入(Ubuntu)
* 参考URL1 ... https://docs.px4.io/master/en/simulation/jmavsim.html
* 参考URL2 ... https://github.com/PX4/jMAVSim


1. 下記コマンドを実行してjMAVSimのビルド・実行に必要なJDK、JRE、Antをインストール。

    ```
    $ sudo apt-get install ant openjdk-13-jdk openjdk-13-jre libvecmath-java -y
    ```

## PX4ビルド&SITL起動(Ubuntu)
* 参考URL ... https://docs.px4.io/master/en/dev_setup/building_px4.html 

1. 下記コマンドを実行。PX4のビルドが開始される。  

    ```bash
    $ cd PX4-Autopilot
    $ make px4_sitl jmavsim
    ```
    * jMAVSimをヘッドレスモード（GUI無し）で起動する場合は`HEADLESS=1`をコマンド先頭に追加する。

1. ビルドが成功するとシミュレータが起動する。下記のように表示されたらOK。

    ```
    (((省略)))    
    ______  __   __    ___ 
    | ___ \ \ \ / /   /   |
    | |_/ /  \ V /   / /| |
    |  __/   /   \  / /_| |
    | |     / /^\ \ \___  |
    \_|     \/   \/     |_/
    
    px4 starting.
    
    INFO  [px4] Calling startup script: /bin/sh etc/init.d-posix/rcS 0
    (((省略)))
    pxh>
    ```

## MAVProxyを使ったテレメトリ転送(Windows&Ubuntu)  
* Ubuntu/WSL2上のlocalhostにWindowsからアクセスできないため、MAVProxy（ルーティング機能を持つCLIのGCP）でテレメトリを転送する必要がある。   

1. `ipconfig` などでWindwos のIPアドレスを調べる。
1. MAVProxyがインストールされてない場合、下記コマンドを実行してインストールする。  

    ```bash
    $ sudo apt-get install python3-dev python3-opencv python3-wxgtk4.0 python3-pip python3-matplotlib python3-lxml python3-pygame
    $ pip3 install PyYAML mavproxy --user
    $ echo "export PATH=$PATH:$HOME/.local/bin" >> ~/.bashrc

    ```

1. 新しいUbuntuのウィンドウを開いて下記コマンドを実行する。  

    ```bash
    $ mavproxy.py --master 127.0.0.1:14550 --out ＜WindowsのIPアドレス＞:14550
    ```
    * 本設定によりWindowsからアクセス可能となる

## QGroundControl起動(Windows)
1. WindowsスタートメニューからQGroundControlを起動。
2. 左上のQGroundControlロゴボタンを押下 > 左メニューの`Comm Links`を押下 > 画面下部の`Add`を押下 。
    ![QGC01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106662/a85ce50c-d7d3-d363-92e2-4ef24960d28c.jpeg)

3. 下記の通り入力（他はデフォルト値）して`OK`を押下。
    * Name ... 任意の名前  
    * Type ... UDP  
    * Automaticaly Connect On Start ... チェックあり  
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106662/d696b9f2-b6fc-5603-f6dd-c2ced7db1db1.png)

4. 上記手順で作成された接続を選択して`Connect`を押下。
5. 接続成功を示すメッセージが表示され、右上に`PX4`のロゴが表示されていたらOK。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106662/d3bbec5a-4d0d-fd67-81ee-e5c271efa400.png)

# 動作シーン
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/t_mac116?ref_src=twsrc%5Etfw">@t_mac116</a> <br>もう不要かもしれませんが、WSL2上のPX4 SITLからWin上のQGCからの接続を確認しました。<br>（手順は後述 <a href="https://t.co/TTFfVrSKAy">pic.twitter.com/TTFfVrSKAy</a></p>&mdash; fujihide (@hfujikawa77) <a href="https://twitter.com/hfujikawa77/status/1452511800759500801?ref_src=twsrc%5Etfw">October 25, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# まとめ
使い慣れたWindowsでPX4の検証環境ができました。