Programación de
Drones

Vehículos Aéreos No Tripulados
Presentación
• Carlos Toxtli Hernández
• Desarrollador multiplataforma
• 13 años de experiencia.
UAV
• Un vehículo aéreo no tripulado, UAV por siglas en
inglés (Unmanned Aerial Vehicle), o sistema aéreo
no tripulado, UA...
No confundir con naves
controladas a distancia
• Las Aeronaves Radio controladas o Aeronaves R/C,
no presentan ningún tipo...
Drones repartidores de
pizza
• http://www.youtube.com/watch?v=ZDXuGQRpvs4
Drones para uso
comercial
• En Estados Unidos se considera ilegal el uso
comercial de aviones no tripulados y se espera en...
Arduplane
• Cuentan con alas y hélices.

http://www.youtube.com/watch?v=DdC77fH1xAw
Multicopters
Ejemplo
• http://www.youtube.com/watch?v=uVNtE6LMD2o
• http://www.youtube.com/watch?v=8IItm9vqW88
Como conectarse
Como controlarlo
Marcas
Imprime tu Drone
http://www.thingiverse.com/thing:129855
Parrot AR Drone
Placa madre
Duración batería
• La incluida dura 9 minutos
• La extendida 15 minutos
• Las extendidas (de venta en internet) hasta 24
m...
Clips y seguros
Pinzas sujetadoras para
carga
Base para cargar un objeto
Helices
Engranes
http://www.thingiverse.com/thing:21342
Impresoras 3d
comerciales
Impresoras 3D armables
Software Repetier para
imprimirlas
Programación
•
•
•
•
•
•

Principales lenguajes en los que se programa.
C
C#
Objective C
Javascript
Java
Conexión
• Para conectarse es por medio de la red Wifi a la
red llamada ardrone2_SERIE
• Es posible conectarse vía telnet ...
Descarga del SDK
• Sitio web
• https://projects.ardrone.org/projects/show/ardrone
-api
Nodejs.org

Install node.js
Ejemplo de código
var arDrone = require('ar-drone');
var client = arDrone.createClient();
client.takeoff();
client
after(5...
Ejecutar el programa
Obtener imágenes
•
•
•
•
•
•

var arDrone = require('ar-drone');
var client = arDrone.createClient();
var pngStream = clie...
Obtener video y datos
• function getVideoStream(data)
• {
•
console.dir('Secuencia de video');
•
console.dir(data);
• }

•...
Usar OpenCV para la
visión
• OpenCV es el framework mas popular para
procesar imágenes y analizarlas.
• Para instalar la v...
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•

Datos de vuelo

{ header: 1432778632,
droneStat...
Mas y más datos
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
...
Funciones
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•

arDrone.createClient([options])
client.createREPL()
client.getPngStream()
client....
La parte divertida
• client.animate(animation, duration)
• ['phiM30Deg', 'phi30Deg', 'thetaM30Deg', 'theta30Deg',
'theta20...
Mezcla arduino con AR
Drone

https://gist.github.com/maxogden/4152815
Compartir en un servidor
la cámara del Drone

• https://github.com/Soarez/ar-drone-pngstream
Controlar desde tu
navegador

• https://github.com/functino/drone-browser
Detectar caras con Drone
•
•
•
•

var arDrone = require('ar-drone');
var cv = require('opencv');
var http = require('http'...
•

var faceInterval = setInterval( detectFaces, 150);

•
•
•
•
•
•
•
•
•

client.takeoff();
client.after(5000,function(){
...
•
•
•
•
•
•
•
•

var detectFaces = function(){
if( ! flying ) return;
if( ( ! processingImage ) && lastPng )
{
processingI...
Mexicanos y Drones
Uncommon Air Projects
• ¿Cuál fue su experiencia incursionando con Drones?
• Comenzamos con la informac...
Experiencia de
Uncommon Air Projects
• En México apenas comenzamos el acercamiento con
clientes, la mayoría tiene necesida...
Mexicanos y Drones
Jordi Muñoz
•
•
•
•

Co-Founder y CTO de 3DRobotics
Ganador al Premio Estudiante Emprendedor 2013
¿Cuál...
Ligas recomendadas
• http://3drobotics.com/
• https://projects.ardrone.org/projects/show/ardrone
-api
Gracias
• La presentación estará publicada en:

• http://www.facebook.com/

carlos.toxtli
Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)
Upcoming SlideShare
Loading in …5
×

Programación de Drones (Vehículos aéreos no tripulados)

18,213 views
17,854 views

Published on

El costo accesible de vehículos aéreos programables ha disparado que cada vez desarrolladores se aventuren a crear aplicaciones que dominen los cielos con código. Esta es una guía practica para empezar a programar un Drone desde cero.

Published in: Technology
1 Comment
14 Likes
Statistics
Notes
No Downloads
Views
Total views
18,213
On SlideShare
0
From Embeds
0
Number of Embeds
23
Actions
Shares
0
Downloads
420
Comments
1
Likes
14
Embeds 0
No embeds

No notes for slide

Programación de Drones (Vehículos aéreos no tripulados)

  1. 1. Programación de Drones Vehículos Aéreos No Tripulados
  2. 2. Presentación • Carlos Toxtli Hernández • Desarrollador multiplataforma • 13 años de experiencia.
  3. 3. UAV • Un vehículo aéreo no tripulado, UAV por siglas en inglés (Unmanned Aerial Vehicle), o sistema aéreo no tripulado, UAS (Unmanned Aerial System), conocido en castellano por sus siglas como VANT o drone, es una aeronave que vuela sin tripulación humana a bordo.
  4. 4. No confundir con naves controladas a distancia • Las Aeronaves Radio controladas o Aeronaves R/C, no presentan ningún tipo de autonomía, ejemplo: Los helicópteros controlados a control remoto. • Los Drones tiene la capacidad de ser autónomos y pueden despegar, volar y aterrizar automáticamente.
  5. 5. Drones repartidores de pizza • http://www.youtube.com/watch?v=ZDXuGQRpvs4
  6. 6. Drones para uso comercial • En Estados Unidos se considera ilegal el uso comercial de aviones no tripulados y se espera en 2015 se regularice.
  7. 7. Arduplane • Cuentan con alas y hélices. http://www.youtube.com/watch?v=DdC77fH1xAw
  8. 8. Multicopters
  9. 9. Ejemplo • http://www.youtube.com/watch?v=uVNtE6LMD2o • http://www.youtube.com/watch?v=8IItm9vqW88
  10. 10. Como conectarse
  11. 11. Como controlarlo
  12. 12. Marcas
  13. 13. Imprime tu Drone http://www.thingiverse.com/thing:129855
  14. 14. Parrot AR Drone
  15. 15. Placa madre
  16. 16. Duración batería • La incluida dura 9 minutos • La extendida 15 minutos • Las extendidas (de venta en internet) hasta 24 minutos.
  17. 17. Clips y seguros
  18. 18. Pinzas sujetadoras para carga
  19. 19. Base para cargar un objeto
  20. 20. Helices
  21. 21. Engranes http://www.thingiverse.com/thing:21342
  22. 22. Impresoras 3d comerciales
  23. 23. Impresoras 3D armables
  24. 24. Software Repetier para imprimirlas
  25. 25. Programación • • • • • • Principales lenguajes en los que se programa. C C# Objective C Javascript Java
  26. 26. Conexión • Para conectarse es por medio de la red Wifi a la red llamada ardrone2_SERIE • Es posible conectarse vía telnet al dispositivo
  27. 27. Descarga del SDK • Sitio web • https://projects.ardrone.org/projects/show/ardrone -api
  28. 28. Nodejs.org Install node.js
  29. 29. Ejemplo de código var arDrone = require('ar-drone'); var client = arDrone.createClient(); client.takeoff(); client after(5000, function() { this.clockwise(0.5); }) .after(3000, function() { this.animate('flipLeft', 15); }) .after(1000, function() { this.stop(); this.land(); });
  30. 30. Ejecutar el programa
  31. 31. Obtener imágenes • • • • • • var arDrone = require('ar-drone'); var client = arDrone.createClient(); var pngStream = client.getPngStream(); pngStream.on('data', getPngStream); var videoStream = client.getVideoStream(); videoStream.on('data', getVideoStream); • client.on('navdata', getNavData); • • • • • function getPngStream(data) { console.dir('Imagen PNG'); console.dir(data); }
  32. 32. Obtener video y datos • function getVideoStream(data) • { • console.dir('Secuencia de video'); • console.dir(data); • } • function getNavData(data) • { • if(data.droneState.emergencyLanding) • { • console.dir('Ups se atoró'); • } • }
  33. 33. Usar OpenCV para la visión • OpenCV es el framework mas popular para procesar imágenes y analizarlas. • Para instalar la versión para Node.js es de la siguiente forma. • npm install opencv
  34. 34. • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • Datos de vuelo { header: 1432778632, droneState: { flying: 0, videoEnabled: 0, visionEnabled: 1, controlAlgorithm: 0, altitudeControlAlgorithm: 1, startButtonState: 0, controlCommandAck: 1, cameraReady: 1, travellingEnabled: 0, usbReady: 1, navdataDemo: 1, navdataBootstrap: 0, motorProblem: 0, communicationLost: 0, softwareFault: 0, lowBattery: 0, userEmergencyLanding: 0, timerElapsed: 0, MagnometerNeedsCalibration: 0, anglesOutOfRange: 0, tooMuchWind: 0, ultrasonicSensorDeaf: 0, cutoutDetected: 0, picVersionNumberOk: 1, atCodecThreadOn: 1, navdataThreadOn: 1, videoThreadOn: 1, acquisitionThreadOn: 1, controlWatchdogDelay: 0, adcWatchdogDelay: 0, comWatchdogProblem: 0, emergencyLanding: 0 }, sequenceNumber: 22318, visionFlag: 0, demo: { controlState: 'CTRL_LANDED', flyState: 'FLYING_OK', batteryPercentage: 58, rotation: { frontBack: 1.293, pitch: 1.293, theta: 1.293, y: 1.293, leftRight: 0.829, roll: 0.829, phi: 0.829, x: 0.829, clockwise: -105.603, yaw: -105.603, psi: -105.603, z: -105.603 }, frontBackDegrees: 1.293, leftRightDegrees: 0.829, clockwiseDegrees: -105.603, altitude: 0, altitudeMeters: 0, velocity: { x: 0, y: 0, z: 0 }, xVelocity: 0, yVelocity: 0, zVelocity: 0, frameIndex: 0, detection: { camera: [Object], tagIndex: 0 }, drone: { camera: [Object] } },
  35. 35. Mas y más datos • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • pwm: { motors: [ 0, 0, 0, 0 ], satMotors: [ 255, 255, 255, 255 ], gazFeedForward: 340.91461181640625, gazAltitude: -25.660755157470703, altitudeIntegral: 0, vzRef: -800, uPitch: 7, uRoll: -34, uYaw: -14, yawUI: -25.660755157470703, uPitchPlanif: 0, uRollPlanif: 0, uYawPlanif: 0, uGazPlanif: 0.00017481952090747654, motorCurrents: [ 0, 0, 0, 0 ], altitudeProp: 0, altitudeDer: -25.62909698486328 }, visionDetect: { nbDetected: 0, type: [ 0, 0, 0, 0 ], xc: [ 0, 0, 0, 0 ], yc: [ 0, 0, 0, 0 ], width: [ 0, 0, 0, 0 ], height: [ 0, 0, 0, 0 ], dist: [ 0, 0, 0, 0 ], orientationAngle: [ 0, 0, 0, 0 ], rotation: [ [Object], [Object], [Object], [Object] ], translation: [ [Object], [Object], [Object], [Object] ], cameraSource: [ 0, 0, 0, 0 ] }, games: { counters: { doubleTap: 0, finishLine: 0 } }, magneto: { mx: -29, my: -21, mz: 47, raw: { x: 72.59765625, y: 100.93359375, z: -169.08984375 }, rectified: { x: -121.61617279052734, y: 253.83740234375, z: 347.0871276855469 }, offset: { x: 202.01583862304688, y: -157.86355590820312, z: -509.63116455078125 }, heading: { unwrapped: -104.56443786621094, gyroUnwrapped: 0, fusionUnwrapped: -105.60394287109375 }, ok: 1, state: 257, radius: 4.649235341397054e+35, error: { mean: -2.1708750025476598e-23, variance: 56699894794027010 } }, √ hdvideoStream: { hdvideoState: 256, storageFifo: { nbPackets: 1, size: 38 }, usbkey: { size: 3851560, freespace: 2559462, remainingTime: 4998 }, frameNumber: 1313 }, wifi: { linkQuality: 1 }, gps: { latitude: 25.663727, longitude: -100.2799144, elevation: 516.93, hdop: 1, data_available: 7, unk_0: [ 1, 0, 0, 0, 0, 0, 0, 0 ], lat0: 25.6637006, lon0: -100.2798947, lat_fuse: 25.663731514862402, lon_fuse: -100.27991142172012, gps_state: 1, unk_1: [ 0, 0 ], vdop: 0, pdop: 0, speed: 0.11999999731779099, last_frame_timestamp: 1500.13, degree: 189.77999877929688, degree_mag: 0, unk_2: [ 215, 163, 136, 64, 10, 215, 35, 61, 0, 0, 240, 65, 8, 0, 0, 0 ], channels: [ [Object] ], gps_plugged: 1, unk_3: [ 136, 0, 0 ], gps_time: 0, week: 0, gps_fix: 0, num_satellites: 0, unk_4: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], ned_vel_c0: 0, ned_vel_c1: 0, ned_vel_c2: 0, pos_accur_c0: 0, pos_accur_c1: 0, pos_accur_c2: 0, speed_accur: 0, time_accur: 0, unk_5: [ 0, 0, 0 ],temperature: 0,pressure: 0 },}
  36. 36. Funciones • • • • • • • • • • • • • • • arDrone.createClient([options]) client.createREPL() client.getPngStream() client.getVideoStream() client.takeoff(callback) client.land(callback) client.up(speed) / client.down(speed) client.clockwise(speed) / client.counterClockwise(speed) client.front(speed) / client.back(speed) client.left(speed) / client.right(speed) client.stop() client.calibrate(device_num) client.config(key, value, callback) client.disableEmergency() arDrone.createUdpControl()
  37. 37. La parte divertida • client.animate(animation, duration) • ['phiM30Deg', 'phi30Deg', 'thetaM30Deg', 'theta30Deg', 'theta20degYaw200deg’,'theta20degYawM200deg', 'turnaround', 'turnaroundGodown', 'yawShake’,'yawDance', 'phiDance', 'thetaDance', 'vzDance', 'wave', 'phiThetaMixed’,'doublePhiThetaMixed', 'flipAhead', 'flipBehind', 'flipLeft', 'flipRight’] • client.animateLeds(animation, hz, duration) • ['blinkGreenRed', 'blinkGreen', 'blinkRed', 'blinkOrange', 'snakeGreenRed’,'fire', 'standard', 'red', 'green', 'redSnake', 'blank', 'rightMissile’,'leftMissile', 'doubleMissile', 'frontLeftGreenOthersRed’,'frontRightGreenOthersRed', 'rearRightGreenOthersRed’,'rearLeftGreenOthersRed', 'leftGreenRightRed', 'leftRedRightGreen’,'blinkStandard']
  38. 38. Mezcla arduino con AR Drone https://gist.github.com/maxogden/4152815
  39. 39. Compartir en un servidor la cámara del Drone • https://github.com/Soarez/ar-drone-pngstream
  40. 40. Controlar desde tu navegador • https://github.com/functino/drone-browser
  41. 41. Detectar caras con Drone • • • • var arDrone = require('ar-drone'); var cv = require('opencv'); var http = require('http'); var fs = require('fs'); • console.log('Connecting png stream ...'); • • • • • • • • • • • var pngStream = arDrone.createPngStream(); //var stream = arDrone.createUdpNavdataStream(); var client = arDrone.createClient(); var processingImage = false; var lastPng; var face_cascade = new cv.CascadeClassifier('node_modules/opencv/data/haarcascade_frontalface_alt2.xml'); var navData; var flying = false; var startTime = new Date().getTime(); var log = function(s){ var time = ( ( new Date().getTime() - startTime ) / 1000 ).toFixed(2); • • • • • • • • console.log(time+" t"+s); } pngStream .on('error', console.log) .on('data', function(pngBuffer) { //console.log("got image"); lastPng = pngBuffer; });
  42. 42. • var faceInterval = setInterval( detectFaces, 150); • • • • • • • • • client.takeoff(); client.after(5000,function(){ log("going up"); this.up(1); }).after(1000,function(){ log("stopping"); this.stop(); flying = true; }); • • • • • client.after(60000, function() { flying = false; this.stop(); this.land(); }); • • • client.on('navdata', function(navdata) { navData = navdata; }) • • • • • • var server = http.createServer(function(req, res) { if (!lastPng) { res.writeHead(503); res.end('Did not receive any png data yet.'); return; } • • • res.writeHead(200, {'Content-Type': 'image/png'}); res.end(lastPng); }); • • • server.listen(8080, function() { console.log('Serving latest png on port 8080 ...'); });
  43. 43. • • • • • • • • var detectFaces = function(){ if( ! flying ) return; if( ( ! processingImage ) && lastPng ) { processingImage = true; cv.readImage( lastPng, function(err, im) { var opts = {}; face_cascade.detectMultiScale(im, function(err, faces) { • • var face; var biggestFace; • for(var k = 0; k < faces.length; k++) { face = faces[k]; if( !biggestFace || biggestFace.width < face.width ) biggestFace = face; • • //im.rectangle([face.x, face.y], [face.x + face.width, face.y + face.height], [0, 255, 0], 2); • • } • • • if( biggestFace ){ face = biggestFace; console.log( face.x, face.y, face.width, face.height, im.width(), im.height() ); • • face.centerX = face.x + face.width * 0.5; face.centerY = face.y + face.height * 0.5; • • var centerX = im.width() * 0.5; var centerY = im.height() * 0.5; • • var heightAmount = -( face.centerY - centerY ) / centerY; var turnAmount = -( face.centerX - centerX ) / centerX; • • turnAmount = Math.min( 1, turnAmount ); turnAmount = Math.max( -1, turnAmount ); • log( turnAmount + " " + heightAmount ); • • • //heightAmount = Math.min( 1, heightAmount ); //heightAmount = Math.max( -1, heightAmount ); heightAmount = 0; • • • • • • • • • • • • • • • • • • if( Math.abs( turnAmount ) > Math.abs( heightAmount ) ){ log( "turning "+turnAmount ); if( turnAmount < 0 ) client.clockwise( Math.abs( turnAmount ) ); else client.counterClockwise( turnAmount ); setTimeout(function(){ log("stopping turn"); client.clockwise(0); //this.stop(); },100); } else { log( "going vertical "+heightAmount ); if( heightAmount < 0 ) client.down( heightAmount ); else client.up( heightAmount ); setTimeout(function(){ log("stopping altitude change"); client.up(0); },50); • } • } • processingImage = false; //im.save('/tmp/salida.png'); • • • • • • }, opts.scale, opts.neighbors , opts.min && opts.min[0], opts.min && opts.min[1]); });
  44. 44. Mexicanos y Drones Uncommon Air Projects • ¿Cuál fue su experiencia incursionando con Drones? • Comenzamos con la información de internet e investigando en foros, y los conocimientos de aeronáutica y biónica fueron importantes. • Hemos desarrollado, cuadricópteros, hexa y octocópteros con un fuselaje de fibra de carbono con capacidad de carga que dobla al de la competencia. • La filosofía DIY ha hecho posible que la implementación de innovaciones no requiera de meses de análisis, no estás sólo, generas y compartes conocimiento
  45. 45. Experiencia de Uncommon Air Projects • En México apenas comenzamos el acercamiento con clientes, la mayoría tiene necesidades básicas que se cumplen con un drone que sea fácil de controlar y les permita visualizar las alturas • El principal reto que vemos en el mercado es competir con empresas que ofrecen precios muy bajos con calidad desechable • Aunque muchos lo ven con ojos de invasión de privacidad, nosotros creemos que la expansión de esta tecnología a sectores populares representa el empoderamiento del usuario, de multitudes, el no ser sólo espectador sino tener una herramienta para conocer, actuar, es como si te dieran el poder de volar, qué harías con él?... Al contrario de la creencia, ofrecemos tener un poco de libertad
  46. 46. Mexicanos y Drones Jordi Muñoz • • • • Co-Founder y CTO de 3DRobotics Ganador al Premio Estudiante Emprendedor 2013 ¿Cuál es su experiencia en UAVs ? Yo inicie en DIY drones, de hecho yo invente el Ardupilot (lo que es hoy el APM), la ultima versión que yo hice personalmente fue el APM 2.5.
  47. 47. Ligas recomendadas • http://3drobotics.com/ • https://projects.ardrone.org/projects/show/ardrone -api
  48. 48. Gracias • La presentación estará publicada en: • http://www.facebook.com/ carlos.toxtli

×