20
Capítulo 3 – Descripción del software 26 Capítulo 3. Descripción del software En este capítulo se hará una introducción a los entornos de programación utilizados que son Matlab y Arduino, luego se presentarán las principales librerías de software utilizadas que proporcionan una base para implementar el controlador del robot tanto en el PC como en el robot. Por último se detallará la programación del controlador del robot y el PC. 3.1. CONTROLADOR DEL ROBOT El controlador del robot se ha implementado tanto a bordo del robot como desde el ordenador con el que se encuentra comunicado inalámbricamente. El robot puede funcionar en tres modos: manual, guiado por GPS y guiado por cámara. En un funcionamiento normal el robot se guiará por el GPS siguiendo un camino de puntos ya establecidos (waypoints). En caso de que exista una pérdida de la señal de GPS el robot verá afectada su capacidad de orientarse, en ese instante el ordenador recibirá la pérdida de señal y cambiará el modo de funcionamiento a guiado por cámara. Una vez en este modo se manejará al robot mediante un control visual con la cámara para llevarlo de vuelta al UAV. Los microcontroladores se programan en lenguaje C utilizando el entorno de programación Arduino. Para el control en el ordenador se ha hecho uso del entorno Matlab. 3.1.a. Arduino Arduino es una plataforma electrónica abierta para desarrollar prototipos. Se programa a través de una interfaz también de código abierto y libre distribución que permite programar, compilar y cargar el programa en el microcontrolador. No admite cualquier microcontrolador, sino determinados microcontroladores de la marca Atmel de 8 bits, aunque existen proyectos para extenderlo a diferentes

Capítulo 3. Descripción del software - bibing.us.esbibing.us.es/proyectos/abreproy/5153/fichero/PROYECTO%2F3... · de la señal de GPS el robot verá afectada su capacidad de orientarse,

Embed Size (px)

Citation preview

Capítulo 3 – Descripción del software 26

Capítulo 3. Descripción del software

En este capítulo se hará una introducción a los entornos de programación

utilizados que son Matlab y Arduino, luego se presentarán las principales librerías

de software utilizadas que proporcionan una base para implementar el

controlador del robot tanto en el PC como en el robot. Por último se detallará la

programación del controlador del robot y el PC.

3.1. CONTROLADOR DEL ROBOT

El controlador del robot se ha implementado tanto a bordo del robot como

desde el ordenador con el que se encuentra comunicado inalámbricamente. El

robot puede funcionar en tres modos: manual, guiado por GPS y guiado por

cámara. En un funcionamiento normal el robot se guiará por el GPS siguiendo un

camino de puntos ya establecidos (waypoints). En caso de que exista una pérdida

de la señal de GPS el robot verá afectada su capacidad de orientarse, en ese

instante el ordenador recibirá la pérdida de señal y cambiará el modo de

funcionamiento a guiado por cámara. Una vez en este modo se manejará al robot

mediante un control visual con la cámara para llevarlo de vuelta al UAV.

Los microcontroladores se programan en lenguaje C utilizando el entorno

de programación Arduino. Para el control en el ordenador se ha hecho uso del

entorno Matlab.

3.1.a. Arduino

Arduino es una plataforma electrónica abierta para desarrollar prototipos.

Se programa a través de una interfaz también de código abierto y libre distribución

que permite programar, compilar y cargar el programa en el microcontrolador. No

admite cualquier microcontrolador, sino determinados microcontroladores de la

marca Atmel de 8 bits, aunque existen proyectos para extenderlo a diferentes

Capítulo 3 – Descripción del software 27

marcas y arquitecturas. Antes de comenzar a programarlos es necesario cargar en

ellos un pequeño programa llamado bootloader que permite comunicarse con el

ordenador a través de un puerto serie, recibir el programa y grabarlo en la

memoria flash del micro.

Figura 12. Interfaz Arduino de programación

La programación es similar al lenguaje C++ con algunas simplificaciones y

modificaciones. Incorpora funciones típicas de los microcontroladores y librerías

que facilitan el uso de periféricos como servos o pantallas LCD. Arduino presenta

un alto nivel de abstracción, por lo que no es necesario entender cómo funciona el

hardware a bajo nivel, sino que el funcionamiento viene enmascarado dentro de

las funciones. Por estos motivos presenta una curva de aprendizaje bastante

rápida.

3.1.b. MATLAB

Matlab es la abreviación de Matrix Laboratory y se trata de un software de

carácter matemático con un lenguaje de programación propio (lenguaje M) de alto

nivel. Esta herramienta es escogida en muchas ocasiones para implementar

algoritmos y visualización de datos en gráficas en 2 o 3 dimensiones, ya que posee

un potente módulo que permite personalizar su apariencia.

Capítulo 3 – Descripción del software 28

Las funcionalidades de Matlab se pueden ampliar con paquetes de funciones

específicas llamados Toolboxes. Existen toolboxes de diferentes categorías como

procesamiento de imágenes, estadística, control…

Una característica de Matlab que es utilizada en este proyecto es la

capacidad para poder llamar a funciones y subrutinas escritas en lenguaje C/C++.

Para que las funciones creadas en C/C++ puedan ser cargadas en Matlab

como lo haría cualquier función hay que crear un archivo llamado MEX que sirve

de enlace. La principal razón para utilizar código en C/C++ es obtener un código

mucho más eficiente. Sin embargo, no se realiza toda la programación en un

lenguaje a bajo nivel como C/C++ debido a que requeriría mucho tiempo en

implementarlo.

Este programa no es libre ni gratuito. Existe un software alternativo a

Matlab que es Octave, aunque no llega a ser compatible por completo.

3.1.c. Programación del Ardupilot Mega

El controlador del robot programado en el Ardupilot Mega se comporta

como un esclavo del controlador programado en Matlab, de manera que recibe

instrucciones de la acción que debe llevar a cabo mediante comandos enviados por

el puerto serie a través del Zigbee. Para controlar el movimiento del robot se han

definido cuatro estados de funcionamiento que se seleccionan según la forma en

que se desee manejar el robot. El objetivo del controlador del robot será adquirir

los datos de los sensores internos, que proporcionan la información de posición y

orientación, e implementar los controladores de los motores para que el robot se

dirija a la posición deseada con la velocidad adecuada.

Los estados de funcionamiento del robot que se han definido son los cuatro

siguientes:

1. Modo de parada. En este modo el robot permanecerá quieto hasta

cambiar a otro modo de funcionamiento. Puede ser utilizado como

parada de emergencia también.

2. Modo de funcionamiento normal. El robot es guiado hacia un

punto de destino definido por la latitud y la longitud usando para

ello la posición del robot proporcionada por el GPS y siempre que la

señal de la posición sea suficientemente exacta. El punto de destino

vendrá dado por el controlador en Matlab que será transmitido al

Ardupilot Mega, luego el robot mantendrá una trayectoria en línea

recta hacia el punto marcado. Existe un margen alrededor del punto

donde se considerará que el robot se encuentra en dicho punto,

siendo este margen configurable. También es posible establecer una

trayectoria basada en varios puntos GPS.

Capítulo 3 – Descripción del software 29

3. Modo de funcionamiento con cámara. En caso de perder la señal

del GPS y estar el robot en línea de visión de la cámara del UGAV se

calcula la posición del robot usando la información de la imagen de la

cámara para hacer volver al robot a su base de acoplamiento. En este

caso el controlador en Matlab indicará al robot hacia donde debe

girar y el robot será el encargado de realizar el giro ordenado.

4. Modo manual. En este caso se utilizará el robot como un vehículo

por radiocontrol y el movimiento es controlado por una persona.

Este modo de funcionamiento podría utilizarse para tareas críticas

como el acoplamiento al UGAV o en caso de fallo de los modos 2 y 3.

Es un modo que ha de seleccionarse de forma manual para utilizarlo.

Figura 13. Esquema de transiciones entre modos

Tanto en el modo 2 como el modo 3 el robot es el encargado de mantener la

dirección que le sea asignada. En el modo 2 el robot calcula la dirección de

referencia a partir de la posición actual y el destino en forma de latitud y longitud.

En el modo 3 es el controlador en Matlab el que proporciona cada cierto tiempo la

posición que debe seguir. En ambos casos no conocemos la dirección real del robot,

sino la medida que obtenemos de la IMU, que está basada en las medidas de los

giroscopios y magnetómetros. Para que el efectivamente pueda seguir la dirección

de referencia se ha implementado un controlador tipo PI con el siguiente esquema:

MODO

DE

PARADA

MODO

NORMAL

CON GPS

GUIADO

CON

CÁMARA

Cambio de

modo desde

Matlab

Fallo en la

posición GPS

No hay visión

del robot

desde la

cámara

Capítulo 3 – Descripción del software 30

Figura 14. Esquema del controlador PI

El controlador PI (proporcional + integral) incluye dos tipos de acciones:

una proporcional al error y otra acumulativa del error. La primera acción

reacciona frente al error actual y la segunda acción garantiza que con el tiempo el

error llegue a anularse. La acción de control queda de la forma siguiente

expresada en el dominio temporal:

Donde u(t) es la acción de control, e(t) es el error en el instante t, Kp es la

ganancia de la acción proporcional y Ki es la ganancia de la acción integral.

El Ardupilot Mega se conecta a la placa de control de motores mediante dos

señales PWM (Puse Width Modulation, traducido Modulación de Ancho de Pulso)

que varían su ancho de pulso para indicar la velocidad y el giro del robot. Se ha

elegido este tipo de conexión debido a que se están utilizando los puertos serie de

la placa para otras conexiones y esta conexión permite su uso directamente para el

modo radiocontrolado.

La señal PWM es una señal digital estándar en los equipos de radiocontrol

que funciona a 50Hz y utiliza un ancho de pulso que varía entre 1 y 2 ms. La

posición cero corresponde a 1.5 ms. En este caso hay dos señales, una

correspondiente a la velocidad y otra al giro. Un ancho de pulso de 2 ms indica la

mayor velocidad hacia delante y 1 ms la mayor velocidad hacia atrás, y en el caso

del giro 1 ms indica el mayor giro a la izquierda y 2 ms el mayor giro a la derecha.

Cuando tenemos un error nulo la salida de la acción de control debe ser en

régimen permanente 1.5 ms, por eso se ha añadido el término u0 que se suma a la

salida del controlador.

La acción de control anterior es la forma continua del controlador, pero al

implementarla en un microcontrolador no se puede evaluar de manera continua la

función, sino a intervalos de tiempo. Por eso se va a utilizar una forma discretizada

del controlador PI que aproxima el término integral mediante un sumatorio:

Robot

P

I

+

+ + -

referencia de

dirección dirección del

robot

error

actuación

+

u0

+

Capítulo 3 – Descripción del software 31

( ) ( ) ∑

La expresión anterior es evaluada por el microcontrolador más de 10 veces

por segundo, por lo que .

El implementar un controlador con acción integral conlleva un efecto

indeseable que hace que el término integral se acumule y sature el controlador

cuando el error no es capaz de llegar a la referencia. Este efecto se llama windup y

se puede corregir mediante algún mecanismo anti-windup. El mayor perjuicio de

este efecto ocurre cuando varía la referencia y el controlador tarda demasiado en

reaccionar para llegar a la nueva referencia. En este caso se ha optado por limitar

la acción integral para que no crezca indefinidamente.

Este controlador requiere el ajuste de dos parámetros: Kp y Ki que se han

ajustado manualmente hasta obtener una sobreoscilación lo más pequeña posible

y un tiempo de respuesta suficientemente rápido.

Cuando el error supera los 30° se ha optado por hacer que el robot gire

sobre sí mismo, ya que lo permite la configuración diferencial. De esta forma el

controlador PI sólo se utiliza para corregir la trayectoria en un margen de 60°.

Figura 15. Acción según el error en la trayectoria

3.1.d. Obtención de la dirección de referencia en modo guiado por

GPS

Como se ha mencionado anteriormente en el modo 2 el robot se guía a

partir de suposición actual y la posición destino, dados por su latitud y longitud.

Si llamamos a la posición de inicio (x0, y0) y la posición final (x1, y1) (latitud,

longitud) podemos obtener la dirección que debe seguir el robot para llegar a la

posición final de la siguiente manera:

30° -30°

Gira a la

izquierda

Gira a la

izquierda

actuación

del PID

Capítulo 3 – Descripción del software 32

Figura 16. Dirección de referencia en coordenadas geográficas

La IMU del Ardupilot Mega proporciona el ángulo de guiñada (yaw), que

corresponde con la dirección a la que apunta el robot, medido como el ángulo que

forma con respecto a la dirección norte. Devuelve un ángulo comprendido entre 0°

y 360°, donde 90° corresponde con la dirección este y 270° la dirección oeste.

Por tanto, se calcula la dirección deseada de la siguiente manera:

(

)

Para que la función arcotangente devuelva un ángulo que abarque toda la

circunferencia habrá que tener en cuenta los signos del numerador y denominador.

Esta función se halla implementada en la mayoría de compiladores, en este caso

está disponible en Matlab y Arduino y se denomina atan2(numerador,

denominador).

3.1.e. Obtención de la dirección de referencia en modo guiado por

cámara

De manera parecida al modo anterior, en el modo 3 se utilizan las

coordenadas sobre el suelo en lugar de las coordenadas geográficas latitud y

longitud. En este caso la posición se mide en X e Y respecto a la posición de la

cámara. En este problema es conocida la orientación de la cámara con respecto al

norte (α), ya que el UAV también dispone de sensores que le indican la orientación.

Este ángulo también es necesario para realizar comparaciones entre la posición

adquirida por el GPS y la posición que devuelve la cámara.

(x0, y0)

(x1, y

1)

latitud

longitud

θ

dirección

norte

dirección

deseada

Capítulo 3 – Descripción del software 33

Figura 17. Coordenadas obtenidas por la cámara (vista en planta)

Por tanto, la dirección deseada se puede obtener de manera similar a la

anterior, siendo el punto inicial donde se encuentra el robot (x0, y0) y el punto final

de destino (x1, y1). En este caso el punto de destino coincidirá con el origen (0,0)

que es la posición donde se encuentra la cámara y por tanto el UAV al que debe

retornar el robot.

Figura 18. Dirección de referencia en coordenadas de la cámara

La dirección de referencia (θ) se calcula de la siguiente forma:

(

)

Esta dirección es calculada en Matlab y enviada al Ardupilot Mega para

realizar el seguimiento.

x

y

dirección

norte

cámara

α

(x0, y0)

(x1, y

1) = (0, 0)

X

Y

θ

dirección

norte

dirección

deseada

α

β

Capítulo 3 – Descripción del software 34

3.1.f. Consideraciones al programar el microcontrolador

Al programar el microcontrolador se borra la configuración almacenada en

la memoria eeprom. Esta configuración está compuesta por los offsets de los

acelerómetros y giroscopios, necesarios para conocer la posición “cero” de los

ángulos de giro del robot. Por tanto, es necesario llevar a cabo al menos una vez la

calibración de los sensores. El proceso es sencillo y lo realiza automáticamente el

programa del Ardupilot Mega de la siguiente manera:

1. Colocar el interruptor de modo a la posición de calibración

(interruptor hacia el lado de los pines de entrada/salida)

2. Presionar el botón de reset

3. Observar que los leds A y C parpadeen.

4. Esperar hasta que los tres leds permanezcan encendidos

permanentemente.

5. Volver a colocar el interruptor al modo normal y resetear para

iniciar el funcionamiento normal.

Si se conecta el USB al ordenador se podrá ver el progreso de la calibración

a través de un terminal de puerto serie.

El programa resultante ocupa 44576 bytes de un total disponible de 126976

bytes.

3.2. LIBRERÍA DE SEGUIMIENTO CON CÁMARA

Para realizar el seguimiento del robot a través de la cámara se ha utilizado

la librería de licencia libre OpenTLD para Matlab. TLD (Tracks, Learns, Detect) es

un algoritmo de seguimiento de un objeto en una secuencia de video. Se selecciona

el objeto de interés al comienzo de la secuencia y el algoritmo los sigue, aprende su

apariencia y detecta su aparición en el video.

Capítulo 3 – Descripción del software 35

Figura 19. Selección del robot como objetivo a seguir

TLD está escrito en C y Matlab y ha sido desarrollado para Windows, Mac o

Linux. Está basado en la librería libre de visión artificial OpenCV 2.2 escrita en

C/C++. Actualmente se está desarrollando una versión para portar toda la librería

a C/C++ y de esa manera hacerlo más rápido que Matlab.

Este algoritmo es capaz de seguir casi cualquier objeto desde distintos

ángulos e incluso variando las condiciones de luz. El seguimiento es invariante a

los cambios de tamaño del objeto, no así a la rotación del objeto, aunque permite

cierta adaptación a la rotación, ya que continuamente está comprobando las

variaciones del objeto para aprenderlas.

Esta librería requiere una captura inicial del objeto a seguir, luego se

extraen características de este objeto y posteriormente se busca en cada frame

similitudes con las características del objeto. Si se encuentra el objeto deseado en

el frame se añade a la base de datos, de manera que el algoritmo va aprendiendo

analizando cada similitud clasificándola como positiva o negativa. Las clasificadas

como negativas sirven para no equivocarse en la identificación del objeto, y las

clasificadas como positivas son muestras del objeto deseado. Por esto, el algoritmo

mejora su eficacia con el tiempo al tener un mayor número de muestras del objeto.

Capítulo 3 – Descripción del software 36

En el estado actual de la librería sólo puede seguir un objeto a la vez y el

programa corre en un núcleo aunque el ordenador disponga de más. No dispone de

aprendizaje previo, sino que debe ir aprendiendo conforme se ejecuta.

3.2.a. Modificación de la librería

Para las necesidades de este proyecto se ha necesitado modificar ciertos

aspectos de la librería TLD. En primer lugar se requiere hacer un seguimiento del

robot desde posiciones cercanas hasta distancias intermedias, donde el robot

ocupa un tamaño reducido en la imagen de la cámara. Por eso se ha aumentado la

resolución que usa el programa sacrificando velocidad de procesamiento. En la

práctica no es efectivo alejar el robot más de 20 metros pues su tamaño resulta

demasiado pequeño.

Para mejorar el seguimiento se puede seguir aumentando la resolución

utilizada, pero sería necesario un ordenador de mayor potencia al utilizado en este

proyecto, o bien trasladar el programa a C++ cuando éste se halle disponible, ya

que el código de Matlab es más ineficiente. Por ese motivo la librería de

seguimiento utiliza parte del código previamente compilado.

El programa trabaja con imágenes de 640x480 píxeles en escala de grises,

pero se ha modificado para que muestre por pantalla al usuario una imagen de

800x600 a color. Esto requiere modificar la posición en que muestra el objeto

escalándolo según la proporción de resoluciones.

Para tratar los datos captados por el programa a posteriori se guardan los

resultados en un fichero. El fichero se guarda en una subcarpeta llamada “_output”

y almacena la posición de seguimiento en cada instante y la secuencia de video

original. Como no se utiliza ninguna compresión para el video, los ficheros

generados pueden ocupar alrededor de 1Gb para unos minutos de video.

3.2.b. Modificación del método de aprendizaje de la librería

Una de las pruebas que se han realizado en cuanto a modificación de la

librería se trata del aprendizaje previo de las distintas perspectivas del robot. De

esa manera no se depende del aprendizaje en línea que realiza el programa.

La manera de implementar este aprendizaje se ha realizado seleccionando

manualmente el recuadro que contiene al robot variando la perspectiva del mismo.

Los resultados más que mejorar la respuesta del programa la han empeorado

incluso llegando a no detectar al robot en ninguna posición. Por eso se han

desechado estos cambios realizados.

Capítulo 3 – Descripción del software 37

3.3. PROGRAMACIÓN EN MATLAB

En Matlab se ha implementado además del seguimiento con la cámara el

controlador del robot y la telemetría. Para agrupar todas estas funciones se ha

aprovechado la estructura original del programa de seguimiento con cámara. La

estructura general se basa en un programa principal llamado “run_TLD.m”, éste

crea las estructuras básicas de funcionamiento de la librería de seguimiento y

llama a la función “programa.m” que es el encargado de inicializar la cámara, la

comunicación serie y el objeto a seguir por el programa; e incluye el bucle de

funcionamiento normal del programa.

Dentro del bucle del programa se adquiere un fotograma nuevo de la

cámara y se procesa para seguir al robot. La telemetría funciona de manera

asíncrona, procesando los datos según van llegando, aunque el envío de comandos

al robot se realiza en el mismo bucle. Por último, realiza un log de todos los

fotogramas e información de posición del robot desde la cámara y el GPS, además

de orientación del robot. Al pulsar cualquier tecla el programa se detiene y se

vuelca a un fichero todos los datos recogidos en el log, que se guardan en una

carpeta especificada en el archivo “run_TLD.m” en la variable opt.output.

3.3.a. Conversión de coordenadas geográficas a coordenadas UTM

Los datos adquiridos del GPS son coordenadas geográficas (latitud y

longitud) dadas en grados y es necesario convertirlas a unidades de metros para

comparar la posición del GPS con la posición obtenida de la cámara.

Para un punto de la superficie terrestre la longitud mide la distancia con el

meridiano de Greenwich (meridiano cero) y la latitud mide la distancia con el

ecuador, ambos expresados en grados sexagesimales.

El sistema de coordenadas UTM (Universal Transversa Mercator) ideado en

1569 y desarrollado en la década de 1940 por los EEUU es un sistema de

proyección de la superficie terrestre para representarla sobre un plano. La

representación de la superficie de la Tierra sobre un plano supone un problema, ya

que no existe ningún modo de hacerlo sin deformarla y en cualquier caso se

cometen errores en distancias, superficies y ángulos. La proyección UTM conserva

los ángulos pero distorsiona las superficies y distancias originales.

La proyección UTM divide la Tierra en 60 husos de 6° longitud cada uno y

20 bandas de 8° de latitud (representadas por letras desde C hasta X excluyendo I y

O por su similitud con los números 1 y 0). Esta rejilla sirve para disminuir la

distorsión lineal a un máximo de un 1% a costa de perder la continuidad.

Capítulo 3 – Descripción del software 38

Figura 20. Husos y zonas de la rejilla del sistema UTM

Un punto de la superficie quedará localizado con los siguientes datos:

X e Y en metros, kilómetros, millas, etc

Huso

Zona

El origen de coordenadas del sistema UTM es diferente para cada huso,

situándose en la intersección del meridiano central del huso (a 3° de los límites del

huso) con el ecuador. Sin embargo, el origen de coordenadas no tiene valor X=0 e

Y=0, sino que X=500 kilómetros y para el hemisferio sur Y=10.000 kilómetros.

Para convertir la posición de latitud y longitud a metros UTM se ha utilizado

una función llamada deg2utm disponible en el repositorio de funciones Matlab

Central. La forma de utilizar esta función es la siguiente: [X,Y,zona] =

deg2utm(Latitud,Longitud), con latitud y longitud en unidades de grados

sexagesimales y X e Y en metros.

3.3.b. Telemetría desde el puerto serie

Como se ha explicado en el capítulo anterior se utiliza una comunicación

entre el robot y el ordenador a través de unos módulos inalámbricos Zigbee, que

proporcionan una comunicación serie. En Matlab es posible comunicarse a través

de un puerto serie con funciones que incorpora Matlab. Para abrir un puerto serie

en Matlab se deben seguir los siguientes pasos:

1. Abrir el puerto de comunicaciones deseado y asignarlo a un

manejador

Capítulo 3 – Descripción del software 39

handle=serial(‘COM4’,'Name','Nombre');

Hay que seleccionar el puerto utilizado, en este ejemplo es COM4

pero es necesario consultar en cada caso cual se está utilizando.

Opcionalmente se le puede asignar un nombre a dicho puerto.

2. Seleccionar la tasa de transferencia deseada, en este caso hemos

configurado el Zigbee a 57600bps

set(handle,'Baudrate',57600);

3. Configurar el bit de parada, la paridad y los bits de datos. Esta es una

configuración estándar y no suele hacer falta modificarla.

set(handle,'StopBits',1);

set(handle,'DataBits',8);

set(handle,'Parity','none');

4. Opcionalmente se pueden leer los datos de entrada desde una

función externa al programa principal y que se ejecuta cuando se han

alcanzado un número de bytes de entrada o bien cuando se ha

recibido una cadena de texto.

Set(handle,’ BytesAvailableFcn’, {@mycallback,argumento1});

Opcionalmente se pueden añadir argumentos a la función llamada en

este caso “mycallback” colocándolos seguidos en una lista de

corchetes.

Si queremos que se ejecute cada vez que lleguen X bytes desde el

puerto serie añadiremos las líneas:

Set(handle,’BytesAvailableFcnCount’,X);

Set(handle, ‘BytesAvailableFcnMode’,’ byte’);

Si queremos que se ejecute cuando se ha escrito una cadena

terminada en un terminador (retorno de carro o nueva línea)

añadiremos la línea:

set(tld.serial,'Terminator',' LF/CR');

Set(handle, ‘BytesAvailableFcnMode’,’ terminator’);

En este caso el terminador es una línea nueva seguida de un retorno

de carro pero puede ser cualquier combinación de estos o cualquier

otro byte que corresponda a un carácter ASCII (0-127).

Capítulo 3 – Descripción del software 40

5. Se abre el puerto para comenzar a recibir y enviar datos.

fopen(handle);

6. Matlab proporciona distintos modos de comunicarse por el puerto

serie. En este caso se utilizan las funciones fread y fwrite.

7. Una vez no se vaya a seguir utilizando el puerto serie hay que

cerrarlo.

fclose(handle);

delete(handle);

3.3.c. Protocolo de comunicación serie

En la comunicación entre Matlab y el Ardupilot Mega es necesario enviar

información de distinto tipo según el modo en que esté funcionando el robot. Para

diferenciar los tipos de datos que se envían desde Matlab al Ardupilot Mega se ha

creado un sencillo protocolo que envía un byte de cabecera para clasificar los datos

enviados. De esta forma se definen 4 tipos de cabecera, con su valor en formato

hexadecimal:

0xAB: cambio de modo de funcionamiento + variable de 1 byte

correspondiente al modo.

0xA9: Latitud del punto de destino en modo de guiado por GPS +

variable de 32 bits correspondiente a la latitud en formato de punto

fijo con 7 decimales.

0xAA: Longitud del punto de destino en modo de guiado por GPS +

variable de 32 bits correspondiente a la longitud en formato de

punto fijo con 7 decimales.

0xA8: Dirección de referencia para el modo de guiado por cámara +

variable de 16 bits correspondiente a la dirección de referencia en

formato de punto fijo con 2 decimales.

Para enviar los datos desde el Ardupilot Mega a Matlab se ha optado por

otro modo de comunicación, enviando toda la información codificada en ASCII y

separando las variables con comas. Cada paquete enviado se termina con un

carácter especial llamado “retorno de carro”, que corresponde en decimal al

número 13. Las variables que se envían en cada paquete son: latitud y longitud

actual del robot, número de satélites que observa el GPS, 3 ángulos de orientación

de la IMU y distancia al punto de destino. En el caso de las variables de latitud y

longitud se envían

Capítulo 3 – Descripción del software 41

3.4. CONVERSIÓN DE POSICIÓN EN LA IMAGEN A POSICIÓN

EN EL TERRENO

La librería de seguimiento proporciona el recuadro en el que se halla el

objeto, en este caso el robot. Se tomará como posición del robot el centro del

recuadro. El tamaño del recuadro puede dar cierta información de distancia a la

cámara pero se ha visto en la práctica que resulta poco fiable y no se ajusta

siempre perfectamente al tamaño del robot.

La calibración de la cámara consiste en determinar la relación entre la

posición de lo que aparece en el plano de la imagen y su localización en el mundo

real.

La imagen observada por la cámara ve la proyección sobre el sensor de la

posición del robot. Para obtener una medida de distancia es necesario deshacer la

perspectiva de la imagen. Si consideramos que el suelo proyectado en la cámara

guarda una perspectiva frontal, lo cual se asemeja bastante a la realidad, se puede

aplicar una transformación del tipo proyectiva.

Una transformación afín se define como una transformación lineal no

singular seguida de una traslación, si se hace más generalizada añadiendo una

transformación de perspectiva obtendremos una transformación proyectiva. La

representación matricial de esta transformación es

(

) (

)( )

O en forma compacta

[

]

Donde A es una matriz no singular, es decir, con determinante distinto de

cero; t es el término de traslación, p es el término de perspectiva y e es el término

del escalado. En total hay 9 variables aunque sólo 8 son independientes. Con esto

queda que una proyectividad puede ser calculada a partir de la correspondencia

entre cuatro puntos.

Esta conversión será válida en terrenos relativamente llanos, y debido a las

limitaciones indicadas en el punto 3.2b sería para distancias cercanas-intermedias.

Si se tiene en cuenta que el robot se encuentra en un principio acoplado al UAV se

tendrá que el terreno de alrededor no debe ser muy inclinado ni accidentado, pues

no podría aterrizar el avión. Por ese motivo se puede aplicar la transformación con

un error aceptable en el cálculo de la posición del robot.

Capítulo 3 – Descripción del software 42

3.4.a. Transformación proyectiva en Matlab

Matlab proporciona un conjunto de funciones que resuelven el sistema de

ecuaciones de una transformación proyectiva a partir de cuatro o más

equivalencias entre puntos. Estas equivalencias se encuentran comprobando la

posición real en que se encuentra un punto visto en la imagen captada por la

cámara.

La función de Matlab que resuelve la transformación se llama cp2tform, y

requiere los siguientes argumentos:

t = cp2tform(input_points, base_points,'projective');

El argumento input_points es una matriz Nx2 que guarda la posición de los

píxel de la imagen, base_points es otra matriz de la misma dimensión que identifica

cada pixel con su posición en la realidad. El número de puntos N debe ser mayor

que 4 para este tipo de transformación.

Esta función también se puede utilizar para otros tipos de transformaciones

indicándolo con el tercer argumento, el cual puede ser 'affine', 'similarity',

'polynomial', 'piecewise linear' o 'lwm'.

Una vez se ha creado la variable que guarda la transformación, en este caso

t, se puede realizar la transformación directa (coordenadas de la imagen a

coordenadas en la realidad) con la función tformfwd, y la transformación inversa

con la función tforminv. La forma de utilizarlo es como sigue:

[X, Y] = tformfwd(t, u, v);

Donde (u, v) es la posición del objeto en la imagen y (X, Y) es la

correspondencia de esos puntos en la realidad.

3.4.b. Calibración de la cámara

Las funciones anteriormente descritas requieren al menos 4

correspondencias entre puntos de la imagen y en la realidad, por lo que es

necesaria la calibración de estos puntos debidamente para un buen

funcionamiento del programa. En Matlab se ha desarrollado una interfaz para

calibrar la cámara. Primero se marca un punto en la imagen, luego hay que medir

Capítulo 3 – Descripción del software 43

la posición respecto a la cámara, se toman al menos 4 puntos y después el

programa guarda la configuración en un archivo llamado calibracion.m para abrirlo

posteriormente por el programa de seguimiento en Matlab. Un mayor número de

puntos reducirá errores en la medida.

Figura 21. Interfaz en Matlab para calibrar la cámara y puntos introducidos

Aunque esta calibración puede ser válida para tomar medidas con la cámara

es necesario comprobar a posteriori con el robot que las distancias medidas sean

correctas. Normalmente habrá un pequeño desajuste entre la medida de la cámara

y la real que puede eliminarse realizando manualmente un ajuste más fino de la

transformación.

Los valores de correspondencia de los 13 puntos medidos en la calibración

de la cámara son los siguientes, teniendo en cuenta que la resolución de la imagen

utilizada para calibrar es de 800x600 píxeles y posteriormente se reescalarán los

resultados a 480x640 con que funciona el programa.

Puntos en la imagen (u, v) (píxeles)

Posición en la realidad (X, Y) (metros)

(400, 221) ( 10.5, 0)

(400, 236) ( 8, 0)

Capítulo 3 – Descripción del software 44

(400, 279) ( 5, 0)

(400, 204) ( 14, 0)

(311, 229) ( 9, -1.2)

(211, 230) ( 9, -2.4)

(133, 230) ( 9, -3.6)

(249, 278) ( 5, -1.2)

(93, 277) ( 5, -2.4)

(476, 17) ( 11, 1.2)

(548, 214) ( 11, 2.4)

(581, 229) ( 9, 2.4)

(643, 346) ( 3, 1.2)

Es conveniente indicar que para que la calibración sea válida es necesario

que de un experimento al siguiente la cámara no modifique su altura ni inclinación

respecto al suelo. Para solucionar esto se ha colocado la cámara en un trípode y se

ha marcado la posición para no variarla. La posición que se ha adoptado para la

cámara es una altura desde el suelo al centro de la cámara de 1.2 metros y una

inclinación de 20 grados respecto la vertical.

Capítulo 3 – Descripción del software 45

Figura 22. Trípode utilizado para mantener la posición de la cámara

1.2 m

20°