マルチコプター開発ガイド
概要
このガイドは、マルチコプターの開発に必要なハードウェア、ソフトウェア、通信プロトコル等の情報を網羅する目的で作成した。
記載情報は適宜更新してゆく予定である。
カスタムファームウェア
FlightCtrl
マルチコプター制御の根幹を担う。プロポとの通信、姿勢制御、位置制御、ESCへのコマンド送信などを行う。
ソースコード: https://github.com/kurokis/FlightCtrl2
NaviCtrl
高レベル処理を行う。位置推定(センサ融合)、画像処理、GPS受信、ロギング、他のコンピュータとの通信などを行う。
ソースコード: https://github.com/Akihiro-K/RasPiMain
MK-Programmer
上記FlightCtrlファームウェアの書き込みを行う。
ソースコード: https://github.com/ctraabe/MKProgrammer
ハードウェア
構成
使用機材
- プロポ:Futaba 14SG
- FlightCtrl
- ボード: FlightCtrl V2.5
- ライター
- MK-USB V1.0
- USB-micro USB cable (any)
- 10ピンリボンケーブル
- NaviCtrlボード: Raspberry Pi 3 model?
- Camera: ?
- GPS: Globalsat BU-353S4
- 機体
- ESC: AfroESC (Afro 20A Muti-Rotor ESC (SimonK Firmware)?)
- Motor: ?
- Propeller: ?
WaypointControllerとNaviCtrlの接続について
WaypointControllerとNaviCtrlの通信はUARTであるが、NaviCtrl側の接続はRaspberry PiのGPIOピンではなくUSBポートを使う。これは、NaviCtrlのGPIOピンがFlightCtrlとの通信で占有されているからである。一方、WaypointController側の接続はGPIOピンを使う。
開発用Ubuntuマシンのセットアップ
FlightCtrlはUbuntuマシンから書き込む必要がある。
Raspberry Pi 3のセットアップ
NaviCtrlはRaspberry Pi 3上で動作する。
Linux Cheat Sheet
Linux共通(開発用Ubuntuマシン、Raspberry Pi)のチートシート
通信プロトコル
FlightCtrl, NaviCtrl(RasPiMain, Marker, GPSServer), WaypointController間の通信はすべてUT Protocolに基づくシリアル通信で行う。 UT Protocolの詳細
MainProcess, MarkerProcess, GPSProcess間の通信はTCP通信で行う。
Drone Portとの連携によるウェイポイント制御
シーケンス図
パイロット、DPオペレータ、WaypointController、NaviCtrl、FlightCtrl の関係を時系列で示す。
drone_port_sequence @startuml; actor Pilot as pilot; actor "Drone Port Operator" as dpo; actor "PC Operator" as pco; participant "WaypointCtrl" as wc; participant "NaviCtrl" as nc; participant "FlightCtrl" as fc; pco -> nc: power on; pco -> nc: connect with ssh; pilot -> fc: power on; pilot -> fc: calibrate sensors; activate fc; note right: aircraft ready; dpo -> wc: power on; dpo -> wc: initialize; activate wc; note right: drone port ready; fc --> pco: check flightctrl is ready; pco -> nc: start navictrl process; activate nc; note right: position control ready; pilot -> fc: set nav mode to auto; fc -> nc: nav mode request: auto; activate nc; note left: auto mode start; nc --> fc: nav mode: auto; dpo -> wc: disarm motors; wc -> nc: set dp mode: Disarm; dpo -> wc: arm motors; wc -> nc: set dp mode: Arm; dpo -> wc: takeoff to hold; wc -> nc: set dp mode: AutoTakeoffToDPHold; nc -> wc: hold above takeoff location; dpo -> wc: start waypoint control; wc -> nc: set dp mode: AutoDPWaypoint; dpo -> wc: emergency hold; wc -> nc: set dp mode: DPHold; nc --> wc: hold at current position; wc --> dpo: check area is safe; dpo -> wc: resume waypoint control; wc -> nc: set dp mode: AudoDPWaypoint; nc --> wc: hold at last waypoint; wc --> dpo: check area is safe; dpo -> wc: land; wc -> nc: set dp mode: AutoLand; nc --> wc: automatic switch to Arm; wc --> dpo: check aircraft has landed; dpo -> wc: disarm; wc -> nc: set dp mode: Disarm; pilot -> fc: set nav mode to off; fc -> nc: nav mode request: off; deactivate nc; nc --> fc: nav mode: ; deactivate wc; deactivate nc; deactivate fc; @enduml drone_port_sequence
配置図
ハードウェアの構成と、通信パケットを示す。
制御スキーム概要
プロポで操作するnav mode requestと、ドローンポートで操作するdrone port mode requestに応じて制御モードやターゲット位置が計算される。 特に問題がなければリクエストはそのまま承諾されるが、異常時には機体の判断でリクエストと異なるモードが実行される。ここでいう異常とは以下のことである。
- カメラやGPSから位置情報が得られず、自律飛行が継続できない
- プロポのスティックを操作したことにより、自律飛行が強制解除された
- プロポからの信号をロストした(Go Homeモード、未実装)
- etc.
Nav modeは機体の制御モードを司り、Off、Hold、Autoの3種類がある。 Drone port modeはnav modeがAutoの時にのみ効力を持ち、ターゲット位置の計算やスロットル操作などを司る。Nav modeがAutoの時にのみ有効なのは、安全の観点から常にプロポの入力を優先させるためである。
Nav modeとdrone port modeに応じた機体の行動を下表に示す。
| Nav Mode | Nav Mode Meaning | Drone Port Mode | Drone Port Mode Meaning | Function |
|---|---|---|---|---|
| 0 | Off | - | - | マニュアル飛行 |
| 1 | NCHold | - | - | 位置保持 |
| 2 | Auto | 0 (default) | - | NaviCtrl内蔵ウェイポイントによるウェイポイント制御(モーターオフの時は何も起こらない) |
| 2 | Auto | 1 | Disarm | モーターオフ |
| 2 | Auto | 2 | Arm | モーターアイドリング |
| 2 | Auto | 3 | Hold | 位置保持 |
| 2 | Auto | 4 | Resume | DPによるウェイポイント制御に復帰 |
| 2 | Auto | 5 | Waypoint | DPによるウェイポイント制御 |
| 2 | Auto | 6 | Takeoff | テイクオフ後上空2mで待機 |
| 2 | Auto | 7 | Land | 着陸 |