ACCESS Advent Calendar 2020 23日目の記事です。
はじめに
ドローンをシミュレータ上で飛ばして遊んでみる内容です。ドローンをシミュレータ上で飛ばすのにも色々方法がありますが、今回は比較的簡単なArduPilot SITLとQGroundControlという構成で行います。
Windowsを対象にしています。MacやLinuxの方はこちらの記事も参考にしてみてください。
ArduPilotとは?
ArduPilotは、ドローンに限らず、ヘリコプター、固定翼航空機、ローバーなどをサポートするオープンソースの自動操縦システムです(詳しくは https://ardupilot.org/dev/index.html) 。似たようなシステムに、PX4というものもあります。
今回使用するのはArduPilotのドローン用ファームウェアであるArduCopter(単にCopterとも言う)を使用します。
SITLとは?
SITLとは、Software in the Loopの略称です。ドローンやファームウェアの挙動を実機を使うことなく、すべてパソコン上でシミュレートして確認するものです。
ArduPilotはSITL simulatorがWindows、Linux、Macで利用可能です。
QGroundControlとは?
QGroundControlは、ドローンの状態監視や、操作、ミッション作成、設定などを行うオープンソースのソフトウェアです。地上局(Ground Control Station, GCS)の一種で、他にMission PlannerやAPM Plannerなどがあります。
QGroundControlはWindowsやLinux、Macだけでなく、AndroidやiOSにも対応しています。
構成
上図はArduPilotのSITL Architectureからの引用です。上図の右下にある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モデルで把握できます。
(共通)
Cygwinで、次のコマンドを実行しSITLを起動します。初回起動時はArduCopterのビルドが実行されるため、時間がかかります。
cd ~/ardupilot/ArduCopter
../Tools/autotest/sim_vehicle.py
mavproxy.exeというウィンドウが開かれれば、SITLが起動しています。
あとは、インストールしておいたQGroundControlを実行します。
QGroundControlが起動して、ウィンドウ右上にArduPilotの文字列が現れれば、SITLとQGroundControlが接続されたことになります。この状態で、SITL上のドローンを飛ばすことが出来ます。
操作
QGroundControlのウィンドウ左上のQのアイコンを選択し、設定画面を開きます。
下にスクロールしていくとVirtual Joystickという項目があるので、そこにチェックを入れます。
ウィンドウ左上部分の紙飛行機アイコンで先程の画面に戻ると、左右に仮想スティックが表示されます。
左側スティックの上下でドローンの上昇下降、左右で旋回を操作します。また、右側のスティックでドローンの前後左右移動を操作します。
ドローンを離陸させるには、左側のスティックを、右下いっぱいに入力して数秒待ちます。すると、画面上部の表示がDisarmedからArmedに変化します。Armedになることで、初めてドローンを上昇させることができます。
→
あとは好きに動かしてみましょう!マップ上のドローンが動き、様々な計器が変化するのを確認できるはずです。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というプロトコルのおかげなのですが、そのあたりの話はまたの機会に出来ればと思います。