ドローンのフライトコントローラ周りのOSSプロジェクトについて

#1.はじめに
ドローンのフライトコントローラを開発するオープンソースプロジェクトについてよくわからなかったので調べてみた。色々と誤解しやすいポイントや情報不足があったので、備忘録として書いてみた。

有力なプロジェクトには、「Dronecode」、「APM/Ardupilot」、「PX4/Autopilot」の3プロジェクトが存在する。

それぞれの公式サイトを見ると、これら3つのプロジェクトが互いに関係しているかのように見受けられるが、その関係が非常にわかりづらい。

例えば、PX4/AutopilotではPixhawkというハードウェアを開発している。しかし、Pixhawkに関して、APM/Ardupilotの公式サイトで言及され、さらに購入まで出来てしまう。これだけを見ると、PixhawkとAPM/Ardupilotの関係が非常にわかりづらい。

また、公式Websiteの情報も不十分であり、細かな事実を知るためには、他のサイトの情報を総合しないと全貌が見えない。(注：この文書を書いている間にDronecodeのWeb Pageが非常にわかりやすくなっていた。活発なOSSプロジェクトは仕事が早い!)

さらに、ソフトウェアアーキテクチャの概要がわかりにくいプロジェクトもある。そのため、概要を知ろうとすると、コードを読むしかないのが現状だったりする。

よって、この文書を書いてみた。
調べたことをまとめることで、以下のいいことがあると思う。

 * アーキテクチャやプロジェクトに関する誤解を防ぐ
 * フライトコントローラ周りの開発に必要な情報を追加で提供する。
 * 私の認識に間違いがあれば、マサカリが飛んできて、目が覚める(笑)

#2.オープンソースプロジェクトと開発物件の概要
##2-1.Dronecode
[Dronecode](https://www.dronecode.org/developers)はLinux Foundatitonが運営するプロジェクトである。Dronecodeは「to spread the collaborative DNA of Linux to new fields to enable innovation and access for all. 」(参考ページは[ここ](http://collabprojects.linuxfoundation.org/))を目的とした、ドローンのオープンプラットフォームを整えるために横串活動をする組織のひとつである。
例えば、ドローンを考えると、ハードウェアプラットフォーム、OS、その上で動く各種ライブラリなどのモジュールがある。これらモジュールはそれぞれ別個のオープンソースプロジェクトで運営されているが、横串活動によってモジュール間の人的な交流を促したり、システムとしてあるべき姿を追求しやすくできる。
なお、モジュールの開発は各プロジェクトごとに行い、Linux FoundatitonだからといってプラットフォームをLinuxにすることを目指していない点は注意が必要である。

##2-2.APM/Ardupilot
3D Robotics社によって創設されたオープンソースプロジェクト。

APM/Ardupilotはもともと、Arduinoという8bitマイコンボードをベースとしたフライトコントローラを開発していた。そのハードウェア名称がArdupilotである。
Ardupilotのアーキテクチャを32bit化して、ArduPilot Mega(APM)と名称を変更した経緯がある。

###2-2-1.APM/Ardupilotの構造
APM/Ardupilotは、大きく分けて以下4つの要素で成り立っている。
(1)ハードウェア。ハードウェアとしてのArdupilot、APMを開発・販売していた。
しかし、現在、3D Robotics社で販売しているハードウェアはPX4プロジェクトによって開発されたPixhawkである(後述)。ハードウェアとしてのArdupilot、APMは販売終了となった。

(2)(1)のハードウェア上で動作するファームウェア。ドローンの場合はAPM：Copterというソフトウェアコードを用いる。こちらは現在も精力的に開発が続いている。
アーキテクチャ概要は、以下図を参照のこと。
※APM/Ardupilotプロジェクトでは、以下のようなアーキテクチャ図を用意していない。そのため、全体観が極めてわかりにくい。各部位の詳細な説明は、[このページ](http://dev.ardupilot.com/wiki/apmcopter-code-overview/)を参照のこと。

![apm_framework.png](https://qiita-image-store.s3.amazonaws.com/0/19975/c57c3ae1-d129-2044-4f55-606ca0b46e01.png)

現状、APM：CopterはNuttxというリアルタイムOS上で動作する([このページ](http://linuxgizmos.com/open-source-dronecode-uav-platform-project-launches/)を参考)。よって、Nuttxがサポートするハードウェア上でAPM:Copterを動作させることは可能である。例えば、後述するPixhawkがこれに該当する。なお、APM:Copterが動作するハードウェアアーキテクチャ一覧については、[このページ](https://store.3drobotics.com/t/parts/autopilots)参照のこと。

(3)(2)を搭載したドローンの操縦を支援するためのソフトウェア。これはMISSION PLANNERという自動操縦のためのソフトウェアがあったりする。この点はPX4も同様である。
なお、[DroneKit](http://dronekit.io/)というドローン操縦ソフトウェアを開発するためのフレームワークがあるので、別途参照されたい。
(4)デバッグのためのシミュレーション環境。これについては、後述するPX4も同様なのだが、[SITL](http://dev.ardupilot.com/wiki/simulation-2/sitl-simulator-software-in-the-loop/)というシミュレート環境があったりする。

###2-2-2.APM/Ardupilotの特徴
 * 構成が単純でシンプル
 * 先発プロジェクトで動作実績も多く、枯れている
○HAL(Hardware abstruction layer)上にソフトを構築する。これによって、ハードウェアやOSの違いを吸収するため、移植が楽で再利用性が高い。
 * フライトコントローラ単体では賄えない機能(e.g.画像処理、機械学習的な処理)追加がやりにくい。
 * イベントループを基本としたシンプルなやや古いアーキテクチャでかつスレッドも時分割なので、ライブラリを多数呼ぶと反応が鈍くなる。
 * ソフトウェアのライセンスがGPLのため、商用利用がしづらい一面もある。

##2-3.PX4/autopilot
チューリッヒ工科大学のLorenz Meier氏により[2009年に創設](https://pixhawk.ethz.ch/)されたPixhawkプロジェクトが、[PX4/autopilot](https://pixhawk.org/choice)の前身である(他には、[dronecode設立に関する日本語記事](http://internetcom.jp/webtech/20141017/linux-community-launches-drone-development-project-dronecode.html)、[チューリッヒ工科大学のLorenz Meier氏紹介ページ](http://people.inf.ethz.ch/lomeier/)、[PX4と3D Robotics社の関係](http://www.suasnews.com/2013/08/24707/px4-and-3d-robotics-present-pixhawk-an-advanced-user-friendly-autopilot/)が参考になる)。

ややこしいのだが、Pixhawkプロジェクトにより、PX4というフライトコントローラが開発されたのである。
PX4はフライトコントローラ機能が複数ボードで構成されていたが、1枚にフライトコントローラ機能をまとめ、さらにポートを追加したフライトコントローラがハードウェアとしてのPixhawkである。
現在、Pixhawkハードウェアの開発はPX4/autopilotプロジェクトが行い、販売は3D Robotics社が行っている。(※この文書では断りのない限り、「Pixhawk」という単語はフライトコントローラのハードウェア名称を指す。)

###2-3-1.PX4/autopilotの構造
PX4/autopilotは、大きく分けて以下4つの要素で成り立っている。
(1)ハードウェア。これは原則、Pixhawkである。

![pixhawk.png](https://qiita-image-store.s3.amazonaws.com/0/19975/8e7a99dc-4a36-896a-fcb6-dd24650e0e68.png)

(2)(1)のハードウェア上で動作するファームウェア。これは[「PX4 Flight Stack」](https://pixhawk.org/dev/tour)と呼ばれている。
このアーキテクチャでは、モジュール間通信をするために「ORB」と呼ばれる1対多のPublisher-Subscriberパターンを用いている。

この仕組みにより、他のモジュールとのイベント通知が簡潔になっており、イベント通知側は具体的な相手を意識しなくても良い。このことが、シミュレーションとの相性を良くしている。(シミュレータ相手にイベントを通知するためのコードをわざわざPublisher側に書かなくても良い)。

さらに、ロボット開発ではROSと呼ばれるイベント通知の仕組みがよく使われているが、このROSのノードとも通信が可能である。
フライトコントローラ単体で賄いきれない高度な機能を実現したい場合は、別ボードでLinuxなどの高級なOSを動かしてお互いにノード間通信を行う必要がある。今述べたORBにより、こうした拡張がやりやすくなっている。これを示したのが以下の図である。

![px4_stack.png](https://qiita-image-store.s3.amazonaws.com/0/19975/0b6997c8-72e1-021d-4448-a4e2607a9041.png)

※PX4 Flight Stackは以下の図中の「DEEPLY EMBEDDED CONTROLLER」にあたる。また、LINUX COMPANION COMPUTERはオプショナルなものであり、必須ではない。Pixhawkの開発者向けドキュメントの記述では、PX4が諸々のライブラリを含む大掛かりなシステムであるかのように誤解する可能性があるため、注意されたい。

また、ライセンスはBSDライセンスであり、ソースコードの公開は任意となる。
なお、PX4/Autopilotは[Nuttx](https://www.linux.com/news/embedded-mobile/mobile-linux/792230-dronecode-likely-to-include-larger-role-for-linux-in-uavs)というリアルタイムOS上で動作する。
ソフトウェアアーキテクチャの詳細は、[論文](http://people.inf.ethz.ch/lomeier/publications/px4_autopilot_icra2015.pdf)を参照されたい。

(3)(2)を搭載したドローンの操縦を支援するためのソフトウェア、デバッグのためのシミュレーション環境については、APM/Ardupilotと同様。

###2-3-2.PX4/Autopilotの特徴
 * フライトコントローラ単体では賄えない機能(e.g.画像処理、機械学習)追加が比較的容易。
 * ソフトウェアのライセンスが修正BSDライセンスであり、商用利用しやすい。
 * APM/Ardupilotに比較すると開発者やコミット数が少ないが、それでもプロジェクトは活発。
 * APM/Ardupilotに比べると、アーキテクチャがやや複雑。単に飛ばすだけならそこまで大掛かりにする必要はないとも思える。
 * APM/Ardupilotに比べると、実績が少ないが、世の中で広く使われれば枯れてくると思われるのであまり問題にならないと考えている。

// 以上