何とも巡りあわせが良くて、運よく先日au Firefox OS搭載端末fx0の新製品発表会に参加させていただきました。「つくる自由」のアピールとして、実際にfx0と何か作ってデモする企画があり、ハッカソン形式で出し物をやりました。ハッカソンチームとして3組参加したのですが、私がいた「シマダイ」チームの全体的な話については、上野さんの記事がとてもよくまとまっています。
まず ardrone 2.0 を Firefox OS で飛ばしました。最初に集まって何しようか?という話になった時に「…ドローン」と小菅さんが呟いたのに「おっしゃ、それやろう」ということで。単に飛ばしたかったから飛ばしたという。飛ばすだけなら iOS や android 使うほうが環境が整っていて良いです。
デモで使ったプログラムと簡単なセットアップ方法は bitbucket のリポジトリに置きました。ard_arm デーモンは、root が取れる端末であれば自動起動するように起動スクリプトに差し込んでおくと便利です。fx0 の場合は adb shell が切れてもプロセスが生き残るので、ユーザ権限で動かしてデモしました。
ardrone の制御には UDP を使います。このために中継デーモンを作らざるを得ませんでした( TCP なら全て b2g 上で実装できた)。ざっくりとしたシステム構成については ARDrone SDK 2.0.1 同梱の pdf に記載されています。pdf は網羅的ではないので、必要に応じて sdk のソースコードを読みます。比較的丁寧に .h ファイルに解説が書いてあるので、それを手がかりにして ard.go を書きました。
ard_arm デーモンは b2g 側の UI と websocket や http で通信します。つまり ard_arm は websocket,http と UDP の中継デーモンとなっています。
NAVDATA とはドローンの状態を表す構造体で、UDPパケットで定常的に流れてきます。AT Command は操縦やフラグ変更のコマンド群です。最初 AT Command を単に送ればいいと思ったのですが、目を通すと NAVDATA と AT Command の二つを使うのが最小セットで、両方必要です。
+--------------------+ +------------------------+
| ARDrone UDP 5554 ----NAVDATA-----> UDP 5554 Firefox OS |
| UDP 5556 <---AT Command--- UDP 5556 |
+--------------------+ +------------------------+
デモの後半は、ドローンをカメラとして使いましたが、カメラの接続は UDP ではなく TCP で接続します。ただし PaVE という独自フォーマットに H.264 が格納された形でやってくるので、変換が必要です。今回のデモでは SDK 付属プログラムをそのまま使いました。ビデオ時の接続はこんな感じになります(個人的には mpegts/UDP で流してくれたほうが嬉しかった…)。
+--------------------+ +----------------+
| ARDrone UDP 5554 ----NAVDATA-----> UDP 5554 PC |
| UDP 5556 <---AT Command--- UDP 5556 |
| TCP 5555 ----PaVE--------> TCP any |
+--------------------+ +----------------+
SDK 付属プログラムの注意点としては、Linux の場合 intel architecture が大前提になっていることです。一度 raspberry pi で動作させたのですが、アセンブラコードの呼び出し部分を arm に手動で振り替えないといけませんでした。デモ時は Fedora 21 x86_64 を使いました。