ArduPilot SITL + QGroundControlでドローンを飛ばしてみる on Windows

[ACCESS Advent Calendar 2020](https://qiita.com/advent-calendar/2020/access) 23日目の記事です。

# はじめに

ドローンをシミュレータ上で飛ばして遊んでみる内容です。ドローンをシミュレータ上で飛ばすのにも色々方法がありますが、今回は比較的簡単なArduPilot SITLとQGroundControlという構成で行います。

Windowsを対象にしています。MacやLinuxの方は[こちらの記事](https://qiita.com/ikeyasu/items/9d244bcd0dd9b776ff84)も参考にしてみてください。

## ArduPilotとは？

ArduPilotは、ドローンに限らず、ヘリコプター、固定翼航空機、ローバーなどをサポートするオープンソースの自動操縦システムです(詳しくは https://ardupilot.org/dev/index.html) 。似たようなシステムに、PX4というものもあります。

今回使用するのはArduPilotのドローン用ファームウェアであるArduCopter(単にCopterとも言う)を使用します。

## SITLとは？

SITLとは、Software in the Loopの略称です。ドローンやファームウェアの挙動を実機を使うことなく、すべてパソコン上でシミュレートして確認するものです。
ArduPilotは[SITL simulator](https://ardupilot.org/dev/docs/sitl-simulator-software-in-the-loop.html)がWindows、Linux、Macで利用可能です。

## QGroundControlとは？

QGroundControlは、ドローンの状態監視や、操作、ミッション作成、設定などを行うオープンソースのソフトウェアです。地上局(Ground Control Station, GCS)の一種で、他にMission PlannerやAPM Plannerなどがあります。
QGroundControlはWindowsやLinux、Macだけでなく、AndroidやiOSにも対応しています。

# 構成

構成はこのようになっています。
![Architecture](https://ardupilot.org/dev/_images/ArdupilotSoftwareintheLoopSITL.jpg)

上図は[ArduPilotのSITL Architecture](https://ardupilot.org/dev/_images/ArdupilotSoftwareintheLoopSITL.jpg)からの引用です。上図の右下にあるOther GCSが、今回はQGroundControlになります。
図中のMAVProxyは通信の仲介役、FlightGearは3Dのドローンビューワとして使用します。

# インストール

必要なソフトウェアをインストールします。各インストール中に管理者権限を求められた場合は、はいを選択します。

### Cygwin

ArduCopterのビルドやSITLの実行に必要なため、Cygwinをインストールします。下記サイトのsetup-x86_64.exeをクリックしてダウンロード**だけ**します(まだ実行しません)。
https://www.cygwin.com/install.html
ダウンロードしたら、Windowsのコマンドプロンプトを開き、下記コマンドを実行します。

```
cd ダウンロードしたディレクトリ
setup-x86_64.exe -P autoconf,automake,ccache,gcc-g++,git,libtool,make,gawk,libexpat-devel,libxml2-devel,python36,python36-future,python36-lxml,python36-pip,libxslt-devel,python36-devel,procps-ng,zip,gdb,ddd
```
実行したらCygwinのセットアップが開かれるので、Choose A Download Siteの画面になるまで、次へを選択して進めます。
Choose A Download Siteでは、ftp://ftp.iij.ad.jpを選んで次へを選択します。
あとは全て次へを選択して、Cygwinのインストールは完了です。

### MAVProxy

MAVProxyは、今回はArduCopterとQGroundControlが通信をするための中継役として使用されます。
こちらからMAVProxySetup-latest.exeをダウンロードし、インストールします。
https://firmware.ardupilot.org/Tools/MAVProxy/
あとはデフォルトのまま次へを押し続けて進めます。最後のLaunch MAVProxyのチェックは外しておきます（外さなかった場合はその後起動するMAVProxyを閉じます）。

### QGroundControl

下記サイトにQGroundControl-installer.exeというリンクがあるので、そこからダウンロードして実行します。
https://docs.qgroundcontrol.com/master/en/getting_started/download_and_install.html
あとはデフォルトのまま次へを押し続けて進めます。

### (オプション) FlightGearのインストール

FlightGearはドローンの状態を3Dモデルで確認するために使用します。これがなくてもQGroundControlでドローンの状態を確認できます。が、FlightGearもあると、ドローンの状態が視覚的に分かりやすくなります（プロペラが回っているか、ドローンが傾いているか等）。

下記サイトのDownload FlightGear 2020.3.4 for Windowsをクリックし、ダウンロードします。広告が出てくることがありますので、そのときは右上などにあるXボタンで閉じてください。ダウンロードが自動で始まります（始まらなければ緑色のDownloadボタンをクリック）
https://www.flightgear.org/download/

ダウンロードしたファイルを実行し、デフォルトのままNextを押し続けてインストールしてください。

# 実行

インストールしたソフトウェアを実行していきます。各ソフトウェアで、起動時にネットワークのアクセス許可を求められた場合は許可をしてください。

### 初回のみ

Cygwinを起動し、次のコマンドを実行して必要なパッケージをインストールします。

```
ln -s /usr/bin/python3.6 /usr/bin/python
ln -s /usr/bin/pip3.6 /usr/bin/pip
pip install empy pyserial pymavlink
```

続いて、次のコマンドでArduPilotのソースコードをcloneします。

``` 
cd ~
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
git submodule update --init --recursive
```

### 毎回実行

(オプション)
FlightGearをインストールした方は、Cygwinを新しく起動し、次のコマンドでFlightGearを起動します。

```
~/ardupilot/Tools/autotest/fg_quad_view.bat
```
起動すると、このような画面が現れます。これでドローンの状態が3Dモデルで把握できます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640968/fa2e0d67-c4df-fa25-9f56-775503f87766.png)


(共通)
Cygwinで、次のコマンドを実行しSITLを起動します。初回起動時はArduCopterのビルドが実行されるため、時間がかかります。

``` 
cd ~/ardupilot/ArduCopter
../Tools/autotest/sim_vehicle.py
```


mavproxy.exeというウィンドウが開かれれば、SITLが起動しています。

あとは、インストールしておいたQGroundControlを実行します。
QGroundControlが起動して、ウィンドウ右上にArduPilotの文字列が現れれば、SITLとQGroundControlが接続されたことになります。この状態で、SITL上のドローンを飛ばすことが出来ます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640968/0da2cfaa-21e7-7775-036c-c8c88e9c55d5.png)


# 操作

QGroundControlのウィンドウ左上のQのアイコンを選択し、設定画面を開きます。
下にスクロールしていくとVirtual Joystickという項目があるので、そこにチェックを入れます。
ウィンドウ左上部分の紙飛行機アイコンで先程の画面に戻ると、左右に仮想スティックが表示されます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640968/e6fe267a-38ef-3ea7-9093-0b79b5b9944d.png)
左側スティックの上下でドローンの上昇下降、左右で旋回を操作します。また、右側のスティックでドローンの前後左右移動を操作します。
![4 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640968/3ee155e6-dc8d-637f-61fe-db48f87966e2.png)

ドローンを離陸させるには、左側のスティックを、右下いっぱいに入力して数秒待ちます。すると、画面上部の表示がDisarmedからArmedに変化します。Armedになることで、初めてドローンを上昇させることができます。
![4 - コピー (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640968/da0d2b2e-ce3a-2b4c-1032-b4e7ff7794bb.png)→![4 - コピー (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640968/9ac252e6-6a96-8f99-5635-ff006ada79b7.png)



あとは好きに動かしてみましょう！マップ上のドローンが動き、様々な計器が変化するのを確認できるはずです。FlightGearをインストールした方は、ドローンのプロペラが回り、操作に応じて動く様子が確認できます。

着陸して停止させたいときは、ドローンが地面にいる状態（分かりづらいですが、左側スティックを下げていても右側ウィンドウのAlt (Rel) (m)が変化しない状態）で左側のスティックを左下いっぱいに入力して数秒待つと、Disarmedになってドローンが停止します。

# おわりに

ArduPilot SITLとQGroundControlでドローンを飛ばしてみました。
今回は手動飛行だけでしたが、ArduPilotはウェイポイントを指定して自動飛行する機能があり、ウェイポイントをQGroundControlで作成することも可能です。
https://docs.qgroundcontrol.com/master/en/PlanView/PlanView.html

今回はArduPilot SITLとQGroundControlという構成でしたが、ArduPilotをPX4に入れ替える、ということも可能です。それはMavlinkというプロトコルのおかげなのですが、そのあたりの話はまたの機会に出来ればと思います。