Controlando el drone "Parrot AR.Drone 2.0" con DelphiXE5

Lo primero que pienso cuando veo la tecnología actual es averiguar cómo puedo conectarme a ella con Delphi. Así que el día en el que me dieron el cuadricóptero Parrot AR.Drone empecé a trabajar en la interfaz de Delphi. El escritor del manual de instrucciones parecía estar un poco desactualizado, o quizás yo estaba leyendo mal, pero una vez que vi el vídeo http://www.youtube.com/watch?v=aaGe2aERwgI la conexión fue muy fácil. El Parrot AR.Drone tiene su propio punto de acceso. Una vez que conecte a el, entonces es implemente una cuestión de enviar paquetes UDP para manejar los controles básicos. Para lograrlo simplemente utilicé el Cliente Indy UDP: TIdUDPClient. Cada comando se envía con un número de secuencia incrementado, por lo que inicializé mi interfaz de la siguiente manera:


udp: = TIdUDPClient. create (nil);
udp. Host: = '192.168.1.1';
udp. Port: = 5,556;
SEC: = 1;


El AR.Drone está siempre a 192.168.1.1 ya que es el punto de acceso, y el puerto de comunicación es 5556 (uno de los pocos puertos, pero lo necesitamos por ahora.) Vale la pena señalar que si usted tiene previamente volado su AR.Drone con la aplicación móvil de FreeFlight entonces es posible que necesite resetear su avión no tripulado para desconectarse. De lo contrario, se emparejará sólo ese dispositivo. Los comandos tienen el formato con un * AT prefijo, y una serie de argumentos. Por ejemplo, para el despegue, el comando es AT * REF = 1,290718208 donde AT * REF es el comando, 1 es el número de secuencia (siempre el primer argumento) y 290 718 208 es una máscara de bits que significa despegar. He creado una rutina sendCommand que se parece a:

procedure TARDrone.SendCommand(cmd, arg: string);
var
  full: string;
begin
  if not udp.Active then Connect;
  full := Format('%s=%d,%s' + Chr(13), [Cmd, Seq, arg]);
  Seq := Seq + 1;
  udp.Send(full);
end;

El comando se termina con un retorno de carro (# 13). La documentación dice que el avance de línea (# 10), que es un error. Supuestamente se puede enviar varios comandos en el mismo mensaje, si están separados por el retorno de carro. No he probado eso. He podido enviar los algunos comandos simples como esto:

SendCommand('AT*REF','290718208'); // Takeoff
SendCommand('AT*REF','290717696'); // Land
SendCommand('AT*CONFIG', '"control:altitude_max","10000"'); // unlimited altitude
SendCommand('AT*CONFIG', '"control:altitude_max","5000"'); // restrituded altitude - unsure what units 500-5000.
SendCommand('AT*PCMD','1,0,0,0,0'); // Hover (stop movement)


PCMD es el comando de movimiento.  Tiene 5 argumentos (después del número de secuencia.) El primero es el tipo de controlador, que estamos dejando 1 por ahora. Los siguientes 4 son phi, theta, gaz, yaw y son números de punto flotante con una representación entera. Aquí es donde se pone interesante. La documentación dice:
El número - 0.8 se almacena en la memoria como una palabra de 32 bits cuyo valor es BF4CCCCD (base 16), de acuerdo con el formato IEEE-754.Esta palabra de 32 bits puede ser considerado como que contiene el valor entero de 32 bits - 1085485875 (base 10).
La primera manera pensé en tener acceso a la misma memoria con dos tipos diferentes es un registro variant. Así que se me ocurrió la siguiente rutina de ayuda:
function IEEEFloat(const aFloat: Single): Integer;
type
  TIEEEFloat = record
    case Boolean of
      True: (Float: Single);
      False: (Int: Integer);
  end;
var
  Convert: TIEEEFloat;
begin
  Convert.Float := aFloat;
  Result := Convert.Int;
end;
Construí una rutina de movimiento que lleva 4 tipos singles (floats de 32 bits) y los envía como enteros:

procedure
TARDrone.Move(const phi, theta, gaz, yaw: Single);
begin
  SendCommand('AT*PCMD',Format('1,%d,%d,%d,%d',
    [IEEEFloat(phi), IEEEFloat(theta), IEEEFloat(gaz), IEEEFloat(yaw)]));
end;

Ahora si quiero que el avión no tripulado suba puedo llamar a:

Move
(0, 0, 5,6, 0); // gaz positivo quiere decir aceleración hacia arriba

Autor Jim McKeeth


Fuente: www.delphi.org
Traducción y adaptación: delphimagic

1 comentario:

  1. Muy, muy interesante, ahora sólo me falta comprarme el Parrot para probarlo

    ResponderEliminar