はじめに
この記事は完全に個人の備忘録用です。ArduPilotを用いた自作ドローンを作成するための周辺知識などについてごちゃごちゃになることが多かったのでそれの備忘録です
全体像
ここでは大きくGCS,CC(companion computer),FC(Flight Controller),SITLに分けてまとめようと思ってます。
GCS(Ground Control Station)
簡単にいうと地上からドローンを制御するための司令部のようなところ。
ドローンの現在位置や速度、ローやピッチ角度などをリアルタイムに取得することができる。
手元にあるPCにダウンロードし、GUIで使用できる。
有名なものとしては Mission Plannerが挙げられる。
このMisionPlannerとCCがMacLinkというプロトコルを通じて通信を行っている。
(追記)
GCSとFCが必ずしも直接通信できないわけではない。そもそも最初の初期設定などはGCSとFCを直接接続してシリアル通信で初期化したりする
Mission Plannerとは
主にArduPilotで動くドローン・ロボットを制御するためのもの。
注意点としてはWindowsOS上でしか対応していない。なのでもしMacなどで使いたいのであれば仮想環境を用意する必要あり
飛行中のドローンの位置や、高度や速度などを受信しPC上でリアルタイムに見ることができる
公式:https://ardupilot.org/planner/
MavLinkとは
Mavlinkは主にGCSとCCの間の通信で使用される通信プロトコル。
トランスポート層としてはTCP/UDPを使用していて、ドローンの位置情報や速度などをこのプロトコルを通じてやりとりしている
ちなみに映像転送などはサポートしていない。というより1メッセージの最大ペイロードが253バイトであり、テレメトリ以外の情報を送信する用途については向いていない
映像などはWebRTCなど別プロトコルでやりとりする必要がある
とにかく軽量なプロトコル
CC(Companion Computer)
コンパニオンコンピュータは主にGCSとフライトコントローラの仲介となる立ち位置で、GCSに対して映像を転送したり、はたまたFCに対して指示を出したりする。
ラズパイやjetsonなどの上で動き、Linux上にBlueOSなどといったアプリケーションをダウンロードして使用する
フライトコントローラは機体制御などの1mm秒も遅れを許さないことに特化しているが、CCは人間で言う大脳のような役割で、カメラからの映像を処理したり、エッジAI処理を行ったりができる
ドローンをIoT機器として多様性を持たせる上でCCは欠かせない
BlueOSとは
コンパニオンコンピュータをCLI画面を見ずともブラウザから管理できるようにしたソフトウェア群。
名前にOSとついているが実態はLinuxの上で動くアプリケーション
BlueOSを用いることで映像配信などでGstreamerなどを使用することなく簡単に映像配信が行えたりする
FC(Flight Controller)
フライトコントローラはドローンの中核的立ち位置で、ドローンを「落とさないため」の制御を行なっている
現在の姿勢推定→目標値との差分抽出→PID制御→モーターへ指示出し
と言う一連の流れを平均して約400Hz(1秒間に400回)で回している
またサブプログラムとして、FC内でLuaのスクリプトを実行することが可能。これにより、FC本体のC++スクリプトを書き換えることなく、かつCC上で動かすほどでもないプログラムを実行することが可能となる(特定の高度になったらランプを光らせるなど)
PID制御とは
PID制御はJISによると
「ある目的に適合するように、対象となっているものに所要の操作を加えること」
と定義されている
PはProportional(比例)、IはIntegral(積分)、DはDerivative(微分)を意味し、比例制御が基本の動作になる。
簡単にまとめると
P(比例): 現在のズレが大きいほど、強く戻そうとする力。
I(積分): 過去のズレの蓄積を見て、「ずっと右に流されているから、基本の出力を少し上げよう」と補正する力。
D(微分): ズレの変化スピードを見て、「急激に動いたから、ブレーキをかけよう」とする力。
基本方程式
Output = (Kp * error) + (Ki * integral) + (Kd * derivative)
これらの係数値を実際にはチューニングすることで、機体が過度に震えたりなどを防ぐ
SITL
SITLとは、本来実機のFC内で動いているArduPilotコードをそのままPC内でも仮想空間として動かせるようにしたもの
簡単に言えば仮想的なFC。
いざ完成したプログラムをMissionPlannerに繋げて検証するとなると毎回実機で試していると機体が破損する恐れがある。そこでSITLを用いることで仮想的にドローンを飛ばすことができ、実機デプロイの前に検証ができる

起動方法
- Misison Plannerの「シミュレーション」ボタンを押して起動する
MissionPlanner自身が勝手にSITLとTCP接続を行ってくれる - コマンドラインから
sim_vehicle.py -v ArduCopter -f quad --console --mapを打ち込み、起動する
CC上に作成した自作のプログラムを実行したいとなった場合は、ポートを正しく指定してあげればpythonスクリプトなどをSITL上で受け取ることができる
