AR.Drone に Flash から直接コマンドを送信して飛ばすことに成功しました


これまでの記事で AR.Drone を Prcessing のライブラリ ARDroneForP5 で飛ばしてみたりARDroneForP5 と Flash をソケット接続して Flash で Drone を飛ばしてみたりしてみましたが…

昨日 Twitter 上で、数名の Flash のエキスパートの方々にいろいろとご教授いただいたところ、「Flash から直接 AR.Drone へコマンドを送信しても飛ぶんじゃね?」ということになったので…

さっそく試してみました。

この「Flash から直接 AR.Drone へコマンドを送信しても飛ぶんじゃね?」というクエスチョンの答えからいうと飛びます。

もう一度言います。
Flash から直接 AR.Drone へコマンドを送信してもDrone は飛ばせます。

というわけで、取り急ぎ Takeoff と Landing のコマンドだけ送信できるようにしたテストアプリケーションをサクッと作って、またしても狭い部屋で飛ばしてみたところが下の映像です。
 

で、今回 Flash から Drone を飛ばすために何をやったかという話何ですが、大まかな手順は下記の通りです。

1. Drone の UDPソケットは「コマンド受信用」「センサ情報送信用」「カメラストリーム送信用」と3つあるので、Flash 側にも ソケット(DatagramSocket)を3つ用意する。

2. AR.Drone と Flash の UDPソケットをそれぞれのポート番号に合わせて接続する。

// Socket
_commandSock = new DatagramSocket();
_navigationSock = new DatagramSocket();
_videoSock = new DatagramSocket();
_commandSock.addEventListener( IOErrorEvent.IO_ERROR, onConnectError ); // Error Handling.
_navigationSock.addEventListener( IOErrorEvent.IO_ERROR, onConnectError ); // Error Handling.
_videoSock.addEventListener( IOErrorEvent.IO_ERROR, onConnectError ); // Error Handling.

try
{
	_commandSock.connect( _droneIP, _commandPort );
}
catch ( e:Error, "at commandSock" )
{
	trace( e );
}

try
{
	_navigationSock.connect( _droneIP, _navigationPort );
}
catch ( e:Error )
{
	trace( e, "at navigationSock" );
}

try
{
	_videoSock.connect( _droneIP, _videoPort );
}
catch ( e:Error )
{
	trace( e, "at videoSock" );
}

3. 接続が確認されたら AR.Drone SDK Developer Guide に書いてあるとおり初期化用のコマンドを送信して Drone (との接続?)を初期化。

private function initARDrone():void
{
	sendCommand( "AT*CONFIG=" + ( seq++ ) + ",\"general:navdata_demo\",\"TRUE\"" + CR + "AT*FTRIM=" + ( seq++ )); 
	sendCommand( "AT*PMODE=" + ( seq++ ) + ",2" + CR + "AT*MISC=" + ( seq++ ) + ",2,20,2000,3000" + CR + "AT*FTRIM=" + ( seq++ ) + CR + "AT*REF=" + ( seq++ ) + ",290717696" ); 
	sendCommand( "AT*PCMD=" + ( seq++ ) + ",1,0,0,0,0" + CR + "AT*REF=" + ( seq++ ) + ",290717696" + CR + "AT*COMWDG=" + ( seq++ )); 
	sendCommand( "AT*PCMD=" + ( seq++ ) + ",1,0,0,0,0" + CR + "AT*REF=" + ( seq++ ) + ",290717696" + CR + "AT*COMWDG=" + ( seq++ )); 
	sendCommand( "AT*FTRIM=" + ( seq++ ));
}

4. AR.Drone SDK Developer Guide に書いてあるテイクオフ用のコマンドを送信。

private function takeoff():void
{
	_command = "AT*REF=" + ( seq++ ) + ",290718208";
	_isLanding = false;
}

5. 飛びました

6. このままずっと飛ばしておくわけにもいかないので AR.Drone SDK Developer Guide に書いてあるランディング用のコマンドを送信。

private function landing():void
{
	_command = "AT*REF=" + ( seq++ ) + ",290717696";
	_isLanding = true;
}

7. 墜落せずに無事着地

今回の実験の流れはこんな感じでした。
この実験を始めるにあたって、いろいろとアドバイスをしていただいた裏社会(謎)の皆さん、ありがとうございました!

また、AR.Drone に送るコマンドと実装を調べるにあたっては ARDroneForP5のソースコードを大いに参考にさせていただきました。

というわけで…
次は移動や上昇下降のコマンドを送って(これが意外とめんどくさそう…)実際にコントロール出来るか試してみることにします。


AR.Drone に Flash から直接コマンドを送信して飛ばすことに成功しました” に対して1件のコメントがあります。

コメントは受け付けていません。