Help us understand the problem. What is going on with this article?

ArduPilotのSITLを動かす

はじめに

Ardupilot系のフライトコントローラをPythonで動かす場合,dronekitを使うのが簡単です.
また,dronekitをテストするシミュレーション環境としてdronekit-sitlが準備されています.
しかし,このdronekit-sitl,

  • CopterやRoverのファームウェアバージョンがちょっと古い.
  • Planeは飛ばない.

など,あまり良い面がありません.
まあ,あくまでdronekitの「お試し用」ですから.

そこで,Ardupilot本来のシミュレーション環境である「SITL Simulator」を試したいと思います.

本ページでは,このArduPilot純正シミュレータをdronekit-sitlと区別して,
「Ardupilot-SITL」と呼んで記事を書いていこうと思います.

概要

公式ページ SITL Simulator (Software in the Loop)
にインストールの方法が記載されています.

本ページでは,公式ページを日本語訳しつつ,
個人的に便利な使い方を紹介していきます.

準備するもの

・Ubuntu Linuxの動くインテル系PC
  古いPCやラップトップをLinuxパソコンとして復活させると良いでしょう.
  dronekit-sitlの方は「x86系のみ,ARM系非サポート」と明記されていました.
  上位互換であるArdupilot-SITLも同じ条件になります.
  今回は一応インテル系PCを使っておきましたが,Raspberry Piでも起動できるのでしょうか?
  ※Raspberry Piで試しました.依存関係でエラーになりました.

  動作確認済みOS: Ubuntu-MATE 18.04.2(x64)

SITL Simulatorのインストール

Setting up SITL on Linux にも書かれていますが,
実はArdupilot sitlのビルド環境は,APM/Pixhawkに書き込むファームウェアのビルド環境の一部です.

つまり,Ardupilot-SITLを動かそうとすると,実機のファームウェアも作れちゃうという一粒で二度美味しい環境が出来上がります.

aptの更新

まずはaptのリポジトリのリストを最新のものに更新(update)し,
更新のあるものをupgradeします.

システムの更新
$ sudo apt update
$ sudo apt upgrade

gitのインストール

gitがインストールされていなかったら,インストールします.

gitのインストール
$ sudo apt install git

ホームフォルダにArdupilot本体をクローンします.
また,必要なサブモジュールもダウンロードしておきます.

Ardupilotのクローン
$ cd ~
$ git clone https://github.com/ArduPilot/ardupilot
$ cd ardupilot
$ git submodule update --init --recursive

必要なパッケージのインストール

gitでcloneしたフォルダの中に,ビルドに必要な依存パッケージをインストールしてくれるシェルファイルがあるので,実行します.
(sudoを使うので,途中でパスワードを聞かれることがあります.)

依存関係のインストールシェルを実行
$ ~/ardupilot/Tools/environment_install/install-prereqs-ubuntu.sh -y

このシェルファイルが,ビルドに必要な環境設定を.profileに書き込んでくれるので,
以下のように入力して,再読込しておきましょう.

設定ファイルの再読込
$ source ~/.profile

再起動時後は,.profileは自動的に読み込まれます.
従って,上記のコマンドを再度打つ必要はありません.
参考:[Linux]環境変数の読み込み順番

sourceコマンドで環境を再設定するのは,.bashrcを書き換えたときと同じですね.

以上で,SITL Simulatorの開発環境がインストールできました.
(SITLだけじゃなくて全部だけど)

SITL Simulatorのビルド&簡易実行

Ardupilot-SITLのビルドと簡易的な実行は,sim_vehicle.pyというコマンドでできます.
sim_vehicle.pyは,ArdupilotのPythonベースのビルドコマンドwafのラッパーで,
wafでのビルドと,シミュレータの起動を一度に行ってくれます.

sim_vehicle.pyの使い方は非常に簡単で,
自分のビルドしたいドローンタイプのフォルダに入って,コマンドを打ちます.

従って,最も簡易的な-wオプションでの起動で示すと,以下のようになります.
なお,シミュレータを終了する際は,Ctrl+c です.

ArduCopterの場合

コプターのSITLを実行したいとき

ArduCopterのSITL
$ cd ~/ardupilot/ArduCopter
$ sim_vehicle.py -w

ArduRoverの場合

ローバーのSITLを実行したいとき

ArduRoverのSITL
$ cd ~/ardupilot/APMrover2
$ sim_vehicle.py -w

ArduPlaneの場合

固定翼機のSITLを実行したいとき

ArduPlaneのSITL
$ cd ~/ardupilot/ArduPlane
$ sim_vehicle.py -w

sim_vehicle.pyのオプション

最も単純な-wでの実行
$ sim_vehicle.py -w

でビルド&実行した場合,SITLが起動するだけでなく,

SITLのメッセージウィンドウが立ち上がります.
message2.png

また,mavproxy.pyも勝手に立ち上がってSITLに接続してくれます.
キー入力待ちになっているので,対話的にドローンを動かせます.


以降は,引数につけるオプションの解説です.
オプションはたくさんありますが,よく使う代表的な物だけ紹介します.

wipe-eepromオプション

--wipe-eepromは省略形で-wとも書けます.
EEPROMを消去し,デフォルトパラメータでSITLを起動します.
初期状態という事です.

consoleオプション

--consoleを指定すると,機体の姿勢やステータスを表示する別ウィンドウが立ち上がります.
console.png

mapオプション

--mapを指定すると,機体の位置を地図上で見ることのできるウィンドウが立ち上がります.
map.png

vehicleオプション

--vehicle=ドローンタイプを指定すれば,ArduCopterやArduPlaneのフォルダへ移動する必要がなくなります.
ドローンタイプには,ArduCopterAntennaTrackerAPMrover2ArduSubArduPlaneが指定できます.

frameオプション

--frame=フレームタイプを指定すると,具体的なドローンの形状を指定できます.

筆者は全て試していませんが,以下のようなタイプがあるそうです.

ArduCopterのとき
  octa-quad cwx singlecopter gazebo-iris
  calibration hexa tri + heli-compound djix
  dodeca-hexa heli-dual coaxcopter X
  y6 quad bfx IrisRos heli octa
 
APMrover2のとき
  rover rover- skid calibration
  sailboat balancebot gazebo-rover
 
ArduPlaneのとき
  quadplane- tilttrivec firefly jsbsim calibration
  CRRCSim plane-elevon plane last-letter
  plane-vtail plane-tailsitter gazebo-zephyr
  quadplane-tilthvec quadplane-tri quadplane-cl84
  plane-dspoilers quadplane-tilttri quadplane 

AntennaTrackerのとき
  tracker
 
ArduSubのとき
  gazebo-bluerov2 vectored
 

instanceオプション

--instance=インスタンス番号を指定すると,SITLの起動時のポート番号が変わります.

デフォルト(インスタンス番号=0)は5760,5762,5763ポートなのに対して,
番号=1だと5770,5772,5773,
番号=2だと5780,5782,5783,

のように10ずつ増えていきます.
このインスタンス番号を使うことで,SITLの複数起動が可能になります.

集団行動や群知能の研究にはこのオプションを使います.

locationオプション

--location=地名では,
 ardupilot/Tools/autotest/locations.txt
に予め記載されている地点をホームにして離陸できます.

例えばKawachiを指定すると,茨城県稲敷郡河内町の「ドローンフィールド KAWACHI」で起動します.

ドローンフィールドKAWACHI
$ sim_vehicle.py --location=Kawachi --map

KaruizawaだとJapanDronesの会社の緯度・経度.
KazakoshiParkは軽井沢風越公園グラウンド.ドローンエンジニア養成塾かな?

日本の事前登録地点はそのくらいです.

custom-locationオプション

--location=だと事前登録した地点のみです.
任意地点をホームにする場合は,--custom-location=緯度,経度,高度,方位で指定します.

例:柏の葉キャンパス駅前を指定・地図表示あり
$ sim_vehicle.py --custom-location=35.894087,139.952447,17,353 --map

custom-location_map.png

no-mavproxyオプション

普段はSITLの起動と同時にmavproxyも自動で起動しますが,
--no-mavproxyを指定すると,mavproxyをOFFにできます.

dronekitやpymavlinkで接続したいときなどは,このオプションを使うと良いでしょう.
あるいは,5760番をmavproxyが使うので,5762や5763にdronekitで接続するのもアリです.

(おまけ)Pixhawkのファームウェアのビルド方法

wafの話が出たので,ついでにファームウェアのビルド方法も記載しておきます.
参考:Building ArduPilot

まずは,wafのあるardupilotフォルダ直下へ移動します.

gitでcloneしたフォルダへ
$ cd ~/ardupilot

sitlと違って,コプターやローバーのフォルダに入る必要はありません.

次に,ビルドしたいフライトコントローラを指定します.

configure書式
$ ./waf configure --board ボードタイプ

--boardの後ろに書くボードタイプは,Mission Plannerで確認すると良いでしょう.
[フライト・データ]画面のHUDの下のタブを,[メッセージ]にするとボードタイプが書かれています.
例えばPixhawk1のコピー品では,以下の様に書かれていました.
board.png
従って,

設定
$ ./waf configure --board fmuv2

と書きます.
ボードを指定したら,ビルドしたいドローンタイプを決めてコマンドを打ちます.
主な引数として,copterroverroverantennatrackerがあります.

ビルド
$ ./waf copter

より細かな使い方は,先程のリンクを参照してください.

SITLのwafビルド

なお,SITLのビルドもwafだけ使って手動で行うことも可能です.

SITLのwafによるビルド
$ ./waf configure --board sitl
$ ./waf copter

SITLの単独起動

例えばsim_vehicle.pyで以下の様にSITLを起動すると,

sim_vehicle.pyの起動
$ sim_vehicle.py --custom-location=35.894087,139.952447,17,353

起動中に画面に表示される文字列に以下のような部分があります.

SITL本体の起動コマンド
/home/(ユーザ名)/ardupilot/build/sitl/bin/arducopter -S -I0 --home 35.894087,139.952447,17,353 --model + --speedup 1 --default /home/(ユーザ名)/ardupilot/Tools/autotest/default_params/copter.parm

これは,wafでビルドされたarducopterを使ってSITLを起動するコマンドです.

したがって,sim_vehicle.pyを使わずとも,自力でSITLを起動させることも出来ます.
sim_vehicle.pyはmavproxyの起動や,事前登録したホームで起動などの親切設計がありますが,むしろ邪魔な場合は直接起動させてしまいましょう.

おわりに

dronekit-sitlではなく,ArduPilotオリジナルのSITLのビルド&起動方法を示しました.
次回は,dronekitでArduPilot-SITLに接続してみたいと思います.

先行き不透明なdronekitだけど,行けるところまで行くぞ〜

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away