ArduPilotで、シミュレーション（SITL + FlightGear） on MacOS

ArduPilotで、シミュレーションは、SITL + FlightGearがよく見られる構成ですが、Macで環境整備すると、幾つかはまりポイントがあります。

Linux(Ubuntu)で動かす場合は、以下が参考になります。

https://ardupilot.org/dev/docs/setting-up-sitl-on-linux.html

pythonの仮想化のため、anacondaを使っている前提です。
Catalinaで、anacondaは苦労があるので、以下が参考になるかもしれません。

https://tako1192.hatenablog.com/entry/2019/10/12/OSX_Catalina_%E3%81%A7Anaconda%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
https://qiita.com/akinko/items/1909c8d0145d9ba530b9

最初にXcodeのCommand line tools が必要ですが、anacondaを使っている場合、既に入れているはずです

```sh
$ xcode-select --install
```

anaconda の環境を作ります。

```
$ conda create -n ardupilot python=3.7


以下の通り、必要なものを入れます。


```sh
$ git clone https://github.com/ArduPilot/ardupilot
$ cd ardupilot
$ git submodule update --init --recursive
$ ./Tools/environment_install/install-prereqs-mac.sh
```

最後の今日は、`pip2`で失敗します。
以下の通り手動実行

```
$ pip install pyserial future empy mavproxy pexpect
```

Flight Gear のMac版を以下からダウンロードし、インストールします。インストールは通常のMacアプリと同じで、Applicationsフォルダに放り込んでください。

https://www.flightgear.org/download/

Mac で、fgfs コマンドを使うには、以下の通りパスを通す必要があります。
以下を`~/.zshrc`などに書いてください。

```sh
export PATH=$PATH:/Applications/FlightGear.app/Contents/MacOS
```

正しく設定できていれば、以下のように実行できます。

```
$ fgfs --version
    0.02 [INFO]:general    FlightGear:  Version 2019.1.1
```

次に、Ground controllerを入れます。Windows/Linux環境だと、Mission Planner が一般的ですが、Macですと、QGroundControllerの方が、インストールが楽です。
こちらも、通常のMacアプリと同じで、Applicationsフォルダに放り込んでください。

https://docs.qgroundcontrol.com/en/getting_started/download_and_install.html

あとは、以下のように実行するだけなのですが、Macでanaconda環境だとエラーが出ます。

```
$ cd ardupilot/Tools/autotest
$ ./sim_vehicle.py -v ArduCopter -L KSFO --map --console
```

以下のようなエラーで、これは、Pythonを`--enable-framework`でビルドしていない場合に出るエラーです。

```
This program needs access to the screen. Please run with a
Framework build of python, and only when you are logged in
on the main display of your Mac.
```

通常、これは、python.appを入れて、`pythonw`を使って実行すれば解決します。

```sh
$ conda install python.app
```

しかし、sim_vehicle.py を使っていると、中で、mavproxy.pyをコマンドとして呼んでいて、そこで、pythonを
実行しています。これが、上記のエラーを出しているので、ここを修正の必要があります。私は単に、
[`cmd.append("mavproxy.py")`](https://github.com/ArduPilot/ardupilot/blob/132a1623d37d18b7d216377efb09e6980be993a8/Tools/autotest/sim_vehicle.py#L642)となっている部分を以下のように修正しました。（他にも、良い方法があると思います。。）
以下、mavproxy.pyのパスは、自身のパスに置き換えてください。`which mavproxy.py`をすれば分かります。

```
        cmd.append("pythonw")
        cmd.append("/Users/ikeyasu/anaconda3/envs/ardupilot/bin/mavproxy.py") // <=== ここは自身のパスに置き換え
```

改めて、以下のコマンドを実行すると、新しくターミナルが1つ立ち上がり、マップと、コンソール画面が出ます。

```
$ cd ardupilot/Tools/autotest
$ ./sim_vehicle.py -v ArduCopter -L KSFO --map --console
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/dcd0cd30-c2a2-b4b7-e791-7152caef9688.png)

次に、QGroundControllerを実行してください。
この時点で正しく実行できていれば、先に実行した`sim_vehicle.py`の機体に接続されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/bf4e8e5a-9484-3c43-7b87-c90408ea1659.png)

最後に、別のTerminalで、以下の通り、Flight Gear を起動してください。

```
$ cd ardupilot/Tools/autotest
$ ./fg_quad_view.sh
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/e31376cb-111a-d768-5b3d-8eec68f1ea4f.png)

起動すると、なぜか夜になります。。とりあえず、メニューのEnvironmentから、Time Settingsを開いて、"Noon"を押してください。昼間になります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/5b56f924-f546-442c-55cb-33c334f7e0b9.png)

最後に、QGroundControllerの、Start Missionをスライドしてください。このとき、機体のGPSがReadyでないと、Start Missionに失敗します。`sim_vehicle.py`実行時に表示された、Console画面で、`using GPS`が出るのを待ってください（数十秒かかります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/e085c97a-950a-2eac-c9b3-2aa6f9bf6d05.png)

無事、Start できると、プロペラが回ります。

[![Image from Gyazo](https://i.gyazo.com/5ddf68e3eb269238aacd1d031c2a675f.gif)](https://gyazo.com/5ddf68e3eb269238aacd1d031c2a675f)