PX4シミュレーション環境(jMAVSim + HITL)

[前回](https://qiita.com/ft28/items/9542ead1ab29df734f89) は、SITL(Software In The Loop)を使ったPX4シミュレーション方法について書いたので、今回は、HITL(Hardware In The Loop)を使ったシミュレーション方法について書いてみます。

## 環境構築
PX4のソフトウェア環境は、前回手順で揃ってるものとして、HITLに必要な手順だけを記述します。
詳しくは、[HITL Simulation · PX4 Developer Guide](https://dev.px4.io/en/simulation/hitl.html)を参照してください。

### 0. フライトコントローラ購入
3D Robotics の純正 Pixhawk は販売終了していますが、Pixhawkはオープンハードのため、いろいろな会社から互換品が販売されています。[ebay](https://www.ebay.com/)や、[AliExpress](https://ja.aliexpress.com/) では、今でも4000円-20000円 で購入可能です。互換品の品質はよくわからないので、PX4対応のフライトコントローラをしっかりとサポートが期待できそうな会社から購入するのがよいかもしれません。

*　[px4対応ハードウェア](https://docs.px4.io/en/flight_controller/)

### 1. Pixhawkに最新PX4インストール
Pixhawk とパソコンをusb ケーブルでつないだ後、以下コマンドで最新ファームウェアをインストールします。
Firmware ディレクトリで、makeコマンドを実行して以下のように表示されれば成功です。

```bash
cd Firmware
make px4fmu-v2_default upload
...
Erase  : [====================] 100.0%
Program: [====================] 100.0%
Verify : [====================] 100.0%
Rebooting.
...
```

px4fmu-v2_default の部分は、フライトコントローラの種類によって変わってくるので、
https://dev.px4.io/en/setup/building_px4.html の Building を見て適当に変更してください。
以下説明は、Pixhawkを前提としますが、このmakeコマンド以外はどのフライトコントローラでも問題無いはずです。

### 2. Pixhawk 設定
Pixhawk上のメモリにHITL用の設定を書き込みます。一度設定すれば電源を切っても保存されます。

#### PixhawkとQGroundControlの接続

パソコンとPixhawkをUSBケーブルでつないだ状態で、QGroundControlを起動します。
QGroundControlが起動したら、画面上部の一番左のボタンを押して、Application Setting 画面に切り替えて、Comm Linksボタンで接続設定画面を表示、ADDボタンで新しい接続の作成画面を表示します。

接続作成画面では、

name: serial(適当な名前を設定)
Type: serial
Serial Port: ttyACM0
Baud Rate: 57600

と設定してOKボタンで登録を行います。登録が完了すると以下のような画面が表示されるので、[serial]ボタンをクリックしたと、[connect]ボタンをクリックすると、QGroundControlと、PX4が接続された状態になります。

![serial.png](https://qiita-image-store.s3.amazonaws.com/0/247417/8e32fc04-e641-b37e-5aa0-dba8cb5f49de.png)

#### UDP 設定
上のメニューで一番左、左のメニューでGeneralを選択後、メイン画面をスクロールして、「AutoConnect to the following devies」で、UDPだけが選択された状態にします。

![udp.png](https://qiita-image-store.s3.amazonaws.com/0/247417/0201b66a-95a8-aaee-2548-94de3eb0f52b.png)

#### Air Frame設定
上のメニューで左から二番目、左のメニューからAir Frameを選択後、メイン画面で、Simulation(Copter) を選択します。
![hilcopter.png](https://qiita-image-store.s3.amazonaws.com/0/247417/1c287497-69d2-bb3c-242b-6a1fc8c97676.png)

#### パラメータ設定
上のメニューで左から二番目、左のメニューで parameter を選択後、Search boxにSYS_COMPANIONと入力して、SYS_COMPANION パラメータを 「921600 baud, 8N」に設定します。中央のリストをクリックすると、右側に、値選択画面と save ボタンが出現します。saveボタンを押すのを忘れないでください。

![param.png](https://qiita-image-store.s3.amazonaws.com/0/247417/87fb0305-54dc-4c9a-7cad-da17039bed91.png)

同様にして、COM_RC_IN_MODE を 「Joystick/No RC Checks」に、NAV_DLL_ACT　を 「Disabeld」に設定しておきます。 
**シミュレーション時に、Joystickではなくプロポを使う場合、こちらの設定は不要です。**

#### Safety設定
上のメニューで左から二番目、左のメニューで 「Safty」を選択し、HITL Enabled: を Enabledに変更します。

![HITL.png](https://qiita-image-store.s3.amazonaws.com/0/247417/9ff66775-0b60-fcc1-4b9b-d31f27a9d569.png)

#### JoyStick 設定

### 3. シミュレーション実行
いったん、QGroundControl を停止、USBケーブルをつなぎなおして、Pixhawkか起動したことを確認した後、
シミュレータを起動します。シミュレーション画面が起動してしばらくすると、青く点滅していたPixhawkのLEDが緑色に点滅するようになります。

```bash
./Tools/jmavsim_run.sh -q -d /dev/ttyACM0 -b 921600 -r 250
```
QgroundControlを起動すると、自動的にPixhawkとQgroundControlが接続され、Joystickによって、シミュレーション画面上のドローンがコントロール可能になります。

## 課題
今回、Pixhawkを使ってシミュレーションを行っている時に以下のような問題がありました。

### 1. PixhawkとPCの通信不具合
最初、実験に使っていたパソコンではUSBポートに問題があるのか、pixhawkとPCの通信が出来ないという状態が発生しました。他のパソコンに切り替えたところ解消したのですが、ソフト側の問題を疑って、かなりの時間を消費してしまいました。

### 2. シミュレーション不具合
シミュレーション実行中に、センサーエラーが発生したり、Joystick経由でarmできるのに、その後機体を上昇させようとしても、シミュレーション画面上で機体が上昇しなかったりするといった問題が発生し未だ解決していません。

**ebayで一番安いPixhawkを購入したのですが、それが失敗だったかもしれません。**シミュレーション画面にあわせてLEDががチカチカさせたり、スピーカーを鳴らすのは楽しいのでなんとかしたいのですが、しばらくは、SITLで開発することにします。