Реализация сетевых протоколов, используемых Drone Parrot AR 2.0. Похоже, что 1,0 дронов также совместимы.
Установите через GitHub, чтобы получить последнюю версию:
npm install git://github.com/felixge/node-ar-drone.git
Или, если у вас все в порядке, не хватает некоторых передовых вещей, перейдите на NPM:
npm install ar-drone
AR Drone - это доступный, но удивительно способный квадрокоптер. Сам беспилотник запускает проприетарную прошивку, которую можно управлять через WiFi, используя официальное мобильное приложение FreeFlight (доступно для iOS и Android).
В отличие от прошивки, клиент -протокол открыт, и Parrot публикует SDK (регистрация, необходимая для загрузки), включая хороший объем документации и C -код. Их целевая аудитория, кажется, мобильные разработчики, которые могут использовать этот 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 (требуется недавняя версия FFMPEG, которую можно найти в вашем $PATH
):
var pngStream = client . getPngStream ( ) ;
pngStream . on ( 'data' , console . log ) ;
Ваша первая задача может состоять в том, чтобы разоблачить эти изображения PNG в качестве веб -сервера HTTP Node. Как только вы это сделаете, вы должны попробовать кормить их в модуль OpenCV.
Возвращает новый Client
-объект. options
включают:
ip
: IP беспилотника. По умолчанию в '192.168.1.1'
.frameRate
: частота кадров Pngencoder. По умолчанию 5
.imageSize
: размер изображения, созданный Pngencoder. По умолчанию на null
. Запускает интерактивный интерфейс со всеми методами клиента, доступными в активной области. Кроме того, client
решается до самого экземпляра client
.
Возвращает объект PngEncoder
, который издает отдельные буферы изображения PNG в виде событий 'data'
. Несколько вызовов этого метода возвращает один и тот же объект. Жизненный цикл подключения (например, Reconnect при ошибке) управляется клиентом.
Возвращает объект TcpVideoStream
, который издает необработанные пакеты TCP в виде событий 'data'
. Несколько вызовов этого метода возвращает один и тот же объект. Жизненный цикл подключения (например, Reconnect при ошибке) управляется клиентом.
Устанавливает внутреннее состояние fly
в true
, callback
вызывается после того, как беспилотник сообщает, что он колеблется.
Устанавливает внутреннее состояние fly
на false
, callback
используется после того, как беспилотники сообщают о нем.
Делает беспилотник или уменьшить высоту. speed
может быть значением от 0
до 1
.
Заставляет беспилотник вращаться. speed
может быть значением от 0
до 1
.
Управляет шагом, который горизонтальное движение с использованием камеры в качестве контрольной точки. speed
может быть значением от 0
до 1
.
Управляет рулоном, который представляет собой горизонтальное движение, используя камеру в качестве контрольной точки. speed
может быть значением от 0
до 1
.
Устанавливает все команды движения беспилотников на 0
, что делает его эффективно завистным на месте.
Просит беспилотник калибровать устройство. Хотя прошивка AR.Drone поддерживает только одно устройство, которое можно откалибровать. Эта функция также включает в себя FTRIM.
Магнитометр
Устройство: 0
Магнитометр может быть откалиброван только во время летания дрона, а подпрограмма калибровки заставляет дрон на месте на 360 градусов.
Фтрим
Устройство: 1
FTRIM по существу сбрасывает рыскание, высоту и рулона до 0. Будьте очень осторожны в использовании этой функции и только калибруйте, находясь на плоской поверхности. Никогда не используйте во время полета.
Отправляет команду конфигурации на беспилотник. Вам нужно будет загрузить Drone SDK, чтобы найти полный список команд в ARDrone_Developer_Guide.pdf
.
Например, эту команду можно использовать для обучения беспилотника отправлять все 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 ) ;
Обратите внимание, что беспилотнику понадобится много высоты и запас, чтобы выполнить переворот. Так что будь осторожен!
Выполняет предварительно запрограммированную светодиодную последовательность при заданной частоте и duration
hz
(в разделах!). 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 )
Приводит к установлению аварийного ссылки на 1 до navdata.droneState.emergencyLanding
равна 0. Это восстанавливает беспилотник, который перевернулся и показывает красные огни, чтобы снова летать, и демонстрируют зеленые огни. Это также сделано неявно при создании нового клиента высокого уровня.
Клиент будет излучать приземленные, завистные, полеты, посадку, батарею и высокие мероприятия, когда включена демонстрация Navdata.
Чтобы включить демонстрацию navdata использовать
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
См. Документация для объекта navadata
Это API низкого уровня. Если вы предпочитаете что -то более простое, ознакомьтесь с клиентскими документами.
Дрон контролируется путем отправки пакетов UDP на порту 5556. Поскольку UDP не гарантирует заказ или доставку сообщения, клиенты должны многократно отправлять свои инструкции и включать номер последовательности увеличения с каждой командой.
Например, команда, используемая для взлета/посадки (ссылки), с номером последовательности 1, а параметр 512 (взлет) выглядит следующим образом:
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 ) ;
Создает новый экземпляр UDPControl, где options
могут включать:
ip
: IP -адрес беспилотника, по умолчанию '192.168.1.1'
.port
: порт для использования, по умолчанию до 5556
. Enqueutes a Raw AT*
Command. Это полезно, если вы хотите полный контроль.
Например, инструкции по взлету должны быть отправлены так:
udpControl . raw ( 'REF' , ( 1 << 9 ) ) ;
Enqueues A AT*REF
Command, параметры:
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}
.
Отправляет все внедренные команды в виде пакета UDP на беспилотник.
@Todo документируйте видео API.
@Todo документируется низкоуровневый API Navdata.
Вы можете получить доступ к камере головки и нижней камеры, вам просто нужно изменить конфигурацию:
// access the head camera
client . config ( 'video:video_channel' , 0 ) ;
// access the bottom camera
client . config ( 'video:video_channel' , 3 ) ;