マルチコプター開発ガイド

概要


このガイドは、マルチコプターの開発に必要なハードウェア、ソフトウェア、通信プロトコル等の情報を網羅する目的で作成した。

記載情報は適宜更新してゆく予定である。

カスタムファームウェア


FlightCtrl

マルチコプター制御の根幹を担う。プロポとの通信、姿勢制御、位置制御、ESCへのコマンド送信などを行う。

FlightCtrlの詳細

ソースコード: https://github.com/kurokis/FlightCtrl2

高レベル処理を行う。位置推定(センサ融合)、画像処理、GPS受信、ロギング、他のコンピュータとの通信などを行う。

NaviCtrlの詳細

ソースコード: https://github.com/Akihiro-K/RasPiMain

MK-Programmer

上記FlightCtrlファームウェアの書き込みを行う。

ソースコード: https://github.com/ctraabe/MKProgrammer

ハードウェア


構成

使用機材

WaypointControllerとNaviCtrlの接続について

WaypointControllerとNaviCtrlの通信はUARTであるが、NaviCtrl側の接続はRaspberry PiのGPIOピンではなくUSBポートを使う。これは、NaviCtrlのGPIOピンがFlightCtrlとの通信で占有されているからである。一方、WaypointController側の接続はGPIOピンを使う。

開発用Ubuntuマシンのセットアップ


FlightCtrlはUbuntuマシンから書き込む必要がある。

Ubuntuマシンのセットアップ

Raspberry Pi 3のセットアップ


NaviCtrlはRaspberry Pi 3上で動作する。

Raspberry Piのセットアップ

Linux Cheat Sheet


Linux共通(開発用Ubuntuマシン、Raspberry Pi)のチートシート

Cheat Sheet

通信プロトコル


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に応じて制御モードやターゲット位置が計算される。 特に問題がなければリクエストはそのまま承諾されるが、異常時には機体の判断でリクエストと異なるモードが実行される。ここでいう異常とは以下のことである。

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 着陸