Parrot ARドローン2.0が使用するネットワークプロトコルの実装。 1.0ドローンも互換性があるようです。
GitHub経由でインストールして、最新バージョンを取得します。
npm install git://github.com/felixge/node-ar-drone.git
または、最先端のものが不足している場合は元気な場合は、NPMにアクセスしてください。
npm install ar-drone
ARドローンは、手頃な価格でありながら驚くほど有能なクアッドコプターです。ドローン自体は、公式のFreeFlightモバイルアプリ(iOSおよびAndroidで利用可能)を使用してWiFiを介して制御できる独自のファームウェアを実行します。
ファームウェアとは異なり、クライアントプロトコルが開かれており、Parrotはかなりの量のドキュメントとCコードを含むSDK(ダウンロードに必要なサインアップ)を公開しています。彼らのターゲットオーディエンスは、このSDKを使用してゲームやその他のアプリを作成して、人々がドローンをより楽しくするためのゲームやその他のアプリを作成できるモバイル開発者のようです。
ただし、プロトコルを使用してビデオおよびセンサーデータを受信することもでき、開発者は今後のロボット革命のための自律プログラムを作成できるようにします。
このモジュールはまだ激しい開発中ですので、機能が欠落しているか、文書化されていない機能を見つけても驚かないでください。
ただし、文書化された部品はテストされており、ほとんどの部分でうまく機能するはずです。
このモジュールは、すべてのドローン機能をサポートしようとする高レベルのクライアントAPIを公開し、使いやすくします。
始めるための最良の方法は、次のようなrepl.js
ファイルを作成することです。
var arDrone = require ( 'ar-drone' ) ;
var client = arDrone . createClient ( ) ;
client . createRepl ( ) ;
このREPLを使用して、あなたはいくらかの楽しみを持つことができるはずです:
$ node repl . js
// Make the drone takeoff
drone > takeoff ( )
true
// Wait for the drone to takeoff
drone > clockwise ( 0.5 )
0.5
// Let the drone spin for a while
drone > land ( )
true
// Wait for the drone to land
これで、同じことを行う自律プログラムを書くことができます。
var arDrone = require ( 'ar-drone' ) ;
var client = arDrone . createClient ( ) ;
client . takeoff ( ) ;
client
. after ( 5000 , function ( ) {
this . clockwise ( 0.5 ) ;
} )
. after ( 3000 , function ( ) {
this . stop ( ) ;
this . land ( ) ;
} ) ;
わかりました、でもドローンを作って何かとやり取りしたい場合はどうなりますか?さて、あなたはセンサーデータを見ることから始めることができます:
client . on ( 'navdata' , console . log ) ;
これのすべてがまだクライアントライブラリによって処理されているわけではありませんが、少なくともdroneState
およびdemo
データを受信できるはずです。
良い最初の課題は、 navdata.demo.altitudeMeters
プロパティに基づいて特定の高度に飛んでみることです。
これを管理したら、カメラの画像を見てみてください。これをpngbuffersとして取得する簡単な方法を次に示します( $PATH
で見つける最近のFFMPEGバージョンが必要です):
var pngStream = client . getPngStream ( ) ;
pngStream . on ( 'data' , console . log ) ;
最初の課題は、これらのPNG画像をノードHTTP Webサーバーとして公開することです。それを行ったら、それらをOPENCVモジュールに送ってみてください。
新しいClient
オブジェクトを返します。 options
次のとおりです。
ip
:ドローンのIP。デフォルトは'192.168.1.1'
です。frameRate
:PNGENCODERのフレームレート。デフォルトは5
です。imageSize
:pngencoderによって生成される画像サイズ。デフォルトはnull
です。 アクティブな範囲で利用可能なすべてのクライアントメソッドを使用して、インタラクティブなインターフェイスを起動します。さらに、 client
client
インスタンス自体に解決します。
個々のPNG画像バッファを'data'
イベントとして発するPngEncoder
オブジェクトを返します。このメソッドへの複数の呼び出しは、同じオブジェクトを返します。 Connection Lifecycle(例:エラー時の再接続)は、クライアントによって管理されます。
生のTCPパケットを'data'
イベントとして放出するTcpVideoStream
オブジェクトを返します。このメソッドへの複数の呼び出しは、同じオブジェクトを返します。 Connection Lifecycle(例:エラー時の再接続)は、クライアントによって管理されます。
内部fly
状態をtrue
に設定すると、ドローンがホバリングしていると報告した後にcallback
が呼び出されます。
内部fly
状態をfalse
に設定すると、ドローンが着陸したと報告した後にcallback
が呼び出されます。
ドローンをゲインにしたり、高度を減らしたりします。 speed
0
から1
までの値になります。
ドローンが回転します。 speed
0
から1
までの値になります。
参照ポイントとしてカメラを使用した水平方向の動きを制御します。 speed
0
から1
までの値になります。
ロールを制御します。これは、参照ポイントとしてカメラを使用して水平方向の動きです。 speed
0
から1
までの値になります。
すべてのドローンムーブメントコマンドを0
に設定し、効果的に設定します。
ドローンにデバイスを較正するように依頼します。ただし、Ar.Droneファームウェアは、較正できるデバイスが1つだけサポートされています。この機能にはFTRIMも含まれます。
磁力計
デバイス:0
磁力計は、ドローンが飛んでいる間にのみ較正でき、キャリブレーションルーチンによりドローンが360度のヨーにヨーになります。
ftrim
デバイス:1
Ftrimは基本的にヨー、ピッチ、ロールを0にリセットします。この関数を使用することに非常に注意してください。平らな表面でのみ調整します。飛行中は使用しないでください。
ドローンに構成コマンドを送信します。 ARDrone_Developer_Guide.pdf
でコマンドの完全なリストを見つけるには、ドローンSDKをダウンロードする必要があります。
たとえば、このコマンドを使用して、ドローンにすべてのnavdataを送信するよう指示できます。
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
ドローンが構成要求を確認するか、タイムアウトが発生した場合にcallback
が呼び出されます。
または、以下を含むオプションオブジェクトを渡すこともできます。
key
:設定する構成キー。value
:設定する構成値。timeout
:時間、ミリ秒単位で、ドローンからのACKを待つ時間。例えば:
var callback = function(err) { if (err) console.log(err); };
client.config({ key: 'general:navdata_demo', value: 'FALSE', timeout: 1000 }, callback);
特定のduration
(MSで)事前にプログラムされたフライトシーケンスを実行します。 animation
次のいずれかです。
[ 'phiM30Deg' , 'phi30Deg' , 'thetaM30Deg' , 'theta30Deg' , 'theta20degYaw200deg' ,
'theta20degYawM200deg' , 'turnaround' , 'turnaroundGodown' , 'yawShake' ,
'yawDance' , 'phiDance' , 'thetaDance' , 'vzDance' , 'wave' , 'phiThetaMixed' ,
'doublePhiThetaMixed' , 'flipAhead' , 'flipBehind' , 'flipLeft' , 'flipRight' ]
例:
client . animate ( 'flipLeft' , 1000 ) ;
ドローンには、フリップを実行するにはかなりの量の高度とヘッドルームが必要になることに注意してください。注意してください!
指定されたhz
周波数とduration
(SEC!)で事前にプログラムされたLEDシーケンスを実行します。 animation
次のいずれかです。
[ 'blinkGreenRed' , 'blinkGreen' , 'blinkRed' , 'blinkOrange' , 'snakeGreenRed' ,
'fire' , 'standard' , 'red' , 'green' , 'redSnake' , 'blank' , 'rightMissile' ,
'leftMissile' , 'doubleMissile' , 'frontLeftGreenOthersRed' ,
'frontRightGreenOthersRed' , 'rearRightGreenOthersRed' ,
'rearLeftGreenOthersRed' , 'leftGreenRightRed' , 'leftRedRightGreen' ,
'blinkStandard' ]
例:
client . animateLeds ( 'blinkRed' , 5 , 2 )
navdata.droneState.emergencyLanding
が0になるまで、緊急Refビットを1に設定します。これは、ひっくり返ったドローンを回復し、赤信号を再び飛行可能にしてグリーンライトを表示します。また、新しい高レベルのクライアントを作成するときにも暗黙的に行われます。
クライアントは、デモnavdataが有効になっている限り、上陸、ホバリング、飛行、着陸、バッテリーチェンジ、およびAltitudechangeイベントを放出します。
デモnavdataの使用を有効にするには
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
navadata
オブジェクトのドキュメントを参照してください
これは低レベルのAPIです。より簡単なものを好む場合は、クライアントのドキュメントをチェックしてください。
ドローンは、ポート5556にUDPパケットを送信することで制御されます。UDPはメッセージの注文や配信を保証しないため、クライアントは繰り返し指示を送信し、各コマンドに増分シーケンス番号を含める必要があります。
たとえば、シーケンス数1、および512(離陸)のパラメーターを持つ離陸/着陸に使用されるコマンド(REF)は次のようになります。
AT*REF=1,512r
これらのパケットの作成と送信を容易にするために、このモジュールはこのタスクを処理するUdpControl
クラスを公開します。たとえば、次のプログラムにより、ドローンが離陸してホバリングされます。
var arDrone = require ( 'ar-drone' ) ;
var control = arDrone . createUdpControl ( ) ;
setInterval ( function ( ) {
// The emergency: true option recovers your drone from emergency mode that can
// be caused by flipping it upside down or the drone crashing into something.
// In a real program you probably only want to send emergency: true for one
// second in the beginning, otherwise your drone may attempt to takeoff again
// after a crash.
control . ref ( { fly : true , emergency : true } ) ;
// This command makes sure your drone hovers in place and does not drift.
control . pcmd ( ) ;
// This causes the actual udp message to be send (multiple commands are
// combined into one message)
control . flush ( ) ;
} , 30 ) ;
今、あなたが空中になったので、あなたはpcmd()
メソッドに引数を渡すことで飛び回ることができます:
control . pcmd ( {
front : 0.5 , // fly forward with 50% speed
up : 0.3 , // and also fly up with 30% speed
} ) ;
それでおしまい!すべてのpcmd()
オプションの完全なリストは、以下のAPIドキュメントにあります。
これまでに学んだことを使用すると、次のような簡単なプログラムを作成できます。
var arDrone = require ( 'ar-drone' ) ;
var control = arDrone . createUdpControl ( ) ;
var start = Date . now ( ) ;
var ref = { } ;
var pcmd = { } ;
console . log ( 'Recovering from emergency mode if there was one ...' ) ;
ref . emergency = true ;
setTimeout ( function ( ) {
console . log ( 'Takeoff ...' ) ;
ref . emergency = false ;
ref . fly = true ;
} , 1000 ) ;
setTimeout ( function ( ) {
console . log ( 'Turning clockwise ...' ) ;
pcmd . clockwise = 0.5 ;
} , 6000 ) ;
setTimeout ( function ( ) {
console . log ( 'Landing ...' ) ;
ref . fly = false ;
pcmd = { } ;
} , 8000 ) ;
setInterval ( function ( ) {
control . ref ( ref ) ;
control . pcmd ( pcmd ) ;
control . flush ( ) ;
} , 30 ) ;
options
を含めることができる新しいudpControlインスタンスを作成します。
ip
:ドローンIPアドレスは、デフォルトで'192.168.1.1'
になります。port
:使用するポートは、デフォルトで5556
になります。 enqueues AT*
command。これは、完全に制御したい場合に便利です。
たとえば、このような離陸手順を送信します。
udpControl . raw ( 'REF' , ( 1 << 9 ) ) ;
enqueues a AT*REF
コマンド、オプションは次のとおりです。
fly
:離陸 /空中にとどまるためにこれをtrue
設定するか、 false
て地面に着陸 /滞在します。デフォルトはfalse
になります。emergency
:これをtrue
に設定して、緊急ビットを設定するか、 false
設定しないようにします。これの詳細は、公式のSDKガイドをご覧ください。デフォルトはfalse
になります。 AT*PCMD
(Progressive)コマンドでenqueues Aは次のとおりです。
front
またはback
:フロントカメラの方向に向かって飛行します。left
または/ right
:フロントカメラの左または右に向かって飛行します。up
またはdown
:高度を獲得または削減します。clockwise
またはcounterClockwise
:中心軸の周りを回転させます。各オプションの値は操作に使用する速度であり、0〜1の範囲です{front: -0.5}
などの負の値を使用することもできます。これは{back: 0.5}
と同じです。
UDPパケットとしてすべてのEnqueuedコマンドをドローンに送信します。
@todoは、低レベルのビデオAPIを文書化します。
@todoは、低レベルNavdata APIを文書化します。
ヘッドカメラとボトムカメラにアクセスできます。構成を変更する必要があります。
// access the head camera
client . config ( 'video:video_channel' , 0 ) ;
// access the bottom camera
client . config ( 'video:video_channel' , 3 ) ;