Parrot AR Drone 2.0에서 사용하는 네트워킹 프로토콜의 구현. 1.0 드론도 호환되는 것으로 보입니다.
최신 버전을 얻으려면 github를 통해 설치하십시오.
npm install git://github.com/felixge/node-ar-drone.git
또는 최첨단 물건을 놓치면 괜찮다면 NPM으로 가십시오.
npm install ar-drone
AR 드론은 저렴하지만 놀랍게도 유능한 쿼드 콥터입니다. 드론 자체는 공식 프리 플라이 라이트 모바일 앱 (iOS 및 Android에서 사용할 수 있음)을 사용하여 WiFi를 통해 제어 할 수있는 독점 펌웨어를 실행합니다.
펌웨어와 달리 클라이언트 프로토콜이 열려 있으며 Parrot은 많은 양의 문서 및 C 코드를 포함하여 SDK (다운로드에 필요한 가입)를 게시합니다. 대상 고객은이 SDK를 사용하여 사람들이 드론으로 더 재미있게 즐길 수 있도록 게임 및 기타 앱을 만들 수있는 모바일 개발자 인 것 같습니다.
그러나이 프로토콜을 사용하여 비디오 및 센서 데이터를 수신하여 개발자가 다가오는 로봇 혁명을위한 자율 프로그램을 작성할 수 있습니다.
이 모듈은 여전히 개발 중이므로 기능이 누락되거나 문서화되지 않은 경우 놀라지 마십시오.
그러나 문서화 된 부품은 테스트되어 있으며 대부분의 부품에서 잘 작동해야합니다.
이 모듈은 모든 드론 기능을 지원하는 동시에 사용하기 쉬운 고급 클라이언트 API를 노출시킵니다.
시작하는 가장 좋은 방법은 다음과 같은 repl.js
파일을 만드는 것입니다.
var arDrone = require ( 'ar-drone' ) ;
var client = arDrone . createClient ( ) ;
client . createRepl ( ) ;
이 대체를 사용하면 재미있게 즐길 수 있어야합니다.
$ 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 웹 서버로 노출시키는 것입니다. 이 작업을 마치면 OpenCV 모듈에 공급해야합니다.
새 Client
객체를 반환합니다. options
다음과 같습니다.
ip
: 드론의 IP. 기본값은 '192.168.1.1'
입니다.frameRate
: pngencoder의 프레임 속도. 기본값은 5
까지.imageSize
: pngencoder가 생성 한 이미지 크기. 기본값으로 null
. 활성 범위에서 사용 가능한 모든 클라이언트 메소드와 대화식 인터페이스를 시작합니다. 또한 client
client
인스턴스 자체로 해결됩니다.
개별 PNG 이미지 버퍼를 'data'
이벤트로 방출하는 PngEncoder
객체를 반환합니다. 이 메소드에 대한 여러 호출은 동일한 객체를 반환합니다. 연결 라이프 사이클 (예 : 오류에 대한 재 연결)은 클라이언트가 관리합니다.
원시 TCP 패킷을 'data'
이벤트로 방출하는 TcpVideoStream
객체를 반환합니다. 이 메소드에 대한 여러 호출은 동일한 객체를 반환합니다. 연결 라이프 사이클 (예 : 오류에 대한 재 연결)은 클라이언트가 관리합니다.
내부 fly
상태를 true
로 설정하면 드론이 호버링된다고보고 한 후 callback
호출됩니다.
내부 fly
상태를 false
로 설정하면 드론 보고서가 착륙 한 후 callback
호출됩니다.
드론을 얻거나 고도를 줄입니다. speed
0
에서 1
까지의 값이 될 수 있습니다.
드론이 회전하게됩니다. speed
0
에서 1
까지의 값이 될 수 있습니다.
카메라를 기준점으로 사용하여 수평 이동 인 피치를 제어합니다. speed
0
에서 1
까지의 값이 될 수 있습니다.
카메라를 기준점으로 사용하여 수평 이동 인 롤을 제어합니다. speed
0
에서 1
까지의 값이 될 수 있습니다.
모든 드론 이동 명령을 0
으로 설정하여 효과적으로 마우스로 이동합니다.
드론에게 장치를 보정하도록 요청합니다. AR.Drone 펌웨어는 교정 할 수있는 하나의 장치 만 지원하지만. 이 기능에는 Ftrim도 포함됩니다.
자력계
장치 : 0
마그네틱 미터는 드론이 비행하는 동안에 만 교정 할 수 있으며, 교정 루틴은 드론이 360도 전체적으로 YAW로 만듭니다.
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 )
응급실 Ref 비트가 navdata.droneState.emergencyLanding
이 0이 될 때까지 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
입니다. AT*
명령에서 aw a ake a a a a vere. 완전한 제어를 원한다면 유용합니다.
예를 들어 이륙 지침은 다음과 같이 보내집니다.
udpControl . raw ( 'REF' , ( 1 << 9 ) ) ;
Enqueues a AT*REF
명령, 옵션은 다음과 같습니다.
fly
: 이륙 / 공중에 머무르기 위해 이것을 true
로 설정하거나, 착륙 /지면에 false
를 시작하십시오. 기본값으로 false
.emergency
: 비상 비트를 설정하도록 true
하거나 설정하지 않도록 false
설정하십시오. 이에 대한 자세한 내용은 공식 SDK 가이드를 참조하십시오. 기본값으로 false
. Enqueues a AT*PCMD
(Progressive) 명령, 옵션은 다음과 같습니다.
front
또는 back
: 전면 카메라 방향을 향하거나 멀리 비행합니다.left
또는 right
: 전면 카메라의 왼쪽 또는 오른쪽으로 비행합니다.up
또는 down
: 고도를 얻거나 줄입니다.clockwise
또는 counterClockwise
: 중앙 축을 중심으로 회전합니다. 각 옵션의 값은 작동에 사용하는 속도이며 0에서 1까지 다양합니다 {front: -0.5}
와 같은 음수 값도 {back: 0.5}
와 동일합니다.
모든 queureed 명령을 드론으로 UDP 패킷으로 보냅니다.
@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 ) ;