March 07, 2011

AR.Drone上でintercepttyを動かす

空飛ぶおもちゃAR.Droneですが、中身はつまるところARM9を搭載したLinuxコンピュータです。ということで、ソースがあるプログラムでしたら、それをARMベースLinuxの環境に移植することで、AR.Droneの中で走らせることが可能です。この記事ではシリアルポートの通信履歴を記録してくれるintercepttyというプログラムを、AR.Drone上で走らせるまでにしたことを記録しておこうと思います。なおプログラムのビルドはWindows環境(CPUは無論x86)で行いました。

まずはビルド環境を整えます。x86をホストとし、ターゲットがARMとなるクロスビルド環境を導入します。AR.DroneのGPL関連サイトによるとクロスコンパイラといったツールの詰め合わせ(Toolchain)として、『G++ Lite 2009q1-203 toolchain for ARM GNU/Linux』を使っているとありますので、それを導入します。Toolchainを自分で作ってもよいのですが、時間がかかる上、結構失敗する可能性が高いのでコンパイル済みのものをそのまま使うことにしました。Sourcery G++ Lite 2009q1-203 for ARM GNU/Linuxの『IA32 Windows Installer』を有難くそのままインストールすることにします。

次にソースをコンパイルする際に必要となるLinuxのヘッダー等のソースを集めてきます。現時点でのAR.Droneに搭載されたLinuxカーネルは2.6.27で、AR.Drone用に改修された部分を含めたソースがARDrone linux kernel source codeにありますので、それをダウンロードして適切な場所に展開します。

ここからは動かしたいプログラムに依存する項目ですが、冒頭で紹介したintercepttyの場合は、ビルドを行うためのオマジナイconfigureスクリプトがありますので、それを改修したり、適宜オプションを与えることでビルドすることができました。configureの改修(差分はinterceptty-0.6.patch)とオプションを与える点で共通しているのは、AR.Doroneには共有ライブラリが全くといっていいほど入っていないので、共有ライブラリをダイナミックリンクで取り込もうとしないようにする、ということを行ってあります。configureのオプションは以下の通りです。

CC=arm-none-linux-gnueabi-gcc ./configure --includedir=/path/to/Sourcery\ G++\ Lite/arm-none-linux-gnueabi/include --host=arm-linux-elf --disable-dev-ptmx --disable-dev-ptc --disable-libutil

パス等は適宜修正してください。あとはmakeをかけることでAR.Drone上で動くintercepttyができました。ビルド済みのzipで包んだバイナリをおいておきます。AR.Drone上でのintercepttyの使い方は、例えばモータコントローラと接続されているttyPA1に対する適用が参考になります。

最後にですが、どうやってWindows環境でビルドされたARM/Linux用のプログラムをAR.Droneに転送するか、という話があります。方法はいくつかあるようですが、最も単純なTFTPを使って行うことにしました。TFTPとは、ネットを使ってデータを送受信する簡易的なプロトコル(FTPよりも遥かに単純)で、このクライアント用コマンドがAR.Droneにはあらかじめ組み込まれています。例えばTftpd32を使ってWindows側をTFTPサーバとし、AR.Drone側にtelnetでログインして、tftpコマンドのgetモードで接続、WIndow上TFTPサーバから目的のプログラムを取得することができました。これで転送完了です。モードをputにすると、逆にAR.Droneのファイルを送信することができますので、intercepttyで取得したログはこれで転送するとよいでしょう。

AR.Droneの物理的なI/Fも探ってみています。

09:04 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/791
コメント

fenrir 様

はじめまして、ARDroneを自作ボードで飛ばしたく、fenrir様のHPやTech Toy Hacksを参考にIFCボード作成し、AVRで回路を組みました。Initializeシーケンスのタイミングが合わないのか、BLCのスタートが不安定です(4個中1個動かなかったり、2個動かなかったり等)。基本的にはTech Toy Hacksの下記のシーケンスですが、各ステップのタイミング(wait)はどのようにされていますか?お忙しいところご教授いただければ助かります。

for x=1 to 4
CSx_ Low
TX E0, RX 2 bytes
TX 91, RX 121 bytes
TX A1, RX 3 bytes
TX 00+x, RX 1 byte
TX 40, RX 12 bytes
CSx_ High
wait 500ms
end for
for x=1 to 4
CSx_ Low
TX E0, RX 2 bytes
TX 00+x, RX 1 byte
TX 40, RX 12 bytes
CSx_ High
end for
wait 500ms
CS1_,CS2_,CS3_,CS4_ Low (select all)
for x=1 to 6
TX A0 -> RX 1 byte
end for

Posted by: 甘利 章 : October 5, 2012 09:25 PM

>甘利さん
コメントありがとうございます。このあたり( http://fenrir.naruoka.org/download/autopilot/external/ar.drone/C8051/main.c )に僕が使っている起動シーケンスが書いてありますので、ご参考になれば幸いです。

Posted by: fenrir : October 11, 2012 07:19 AM
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。