Documentos de Académico
Documentos de Profesional
Documentos de Cultura
JE
ESÚS MA
ARÍA GO
ONZÁLE
EZ VILL
LAGÓME
EZ
REALIIMEN
R NTACIÓÓN VIISUALL
PAR
RA EL CONNTROL L DE
UN VEHÍÍCULO
O AÉR
REO
CU
UATRIMOTO OR NOO TRIP
PULAADO
S
SEVILLAA
2010
UNIV
VERSID
DAD DE SEVIILLA
INGEN
NIERO EN INF
FORMÁ
ÁTICA
REALIIMEN
R NTACIÓÓN VIISUALL
PAR
RA EL CONNTROL L DE
UN VEHÍÍCULO
O AÉR
REO
CU
UATRIMOTO OR NOO TRIP
PULAADO
Dptoo. de Ing
genieríaa de Sisttemas y Automáática
Escuela
E Suuperior de Ingeniero
os
POR
JE
ESÚS MA
ARÍA GO
ONZÁLE
EZ VILL
LAGÓME
EZ
TUTOR
D MA
DR. ANUEL V
VARGAS
S VILLA
ANUEVA
A
Sevilla, S
Septiembree de 2010..
i
ii
iii
1. Introducción 1
1.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Problemas en el control visual de vehículos aéreos autónomos . 4
1.3. Objetivos y propuestas . . . . . . . . . . . . . . . . . . . . . . 7
1.4. Estructura del proyecto . . . . . . . . . . . . . . . . . . . . . 8
vii
ÍNDICE GENERAL viii
B. OpenCV 196
B.1. Características de la versión 2.0 . . . . . . . . . . . . . . . . . 196
B.2. Configuración de OpenCV . . . . . . . . . . . . . . . . . . . . 196
B.2.1. Configuración en Ubuntu 9.10 . . . . . . . . . . . . . . 196
B.2.2. Configuración para Dev C++ en entornos Windows . . 202
B.3. Características de la versión 2.1 . . . . . . . . . . . . . . . . . 209
xi
ÍNDICE DE FIGURAS xii
Introducción
1.1. Introducción
Los vehículos aéreos autónomos, o como se conocen también por sus siglas
en inglés, UAV1.1 , han sido un área de investigación muy activa durante los
últimos años. Por ejemplo, el uso de UAVs en aplicaciones civiles de patrulla-
je, monitoreo o investigación [1] continúa en crecimiento debido en parte a la
evolución y reducción en el coste de los sistemas de visión.
1.1
Unmanned Aerial Vehicle, o vehículo aéreo no tripulado.
1.2
Global Positioning System o sistema de posicionamiento global.
1
1.1. Introducción 2
Muchas publicaciones a lo largo de los últimos años muestran que las téc-
nicas de control visual1.3 incrementan la calidad (exactitud, robustez,etc) del
sistema [25][29][66]. La calidad del tracking 1.4 y del control depende del tipo
y número de características de la imagen que se utilizan, donde la redundan-
cia juega un papel muy importante [89] siendo esto habitual en las tareas de
control visual.
1.3
O por su traducción en inglés: Visual Servoing.
1.4
Equivale a la calidad del algoritmo de seguimiento.
1.5
Decir que en principio las pruebas de realizan en interiores, pero que el algoritmo es
para seguimiento de características en general.
1.2. Problemas en el control visual de vehículos aéreos autónomos 4
Esto provoca pues que el investigar con este tipo de plataformas sea una
tarea compleja y peligrosa. En numerosos estudios, para la realización de las
pruebas pertinentes del controlador, se suelen establecer medidas de seguridad
para evitar el anterior desenlace: sujeción con cables a una grúa o al techo,
sensores de infrarrojos para comprobar que la altura actual se mantiene entre
unos márgenes de seguridad, etc.
operan en un espacio tridimensional mucho más amplio que los robots terres-
tres, añadiendo que las capacidades y carga útil de los vehículos aéreos de
pequeña a media escala son mucho más limitadas que la de los robots móviles
terrestres.
En este aspecto, los sensores ópticos actuales suelen ser livianos y eficientes
en lo que se refiere al consumo de energía. Con el aumento en la miniaturi-
zación de los sensores CCD1.6 y CMOS, la visión por computador ofrece su
potencial a los MAUV (Micro Air Unmanned Vehicles). Al contrario que los
sensores de escaneado o de barrido laterales, como los láseres, las cámaras
toman muestras instantáneas del entorno, lo que es óptimo para este tipo de
plataformas dinámicas.
Pero no todo son ventajas al usar este tipo de sensores; ante cambios en las
condiciones lumínicas, la calidad de las tomas capturadas disminuye, usual-
mente hasta que el sensor se adecua a las mismas. Incluso aunque todas las
condiciones para la captura de imágenes sean las idóneas, existe el problema
subyacente de la interpretación de la escena y de la extracción de la informa-
ción relevante de ella.
1.6
Un CCD (siglas en inglés de charge-coupled device: ‘dispositivo de carga acoplada’) es
un circuito integrado que contiene un número determinado de condensadores enlazados o
acoplados
1.2. Problemas en el control visual de vehículos aéreos autónomos 6
Así pues, el problema del control visual para un vehículo aéreo autónomo
puede ser descrito como:
Desarrollo del sistema de visión : Éste a su vez puede ser subdividido en:
Fusión sensorial :
Cómo integrar la información visual y la de los demás sensores on-board,
como pueden sensores inerciales, GPS u otros, y la definición del esquema
más adecuado en el cual las referencias visuales sean integradas en el
control de vuelo.
1.7
Es necesario aún realizar experimentos con el controlador propuesto en la actualidad.
1.8
Más concretamente el origen del sistema de coordenadas del quadrotor será un punto
intermedio entre el origen de coordenadas del sensor óptico y del sensor inercial.
1.4. Estructura del proyecto 8
2.1. Introducción
2.1
Este es el tipo de plataforma con la cual se ha experimentado en el presente proyecto.
11
2.1. Introducción 12
Se presenta pues a continuación un amplio repaso del estado del arte del
control (sin realimentación visual) en UAV para posteriormente exponer el
estado del arte actual del control visual para vehículos aéreos no tripulados.
Todo lo relativo a la localización y seguimiento de objetos se presenta en pro-
fundidad en el capítulo 4.
Figura 2.3: Detalle de las antenas receptoras del GPS del prototipo de la
Universidad de Standford “Hummingbird”.
2.4
Siglas inglesas para Nonlinear Model Predictive Trajectory Controller.
2.5
Todos los aviones tienen limitaciones físicas: no pueden volar demasiado despacio, o
entrarían en pérdida; ni demasiado rápido, ya que, o maniobran dentro de sus parámetros
específicos o se volverían inestables e imposible de maniobrar.
2.3. Control con información visual de vehículos aéreos autónomos 16
Se puede decir que la visión por computador es una de las áreas más im-
portantes en el mundo actual de la robótica. Hace relativamente pocos años,
las capacidades hardware de los equipos empotrados no permitían la puesta
en marcha de aplicaciones visuales sofisticadas. Éste era el principal obstáculo
que evitaba que el control visual tuviera el desarrollo que ha tenido estos años
atrás. Pero tras la introducción de nuevas arquitecturas hardware y de proce-
sadores más rápidos y con soporte para programación paralela, y de cámaras
cuyas características crecen exponencialmente con coste lineal, la potencial
ubicuidad del control visual se ha hecho una realidad.
2.6
O por sus siglas en español Procesador Digital de Señales.
2.3. Control con información visual de vehículos aéreos autónomos 17
En [59] se enfoca el uso de una cámara como sensor adicional para la nave-
gación del helicóptero autónomo para el caso particular del aterrizaje. Dada
una secuencia de imágenes tomadas por la cámara se consigue una estimación
del movimiento tridimensional de la misma, la cual se fusiona con la informa-
ción inercial.
La más interesante, desde el punto de vista del redactor del presente docu-
mento, es el caso de navegación tridimensional presentado en [48], en la cual
se propone una técnica que combina flujo óptico con visión estereoscópica. Si
se combina esta técnica con mapas probabilísticos y un planificador de trayec-
torias, y según demuestran en varios experimentos, es posible la navegación
de un UAV en entornos urbanos de forma completamente autónoma.
2.4. Aplicaciones del control visual en plataformas autónomas 18
Figura 2.8: Titular de la revista Spectrum: “Lecciones del vertido del Golfo
para la Robótica”.
Misiones militares :
Otra de las aplicaciones de vehículos aéreos no tripulados tienen carác-
ter militar. Situaciones en las que se desea simplemente determinar el
estado del terreno; aquéllas en las que no se desean pérdidas de vidas hu-
manas, etc. Últimamente los ejércitos de los países más avanzados están
equipando a sus plataformas UAV con misiles de corto y largo alcance,
para misiones tácticas o de destrucción de infraestructuras estratégicas.
Simplemente al iniciar el explorador web, e introducir en cualquier bus-
cador la palabra UAV y buscar por imágenes, las primeras obtenidas de
la búsqueda son como la mostrada en la Figura 2.9 derecha.
2.7
National Aeronautics and Space Administration.
Capítulo 3
3.1. Introducción
A continuación se detalla el estado del arte del control visual en general, co-
menzando por las diversas configuraciones entre la cámara y el robot y luego
por los esquemas de control propuestos.
21
3.2. Configuraciones cámara-robot 22
Cámara en mano :
En este caso la cámara está montada en el brazo del robot (Figura 3.1) y
se mueve a la par del movimiento del mismo. En esta configuración existe
una relación constante entre el sistema de coordenadas de la cámara y el
sistema del efector final del robot. Algunas aplicaciones requieren más
de una cámara como en [78]. Una característica de esta configuración es
que se pueden obtener imágenes de regiones particulares de la escena, es
decir imágenes de carácter parcial [71] donde la resolución efectiva de la
escena puede ser incrementada, siempre que sea necesario.
Cámara fija :
En esta segunda disposición (Figura 3.2) se tiene una o varias cámaras
fijas en algún punto del espacio de trabajo de tal manera que la escena
es observada desde el sistema de la cámara. La relación entre el sistema
de coordenadas de la cámara y de la base del robot es constante, de tal
manera que la posición de la cámara es independiente del movimiento
que el brazo del robot pueda efectuar.
3.2. Configuraciones cámara-robot 23
Figura 3.2: Ejemplo de cámara fija (izquierda) embebida en parte inferior del
sistema de la derecha.
3.1
Hacer girar la cámara en todo el plano panorámico.
3.2
Inclinación de la cámara.
3.3
Por sus siglas en inglés, Pan Tilt Zoom.
3.2. Configuraciones cámara-robot 24
3.4
También denominado “tracking” de un objeto. Se profundiza en el presente capítulo.
3.3. Esquemas de control visual 25
La información visual.
En [24] además de analizar los posibles problemas del control visual ba-
sado en imagen, como son las singularidades y los mínimos locales, se
presentan dos leyes de control para el control visual 2½D, y se comen-
ta brevemente las condiciones para obtener una estabilidad global del
sistema. En [90] se presenta un controlador adaptivo para un esquema
de control 2½D, y se comprueba su estabilidad mediante Lyapunov. En
[28] también se utiliza la reconstrucción proyectiva para realizar control
2½D pero aplicado a objetos planos para un sistema monocular cámara
en mano. En [91] se implementa un nuevo controlador y se compara con
otro basado en la descomposición a partir de la geometría epipolar.
Esta última matriz depende tan solo de dos nuevas características vi-
suales fácilmente computables a partir de las originales. En las pruebas
realizadas se observa que con este esquema se evitan los movimientos
3.3. Esquemas de control visual 32
También hay esquemas de control libres del modelo que realizan control
visual 3D donde la rotación y la traslación son determinadas a partir
de la matriz esencial, la cual es estimada a partir de las imágenes de la
posición actual y de la posición de referencia.
3.3. Esquemas de control visual 35
Esta clasificación fue propuesta por Kragic [105]. En éste se considera co-
mo elemento de clasificación el modelo visuo-motor del sistema, es decir, la
relación entre la parte motora del sistema y las características en la imagen.
Se dice que es conocido a priori si se dispone de los modelos de los diferentes
componentes del sistema. En caso contrario habría que realizar una estimación.
Otro campo es el del control visual en sistemas de alta velocidad, como por
ejemplo el sistema estéreo para seguir y golpear una pelota de ping-pong [109].
En [113] se describe una propuesta basada en una estructura con configura-
3.4. Otros aspectos del control visual 37
A diferencia del uso de puntos en la imagen, pocos trabajos han sido de-
dicados al control visual a partir de líneas (Figura 3.12). La razón principal
es la dificultad de manejar las características de las líneas en la imagen, las
cuales representan en geometría proyectiva la proyección de un plano 3D que
pasa por el centro óptico de la cámara.
3.5. Conclusión
Para una información más completa y detallada acerca de todos los elementos
presentados en este capítulo, se refiere al lector a consultar [41] y [51].
Capítulo 4
4.1. Introducción
Existen otras propuestas [50] en las que se propone una clasificación distin-
ta a la presentada en este capítulo, enfocándose de distinta forma el conjunto
de algoritmos presentes en la literatura. Así pues, en el presente capítulo se
expone de forma amplia y detallada conceptos relacionados con:
Representación del objeto de referencia (Figura 4.1).
39
4.1. Introducción 40
Una definición relativamente simple que se puede realizar para la tarea del
seguimiento de objetos, puede ser como el “problema de la estimación de la
trayectoria de un objeto determinado con movimiento en el plano de la ima-
gen”. Pero esta tarea, por “liviana” que pudiera parecer su definición, conlleva
una serie de problemas:
4.1. Introducción 41
Puntos :
El objeto de referencia se puede representar como un único punto, lo que
se correspondería con el centroide del objeto (Figura 4.2.Izquierda), o
bien como un conjunto de varios puntos (Figura 4.2.Derecha). En gene-
ral, la representación por puntos es adecuada en situaciones en las que
el objeto de referencia ocupa pequeñas regiones en la imagen.
Formas geométricas :
El objeto puede ser representado bien como un rectángulo (Figura 4.3)
o como una elipse. El movimiento del objeto en este tipo de aproxima-
ciones y en las basadas en puntos pueden modelarse por su traslación
respecto a un origen determinado o por una transformación proyectiva
(homografia). Este tipo de técnicas son usadas tanto para el seguimien-
to de objetos rígidos como para el seguimiento de objetos de geometría
variable.
4.2. Representación del objeto 43
Siluetas y contornos :
La representación por contornos (Figura 4.4. Izquierda) de un objeto de-
fine las “fronteras” del mismo. La región contenida dentro del contorno
se denomina silueta del objeto (Figura 4.4. Derecha). Tanto la repre-
sentación por siluetas como por contornos son buenas técnicas para el
seguimiento de formas complejas no rígidas.
Modelos articulados :
Los objetos de referencia articulados están compuestos, en general, por
un conjunto de partes que unidas conforman al objeto. Por ejemplo, el
cuerpo humano se puede considerar como un objeto articulado, formado
por el torso, los brazos, las manos, la cabeza y los pies. La relación entre
las distintas partes está regida por modelos cinemáticos de movimiento.
4.2. Representación del objeto 44
Densidad de probabilidad :
La estimación de densidad de probabilidad de la apariencia del objeto
puede ser paramétrica, como el Gausiano de una imagen4.1 , o no pa-
ramétrica, como un histograma . Se basan en clasificar mediante algún
tipo de función las características del objeto, tales como el color o la
textura.
Plantillas :
Las plantillas se componen usando formas geométricas simples o silue-
tas. Una de las ventajas del uso de plantillas es que se codifican tanto la
apariencia del objeto, como sus dimensiones. Sin embargo, la informa-
ción visual para la apariencia es extraída tan sólo de una única vista.
Modelos activos :
Estos modelos son generados considerando al mismo tiempo la aparien-
cia y la forma del objeto. En general, la forma del objeto se define por un
conjunto de puntos de referencia que pueden pertenecer a la frontera del
objeto o, alternativamente, pueden estar contenidos dentro de la región
del mismo.
En general, existe una relación directa entre la representación del objeto y los
algoritmos de seguimiento asociados. Normalmente, en función de las condi-
ciones de la aplicación, se elige una representación u otra para el objeto.
4.3. Selección de características para el seguimiento 47
Por ejemplo, el color suele usarse como una característica cuando se usan
métodos de localización basados en histogramas; de igual modo también son
usados los contornos para métodos basados en contornos, donde el color no se
considera.
Color :
Para la codificación del color de una imagen existen dos grandes méto-
dos: la codificación RGB4.2 y la codificación HSV4.3 . Cada método tiene
sus ventajas e inconvenientes. Por ejemplo, las diferencias entre los co-
lores en el modelo RGB no se corresponden con las diferencias de color
percibidas por el ojo humano, y ambos modelos son sensibles a ruidos
en la imagen.
Bordes :
Normalmente los cambios en la intensidad de las imágenes son mayores
ante la presencia de bordes. Una propiedad importante de los bordes
es que son relativamente más robustos que los basados en color ante
cambios de iluminación. La propuesta más conocida que usa esta técnica
es la del detector de bordes de Canny.
Flujo Óptico :
El flujo óptico se puede considerar como un campo de vectores que re-
presentan el desplazamiento de cada punto, el cual define la traslación
de cada píxel en una región. Se calcula usando una restricción sobre
4.2
Toda imagen queda codificada como una combinación de los colores Red Green Blue.
4.3
Del inglés Hue, Saturation, Value – Tonalidad, Saturación, Valor.
4.3. Selección de características para el seguimiento 48
Texturas :
La textura se puede considerar como una medida de la variación de la
intensidad de una superficie, la cual codifica propiedades como regulari-
dad y suavidad en los valores de los píxeles. Al contrario que el color, la
textura precisa de un pre-procesado para generar unas estructuras deno-
minadas descriptores. Al igual que los modelos basados en bordes, este
método es menos sensible a los cambios de iluminación que el color.
En esta sección se muestran con un mayor nivel de detalle los métodos para
la localización del objeto de interés en la escena. Se divide en dos apartados:
métodos para la detección de puntos característicos en la escena y métodos
basados en otras representaciones. Esta distinción es necesaria, puesto que
en el presente proyecto todas las propuestas implementadas se basan en una
representación por puntos del objeto de referencia.
Este tipo de métodos son usados para encontrar puntos que presenten cier-
tas singularidades respecto al área en la que están integrados. Una propiedad
deseable de un punto de interés (o corner, como se indica en [120]), debe ser
su invarianza ante cambios de iluminación en la escena desde el punto de vista
de la cámara. En la literatura, los métodos más usados siguiendo este esquema
son el operador de Moravec [114], la técnica de Harris [45], el detector KLT
[117] y el detector de características SIFT [115].
P 2 P !
I Ix Iy
M= P x P 2 (4.1)
Ix Iy Iy
4.4. Detección del objeto 50
Posteriormente, tanto los candidatos con un bajo contraste como los que
están incluidos en los bordes, son eliminados. Por último, a los puntos res-
tantes se les asignan orientaciones basándose en los picos del histograma en
la dirección del gradiente, en un pequeño entorno de vecindad alrededor de
cada punto candidato. Para más información, se detalla en profundidad este
método en la sección 7.2.4.
Dado que tan solo se han usado implementaciones de alguno de los métodos
propuestos en el apartado anterior, cualquier método no basado en detección
de puntos no será tratado en el resto del documento.
Seguimiento de puntos :
El objeto de interés, el cual es localizado en frames consecutivos, es re-
presentado como un conjunto de puntos, y la asociación de los mismos
se basa en los estados previos del objeto, los cuales incluyen información
tanto de la posición como del movimiento. Con esta aproximación es ne-
cesario el uso de un método externo para la detección del objeto en cada
frame. En el apartado 4.5.1 se detallan varias técnicas pertenecientes a
esta categoria.
Kernel Tracking :
En este contexto, kernel se refiere a la forma o apariencia del objeto de
referencia. Por ejemplo, la representación del objeto en este apartado
puede ser bien un rectángulo, o bien una elipse, ambos con un histogra-
ma asociado. El objeto es seguido en frames consecutivos calculando el
movimiento de la forma que engloba al mismo, lo cual se puede observar
en la Figura 4.10. Este movimiento normalmente se suele describir en
términos de traslación, rotación y transformación afin.
4.5. Seguimiento del objeto 54
Seguimiento de siluetas :
Este tipo de métodos usan la información contenida dentro de la región
del objeto, lo que se ha denominado anteriormente como apariencia, pa-
ra calcular los bordes o extremos de la propia región. Esta información
se representa bien como mapas de vectores, o como densidad de probabi-
lidad, entre otros. Dados los modelos de los objetos, las siluetas pueden
ser seguidas bien por técnicas de matching 4.4 de formas o por el método
de evolución de contornos.
Para hallar las correspondencias entre los puntos en este tipo de métodos,
se tienen en cuenta posibles incertidumbres o errores en el modelo para es-
timar la posición del objeto. Estos errores pueden ser debidos a oclusiones o
cambios de las condiciones lumínicas, entre otros.
Los cambios entre los estados del objeto quedan reflejados en la siguiente
ecuación:
X t = f t (X t−1 ) + W t
4.5
Ruido que no se corresponde con ninguna distribución estadística.
4.5. Seguimiento del objeto 58
Existen varias propuestas usando otra representación del objeto; desde cal-
cular la media de los valores del histograma para los píxeles que representan
al objeto, hasta ponderar los valores digitales que tienen dichos píxeles en el
histograma. Esta segunda técnica se conoce como mean-shift. Para más infor-
mación, consúltese [120], capítulo relacionado con tracking.
P 2 P ! ! !
I Ix Iy
P
du Ix It
P x P 2 =
Ix Iy Iy
P
dv Iy It
! ! ! !
x0 a b x tx
= +
y0 c d y ty
Dado que los algoritmos presentados en este apartado no han sido estu-
diados a lo largo del desarrollo del presente proyecto, se propone una relación
esquemática con las principales técnicas y algoritmos, para concluir la clasifi-
cación del estado del arte de la localización y seguimiento de objetos.
Se puede considerar al sensor óptico como a uno de los elementos más im-
portantes de todo el proyecto. Es por ello que se necesita de todo un capítulo
para desarrollar el modelo de cámara usado, el proceso de calibración, y la
base teórica que subyace en todo el proceso. Se presenta pues todo lo relacio-
nado con la cámara que ha sido necesario estudiar para poder llevar a cabo la
implementación presentada en el capítulo 6.
61
5.1. Modelado de la cámara 62
Gracias a esta relación geométrica se pueden definir cuáles son los paráme-
tros extrínsecos5.1 del modelo, los que determinarán la posición y orientación
del sistema de coordenadas de la cámara respecto del sistema de coordenadas
del mundo real o del objeto5.2 .
tx
t = ty
(5.2)
tz
5.1
También denominada como técnica de calibración externa.
5.2
La definición puede ser al revés, considerando el sistema de referencia de la cámara
como el origen.
5.1. Modelado de la cámara 64
1 0 0
0 cosφx −senφx
Rot(X, φx ) = (5.3)
0 senφx −cosφx
cosφy 0 senφy
Rot(Y, φy ) =
0 1 0 (5.4)
−senφy 0 cosφy
cosφz −senφz 0
Rot(Z, φz ) =
senφ z cosφz 0
(5.5)
0 0 1
Representación RPY :
Representación de Euler :
R = Euler(φ, θ, ψ) = RP Y (ψ, θ, φ) =
cosφcosψ − senφcosθcosψ −cosφsenψ − senφcosθcosψ senφsenθ
cosφcosψ + cosφcosθsenψ −senφsenψ + cosφcosθcosψ −cosφsenθ
P zc P zw
x = u0 + fx u (5.10)
y = v0 + fy v (5.11)
x fx γ u0 u x u
y = 0 fy v0 v ó y = K v (5.12)
1 0 0 1 1 1 1
5.1. Modelado de la cámara 66
fx 0 u0
K = 0 fy v0
(5.13)
0 0 1
fx = kx f (5.14)
fy = ky f (5.15)
donde kx y ky son los factores de escala, que relacionan el tamaño del píxel
con la distancia real. Estos resultados son calculados experimentalmente en el
capítulo 7.
X
1 c T
q̃ = Yc = (u, v, 1) (5.16)
Zc
Zc
5.6
En nuestro caso tan solo consideramos 4 (2 de distorsión radial y 2 de distorsión tan-
gencial), pero en otras situaciones es necesario el uso del conjunto total.
5.2. Posicionamiento 3D mediante el sistema de visión 71
" #
a a
a Rb tb
Tb =
01x3 1
" #
w w
w Rg tg
Tg =
01x3 1
o
Tg =o Tc ·g T−1
c
Figura 5.11: Detalle de una de las capturas del objeto para la calibración.
Este tipo de objetos son muy buenos para procesos de calibración por va-
rios motivos: se conoce perfectamente el modelo del objeto, y además el punto
característico se encuentra con una precisión bastante buena, porque es un
punto en el que el cambio de la intensidad del color es máximo.
λp̃ = K[R t] P̃
Xw
x Xw
Yw
λ y
= K [ r1 r2 r3 t ]
= K[ r1 r2 t] Yw
(5.21)
0
1 1
1
rT1 r1 = rT2 r2
rT1 r2 = 0 (5.24)
1 −γ γv0 −fy u0
fx2 fx2 fy fx2 fy
−γ γ2 −γ(γv0 −fy u0 )
B=
fx2 fy fx2 fy2
+ f12 fx2 fy2
− fv02
(5.27)
y y
(γv0 −fy u0 )2 v02
γv0 −fy u0 −γ(γv0 −fy u0 )
fx2 fy2 fx2 fy2
− fv02 fx2 fy2
+ f2 + 1
y y
Por lo tanto las restricciones planteadas en 5.25 pueden ser re-escritas como
una ecuación homogénea en b de la forma:
5.3. Proceso de calibración 77
" #
T
v12
b=0 (5.29)
(v11 − v12 )T
donde se tendrán tantas ecuaciones como imágenes del plano se tengan;
las cuales se pueden apilar para formar un sistema de la forma:
Vb = 0 (5.30)
donde V es una matriz de 2n × 6, siendo n el número de imágenes, y al
menos debe cumplirse que n ≥ 3 para obtener una solución única para b . Se
sabe que la solución a un sistema como el anterior es el vector propio de VT V
asociado a su valor propio más pequeño.
Una vez que se consigue estimar b , se obtienen a partir de éste todos los
parámetros intrínsecos:
2
v0 = (B12 B13 − B11 B23 )/(B11 B22 − B12 )
0 2
λ = B33 − [B13 + v0 (B12 B13 − B11 B23 )]/B11
q
fx = λ0 /B11
q
2
fy = λ0 B11 /(B11 B22 − B12 ) (5.31)
γ = −B12 fx2 fy /λ0
u0 = γv0 /[fy − (B13 fx2 /λ0 )]
r1 = λK−1 h1
r2 = λK−1 h2 (5.32)
r3 = λK−1 h3
Una vez obtenidos estos datos, sirven como datos iniciales para una etapa
de refinamiento a través de técnicas iterativas, donde además se estiman las
distorsiones radial y tangencial.
5.3. Proceso de calibración 78
Durante el desarrollo del proyecto, dado que hasta el momento todo lo que
se había implementado había sido usando la libreria OpenCV en su versión
2.0, se propuso en una primera aproximación usar las funciones para calibra-
ción propias de esta librería.
Sin embargo, tras los primeros resultados en los que la reconstrucción par-
cial de los puntos de la imagen no se correspondían con los puntos reales
tridimensionales, y los parámetros intrínsecos contenían algunos errores, se
optó por una calibración externa, fuera de línea, basada en el mismo algorit-
mo que el expuesto en la sección anterior, pero usando para ello la plataforma
de Matlab.
5.7
También denominado como punto característico.
5.3. Proceso de calibración 79
Los resultados devueltos por esta función eran, ordenados por filas y colum-
nas, las coordenadas de los corners en el plano de la imagen. Posteriormente
se aplicaba una función para obtener una mejor precisión en las coordenadas
extraídas, cvFindCornerSubPix().Una vez que se tenían suficientes puntos del
mismo objeto visto desde varios puntos de vista (Figura 5.13), el siguiente
paso consistía en calcular los parámetros intrínsecos de la cámara.
Figura 5.13: Imágenes del tablero de ajedrez vistas desde varios puntos dis-
tintos.
5.3. Proceso de calibración 80
Paso 1:
Iniciamos Matlab y tecleamos el comando calib_gui. Aparecerá un diá-
logo en el cual podremos establecer si queremos “cargar” todas las imá-
genes a la vez, o si de lo contrario, estimamos mejor una por una. En
nuestro caso se eligió la segunda opción:
5.3. Proceso de calibración 83
Paso 2:
Cargamos el conjunto de imágenes que hayamos estimado necesarias
para la calibración (en este caso, el total de imágenes son 17):
Paso 3 :
En este paso se extraen bien de forma manual o automática los corners
de las diferentes imágenes consideradas. Además, para cada imagen (se
puede evitar modificando un archivo de configuración) es necesario in-
troducir:
- Tamaño de la ventana de búsqueda del corner: por defecto suele ser una
ventana de 11x11 píxeles alrededor de cada punto (propio píxel 1x1,y
ventana de 5 alrededor, implica que por cada componente: 5+1+5 = 11
píxeles).
Una vez que se han introducido los parámetros anteriores, se opta por
una localización automática de los puntos, pero previamente definiendo
las 4 esquinas del tablero. En este aspecto, es muy importante resaltar
que el orden en el que se seleccionen los 4 puntos afecta a la posterior
5.3. Proceso de calibración 84
Parámetro Valor
Distancia Focal [ 2043.22731 2044.63891 ] ± [ 2.60624 2.53574 ]
Punto Principal [ 354.84891 240.45905 ] ± [ 5.42588 3.96191 ]
γ alpha_c = [ 0.00000 ] ± [ 0.00000 ]
Distorsión [ -0.36695 0.93446 0.00009 -0.00052 0.00000 ] ±
(k1 , k2 , p1 , p2 , k3 ) [ 0.02283 0.91265 0.00038 0.00025 0.00000 ]
Píxel Error [ 0.09024 0.09061 ]
Paso 4 :
Tras la obtención de los resultados anteriores, a continuación es posible
calcular los parámetros extrínsecos respecto a las distintas imágenes de
entrada, y calcular la reproyección de los puntos (Figura 5.20) y el error
asociado.
Figura 5.20: Reproyección del conjunto de puntos sobre los puntos reales de
la imagen.
5.3. Proceso de calibración 87
Paso 5 :
Si se han realizado modificaciones en la posición inicial de puntos en
la imagen, sería necesario volver al paso 3 y recalcular de nuevo todos
los parámetros intrínsecos de la cámara. En el presente proceso de ca-
libración, para afinar al máximo la calidad de estos parámetros, dicho
proceso se tuvo que realizar varias veces.
Implementación de mecanismos
para la extracción de
información visual
91
6.1. Objeto de referencia tridimensional 92
El algoritmo básico que resume los pasos a seguir para lograr el objetivo es el
expuesto en Algoritmo 6.1.
6.1
Más adelante se presentan los problemas relativos a este modo de captura.
6.1. Objeto de referencia tridimensional 94
[Rotacion,traslacion]:=
CalculaCalibracionExterna(PuntosImagen,PuntosObjeto)
imagenColor :=
ProyectaPuntos(PuntosObjeto,
Rotacion,traslacion,
MatrizIntrinseca,ParametrosDistorsion,..)
fin mientras
LiberaRecursosMemoria(..)
LiberaCamara(camara)
Fin Algoritmo
int cvFindChessboardCorners(
const void* image,
CvSize pattern_size,
CvPoint2D32f* corners,
int* corner_count = NULL,
flags = CV_CALIB_CB_ADAPTIVE_THRESH );
image :
Imagen de entrada capturada por la cámara, donde se supone que está
presente el tablero. Es necesario que la imagen esté en formato de 8 bits
monocromo.
pattern_size :
Estructura para la definición de tamaño en OpenCV. Se indican el nú-
mero de filas y columnas, especificados por el número de corners internos
a lo ancho y número de corners internos a lo alto del tablero.
corners :
Estructura tipo array de OpenCV en la que se almacenan las coordena-
das (del plano de la imagen) correspondientes a los puntos extraídos del
tablero.
corner_count :
Puntero a entero, en el cual se indica el número de corners del tablero
encontrados.
Máscaras de comportamiento :
Una limitación que presenta esta función es que si el tablero completo no está
contenido dentro de la escena, y no se detecta, por ejemplo, una fila o colum-
na, no devuelve el conjunto de puntos de la parte del tablero visible, dado que
no cumple con los parámetros de entrada indicados.
Una vez que se han extraído de la imagen las coordenadas donde se supone
que están presentes los puntos característicos internos del tablero, el siguiente
paso es aplicar un proceso de refinamiento sobre el conjunto de coordenadas,
para precisar aún más la localización de los puntos característicos o corners
obtenidas en el primer paso.
void cvFindCornerSubPix(
const CvArr* image,
CvPoint2D32f* corners,
int count,
CvSize win,
CvSize zero_zone,
CvTermCriteria criteria );
image,corners y count :
Igual que en el caso anterior, salvo que se supone que en image están
presentes los corners pasados como argumento de entrada.
win :
Estructura en OpenCV para especificar el tamaño de la ventana de bús-
queda del punto característico, en píxeles. En el presente trabajo, se
considera una ventana de 5x5 de radio desde la posición del punto. Con
lo que sumando el tamaño del píxel en horizontal y vertical queda una
ventana de CvSize(11,11) (ventana de tamaño 11x11).
6.1. Objeto de referencia tridimensional 98
zero_zone :
Parámetro opcional de la función. Establecido al valor CvSize(-1,-1). No
relevante para el caso actual.
criteria :
Se establecen el número de iteraciones máximo en el proceso de búsque-
da. En nuestro caso:
cvT ermCriteria(CV _T ERM CRI_T P S | CV _T ERM CRIT _IER, 30, 0,1).
El algoritmo iterará un número máximo de iteraciones que se establece
en 30 ó cuando se haya alcanzado una precisión del 10 %.
Objeto.PuntosObjeto[numCorner, 0] = i*tamCuadradoMm;
Objeto.PuntosObjeto[numCorner, 1] = j*tamCuadradoMm;
Objeto.PuntosObjeto[numCorner, 2] = 0.0f;
}
}
Figura 6.5: Representación de los ejes del sistema de coordenadas del objeto.
6.1. Objeto de referencia tridimensional 100
En OpenCV existe una función que permite calcular los parámetros in-
trínsecos y extrínsecos al mismo tiempo: cvCalibrateCamera2(). Ésta fue la
primera opción que se propuso para el cálculo de la matriz de rotación y el
vector de traslación. Sin embargo, durante los experimentos se comprobó que
el tiempo consumido por esta función era excesivo, con lo que se propuso una
segunda alternativa, la cual dió resultados bastante buenos. Esta función es la
denominada cvFindExtrinsicCameraParam2(), la cual se detalla a continua-
ción:
void cvFindExtrinsicCameraParams2(
const CvMat* object_points,
const CvMat* image_points,
const CvMat* intrinsic_matrix,
const CvMat* distortion_coeffs,
CvMat* rotation_vector,
CvMat* translation_vector );
object_points :
Representación virtual de la geometría del objeto. Presentada en el Algo-
ritmo 6.2. Coordenadas tridimensionales respecto al sistema del objeto.
image_points :
Coordenadas bidimensionales respecto al plano de la imagen de los pun-
tos extraídos con la función cvFindChessboardCorners().
intrinsic_matrix :
Función de parámetros intrínsecos de la cámara K .
distortion_coeffs :
Vector de coeficientes de distorsión radial y tangencial. Expresado de
la forma: k1 , k2 , p1 , p2 y k3 (donde ki indican coeficientes de distorsión
radial y pi coeficientes de distorsión tangencial).
rotation_vector :
Vector de rotación, en el que se devuelve, por cada eje, el vector unitario
asociado y el ángulo de giro sobre el mismo. Para obtener la matriz
de orden 3 necesaria para la aplicación, se puede usar la función de
6.1. Objeto de referencia tridimensional 101
θ ← norm(r)
r ← r/θ
0 −rz ry
T
R = cosθI − (1 − cosθ)rr + sinθ rz
0 −rx
−ry rx 0
translation_vector :
Vector de traslación del sistema. Los valores devueltos están expresados
en mm.
Si alguna de las tres etapas anteriores se ha superado con algún tipo de error,
la reproyección de la estimación de los puntos del objeto no será adecuada, y
por lo tanto, la reconstrucción 3D del mismo contendrá errores. Esto es, dada
una localización en el espacio tridimensional respecto del sistema de coorde-
nadas de la cámara, es posible reconstruir de forma unívoca donde debería
aparecer en el plano de la imagen en coordenadas expresadas en píxeles, el
punto externo tridimensional.
void cvProjectPoints2(
const CvMat* object_points,
const CvMat* rotation_vector,
const CvMat* translation_vector,
const CvMat* intrinsic_matrix,
const CvMat* distortion_coeffs,
CvMat* image_points,
..);
object_points :
Representación virtual de la geometría del objeto. Presentada en el Algo-
ritmo 6.2. Coordenadas tridimensionales respecto al sistema del objeto.
rotation_vector :
Vector de rotación, representado como rotación respecto a cada eje.
translation_vector :
Vector de traslación del sistema. Los valores devueltos están expresados
en mm.
intrinsic_matrix :
Función de parámetros intrínsecos de la cámara, K. Junto con los coefi-
cientes de distorsión, es usada para corregir geométricamente la imagen.
distortion_coeffs :
Vector de coeficientes de distorsión. Expresado de la forma: k1 , k2 , p1 , p2
y k3 (donde ki indican coeficientes de distorsión radial y pi coeficientes de
distorsión tangencial).
image_points :
Parámetro de salida; contendrá las coordenadas tridimensionales de la
localización del objeto, respecto del sistema de coordenadas de la ima-
gen. Posteriormente será usado para dibujar los puntos reproyectados.
6.1.4.1. Experimentos
Cálculo de la profundidad :
En este experimento se establecía una posición fija para la cámara, y se
desplazaba el tablero o objeto de interés sobre la plantilla una distancia
determinada. Se realizaron varias combinaciones variando la profundi-
dad. Un ejemplo de las imágenes consideradas son las mostradas en la
Figura 6.10.
Debido a que la mayor parte del código relacionado con el sensor inercial
se estaba desarrollando con otra plataforma de desarrollo, Dev C++, se
optó por migrar todo el código hacia esta alternativa. Si la configuración
de OpenCV sobre Visual Studio fue relativamente sencilla, en esta pla-
taforma no lo fue tanto. En el Apéndice B se propone una configuración
para esta plataforma.
ReservaEstructurasMemoria(...)
InicializacionCamara(camara)
imagenReferencia := CapturaImagenInicial(tablero_ajedrez)
puntosObjetoReferencia := extraePuntosObjeto(imagenReferencia)
mientras (cierto):
// El objeto se mueve en la escena
imagenActual := CapturaImagen(camara)
// Se localizan los puntos del objeto en cada imagen
puntosObjetoActual := extraePuntosObjeto(imagenActual)
matrizHomografia :=
calculaHomografia(puntosObjetoReferencia,
puntosObjetoActual)
[Rotacion,traslacion]:=
DescomposicionHomografia(matrizHomografia)
// Cualquier operación con la matriz de homografia
TransformacionPerspectiva(imagenActual,matrizHomografia,...)
fin mientras
LiberaRecursosMemoria(..)
LiberaCamara(camara)
Fin Algoritmo
6.2. Objeto de referencia plano 116
6.2.1.1. Definición
P =C TC ∗ P ∗ = RP ∗ +t
Si llamamos d∗ a la distancia entre el plano de la cámara y el plano de
la imagen en la imagen de referencia, puede verificarse que : nT P ∗ = d∗ . Es
T ∗
decir, n d∗P = 1. Se tiene pues la siguiente relación:
nT P ∗ nT ∗
P = RP ∗ + t = (R + t )P
d∗ d∗
Se verifica que:
nT
mZ = (R + t )m∗ Z ∗
d∗
nT Z
αH m = (R + t )m∗ , siendo αH = ∗
d∗ Z
αH m = Hm∗
αG p = Gp∗
Esta matriz G es la que se puede estimar a partir de la correspondencia
entre un conjunto de puntos para una secuencia de imágenes. Una vez ob-
tenida, la matriz H puede ser deducida teniendo en cuenta que p = Km y
p∗ = Km∗ , siendo K la matriz de parámetros intrínsecos de la cámara, de
forma que:
H = K−1 GK
6.2. Objeto de referencia plano 118
H = U Λ VT
se obtienen las matrices ortogonales U y V y la matriz diagonal Λ, la
cual contiene los valores singulares de la matriz H. Se puede considerar esta
matriz diagonal como una matriz de homografía tal cual, y aplicar la relación
siguiente:
Λ = RΛ + tΛ nΛT
El cálculo anterior es simple cuando la matriz a ser descompuesta es diago-
nal. Realizando cálculos sobre la anterior ecuación y planteando un sistema de
ecuaciones lineal (8 grados de libertad), se pueden obtener hasta 8 soluciones
diferentes para la tripleta {RΛ , tΛ , nΛ }.
R = URΛ VT
t = U tΛ
n = V nΛ
Restricciones
1 + nT R T t > 0
mT (R n) > 0
Donde m son las coordenadas de los puntos de referencia. Tras esta segunda
restricción, se consigue reducir el número de soluciones posibles a dos.
6.2. Objeto de referencia plano 121
s22 s23
Ms11 = − | |= s223 − s22 s33 ≥ 0
s23 s33
En general, existen tres alternativas diferentes para obtener las expresiones
de los vectores normales ne (y a partir de éste te y Re ) a partir de la des-
composición de la matriz de homografía de los componentes de S. Así pues,
se escribirá como:
ne0 (sii )
ne (sii ) = ; e = {a, b}, i = {1, 2, 3}
k ne0 (sii ) k
Donde ne (sii ) significa ne desarrollado usando sii . Así, los tres casos posi-
bles son los siguientes:
s√
11 s√
11
0 0
na (s11 ) = s12 + √
Ms33
; nb (s11 ) = s12 + √
Ms33
; (6.1)
s13 + 23 Ms22 s13 + 23 Ms22
√ √
s12 + Ms33 s12 − Ms33
na0 (s22 ) = s22√ ; nb0 (s22 ) = s22√ (6.2)
s23 − 13 Ms11 s23 + 13 Ms11
√ √
s13 + 12
√ Ms22 s13 − 12
√ Ms22
na0 (s33 ) = s23 + Ms11 ; nb0 (s33 ) = s23 − Ms11 (6.3)
s33 s33
6.2. Objeto de referencia plano 123
Cabe destacar que las cuatro soluciones obtenidas con estas fórmulas son
todas las mismas (esto es, {na , −na , nb , −nb }), pero no siempre son devueltas
en el mismo orden; esto significa que, por ejemplo, na (s11 ) se pudiera co-
rresponder con cualquiera de las 4 soluciones anteriores, incluso en lugar de
corresponderse con na (s11 ).
s√ s√
k ne0 (s11 ) k 11
k t e k2 11
t∗e (s11 ) = s12 ∓ √ −
Ms33 s ± Ms33
12 √
2s11 2 k ne0 (s11 ) k
s13 ∓ 23 Ms22 s13 ± 23 Ms22
√ √
s12 ∓ Ms33 s12 ± Ms33
k ne0 (s22 ) k k te k 2
t∗e (s22 ) = s22√ − s22√
2s22 0
2 k ne (s22 ) k
s23 ∓ 13 Ms11 s23 ± 13 Ms11
√ √
s13 ∓ 12 Ms s ± Ms
k ne0 (s33 ) k √ 22
k te k 2 13 12
√ 22
t∗e (s33 ) = s23 ∓ Ms11 − s23 ± Ms11
2s33 0
2 k ne (s33 ) k
s33 s33
Para e = a el mayor operador en los simbolos ±, es decir, ∓, debe ser
elegido, y para e = b, seleccionar el operador menor. EL vector t∗e puede
también en una forma más compacta de na y nb :
6.2. Objeto de referencia plano 124
k te k
t∗a (sii ) = [sii ρnb (sii )− k te k na (sii )] (6.4)
2
k te k
t∗b (sii ) = [sii ρna (sii )− k te k nb (sii )] (6.5)
2
siendo:
sii = sign(sii )
ρ2 = 2 + trace(S) + ν
k te k2 = 2 + trace(S) − ν
q q
ν= 2[(1 + trace(S))2 + 1 − trace(S2 )] = 2 1 + trace(S) − Ms11 − Ms22 − Ms33
te = Re t∗e
void cvFindHomography(
const CvMat* srcPoints,
const CvMat* dstPoints,
CvMat* H,
int method=0,
double ransacReprojThreshold=0,
CvMat* status=NULL)
srcPoints,dstPoints :
Son, respectivamente, el conjunto de puntos del objeto de la imagen
inicial y el conjunto de puntos del objeto de la imagen actual. Cabe
resaltar que en los experimentos se demostró que los puntos deben estar
en orden; es decir, que la posición i-ésima del array srcPoints contenga
al punto i-ésimo, siendo el mismo encontrado en la posición i-ésima del
array dstPoints.
H:
Matriz de homografía de orden 3 devuelta por el método.
method :
ransacReprojThreshold :
Solo válido si el método usado es RANSAC. Indica el máximo error de
reproyección permitido para considerar a un punto como válido.
status :
No usado en esta implementación.
Método RANSAC :
Método LMedS :
ri2 ≤ (2 · σ̂ 2 )
Una vez localizados al menos 4 puntos del mismo objeto entre dos imáge-
nes (el original, o de referencia, y el actual), se procede a calcular la matriz de
homografía entre ambos conjuntos de puntos; si los puntos “casan”, la matriz
de homografía tendrá sentido. Si de lo contrario, los 4 puntos no albergan
ningún tipo de relación geométrica, la matriz resultante calculada no tendrá
sentido. En este aspecto, se han realizado varias pruebas en el laboratorio.
imagenReferencia := CapturaImagenInicial(tablero_ajedrez)
puntosObjetoReferencia :=
extraePuntosObjeto(imagenReferencia)
ReservaEstructurasMemoria(puntosObjetoReferencia,..)
bucle:
si no esPrimeraIteracion:
imagenActual := CapturaImagen(camara)
[puntosObjetoActual,puntosPosicionEstimada] :=
SeguimientoFlujoOpticoPiramidal(imagenPrevia,
imagenActual,..)
matrizHomografia :=
calculaHomografia(puntosObjetoReferencia,
puntosObjetoActual)
[Rotacion,traslacion]:=
DescomposicionHomografia(matrizHomografia)
// Cualquier operación con la matriz de homografia
TransformacionPerspectiva(imagenActual,
matrizHomografia,...)
fin si
Intercambia(puntosObjetoActual,
puntosPosicionEstimada)
Intercambia(imagenActual,
imagenPrevia)
fin bucle
LiberaRecursosMemoria(..)
LiberaCamara(camara)
Fin Algoritmo
6.2. Objeto de referencia plano 130
dicho método.
Consultando [120] y [111], una de las alternativas con más éxito consiste
en utilizar la función de OpenCV denominada cvGoodFeaturesToTrack(), la
cual devuelve un conjunto de características de una escena, que son buenas
candidatas para el seguimiento en una secuencia de imágenes.
void cvGoodFeaturesToTrack(
const CvArr* image,
CvArr* eigImage,
CvArr* tempImage,
CvPoint2D32f* corners,
int* corner_count,
double quality_level,
double min_distance,
const CvArr* mask = NULL,
int block_size = 3,
int use_harris = 0,
double k = 0.4 );
image :
Imagen de entrada de la cual se extraen los puntos característicos, o
corners.
eigImage,tempImage :
Son variables necesarias para los cálculos de la propia función. En un
principio, se pensó que los puntos devueltos por esta función venían
indexados en función de su correspondiente autovalor, devuelto en eigI-
mage. Pero se corroboró que al finalizar la función la variable eigImage
no contenía ningún tipo de información, puesto que al salir de la función
la memoria reservada para esta variable es liberada.
corners :
Estructura de tipo array en OpenCV, la cual contiene las coordenadas
de los puntos característicos obtenidos en la imagen. Estas coordenadas
son respecto al plano de la imagen.
6.2. Objeto de referencia plano 131
corner count :
Puntero a entero que indica el número de corners encontrados en la
imagen. Este parámetro puede ser tanto de entrada como de salida, en
el sentido de que si se inicializa a algún valor, la función devolverá tan
solo los n mejores corners , donde n es el valor de inicialización de dicha
varaible. En caso contrario, busca tantos corners como posiciones tenga
el array corners de entrada.
quality_level :
Indica el valor mínimo aceptable para un autovalor para que un de-
terminado punto sea aceptado como corner. El valor actual para este
parámetro es el producto entre quality_level y el menor de los mayores
autovalores encontrados en la imagen. Así, este valor no debe exceder
de 1. Un valor típico suele estar comprendido entre 0.10 y 0.01.
min_distance :
Se indica la distancia mínima entre dos puntos. Expresada en píxeles.
Dependería pues de cada tipo de objeto.
mask :
Se pueden buscar los puntos característicos en toda la región de la ima-
gen, o bien en un área determinada. En esta propuesta se ha diseñado
una función para la selección manual del objeto (Figura 6.20 y Figura
6.21); mediante 4 puntos, se selecciona la región de la imagen donde está
el objeto, y donde se desea buscar las características que describen al
mismo. Ésta función se encuentra definida en el conjunto de clases imple-
mentadas, más concretamente en el fichero seleccion.hpp. Una máscara
no es más que una región lógica del espacio; aquellos puntos o coorde-
nadas que estén a un valor positivo serán considerados, mientras que las
que tengan un valor nulo, no lo serán.
block_size :
Región del espacio alrededor de cada píxel que es considerada para el
cálculo de las derivadas de segundo orden. Normalmente suele tener un
valor comprendido entre 3 y 5 píxeles alrededor del punto.
use_harris,k :
Si use_harris es distinto de cero, entonces para la detección de los puntos
se usa la técnica de Harris, en lugar de la de Shi y Tomasi. El valor k
es el coeficiente de Harris (ver Sección 4.4.1), cuyo valor por defecto en
este caso suele ser de 0.4.
6.2. Objeto de referencia plano 132
Donde los cambios sean más bruscos, será una buena zona en la que situar
un punto característico. En contraposición con el criterio de Harris (Sección
6.2. Objeto de referencia plano 133
4.4.1), Shi y Tomasi propusieron que era mejor obtener el menor de los autova-
lores que aplicar un cierto umbral. En general, se obtienen mejores resultados
con la propuesta de Shi y Tomasi que con el método de Harris (por las consi-
deraciones expuestas en [120]).
Tras varias pruebas iniciales se comprobó que si era necesario una correc-
ción geométrica de la imagen se perdían de media unos 3 fps; por lo que en la
implementación ésta opción se ha definido de forma opcional, si fuera necesa-
ria.
6.2. Objeto de referencia plano 134
Constancia del brillo: Se asume que el brillo de un píxel entre una imagen
y la siguiente no cambia bruscamente (se considera constante) .
void cvCalcOpticalFlowPyrLK(
const CvArr* imgA,
const CvArr* imgB,
CvArr* pyrA,
CvArr* pyrB,
CvPoint2D32f* featuresA,
CvPoint2D32f* featuresB,
int count,
CvSize winSize,
int level,
char* status,
float* track_error,
CvTermCriteria criteria,
int flags );
imgA,imgB :
imgA se corresponde con la imagen previa del objeto, e imgB se corres-
ponde con la actual. Se trata de indicar las dos imágenes en las que se
desean buscar los puntos característicos.
6.2. Objeto de referencia plano 137
pyrA,pyrB :
Estructuras de memoria para contener las distintas capas de búsqueda
de la pirámide de búsqueda.
featuresA,featuresB :
El primer array contiene los puntos que se desean seguir, los cuales
son analizados para extraer la característica de su movimiento. El array
featuresB contendrá la localización estimada de los puntos calculados a
partir del movimiento de los puntos originales.
count :
Número de puntos en el array featuresA.
winSize :
Estructura para indicar el tamaño en OpenCV de la ventana de bús-
queda alrededor del píxel que contiene la característica. En el presente
trabajo se ha propuesto una ventana de tamaño 5 píxeles.
level :
Entero para indicar la profundidad de la búsqueda piramidal. Si se esta-
blece a 0, se realiza el proceso de búsqueda en un solo nivel (no habría
búsqueda piramidal). En nuestro caso, se establece a un valor de 3, por-
que es el que mejores resultados ha dado hasta el momento.
status :
De longitud count; una vez terminada la función, si la posición i-ésima
contiene un 1, significa que el punto i-ésimo del array featuresA ha sido
localizado. En caso contrario, el valor en esta posición será de 0.
track_error :
Si está activo, es un array de números en formato real, que indica la
diferencia entre la localización del punto en la primera toma y la loca-
lización estimada del punto en la imagen actual. Es utilizado en una
técnica de optimización propuesta en el siguiente apartado.
criteria :
Se establecen las condiciones de parada del algoritmo. En este caso, hasta
un máximo de 10 iteraciones o una precisión inferior al 10 %. Aunque aún
es necesario la realización de varias pruebas para determinar su posible
valor definitivo.
6.2. Objeto de referencia plano 138
flags : Las usadas en esta implementación son (en conjunción con el operador
booleano &):
Esto conlleva a deshechar todos los puntos que no se quedan sobre el ob-
jeto, con lo que es posible que a medida que vayan avanzando la secuencia de
imágenes se vayan descartando puntos hasta sobrepasar el mínimo necesario
para calcular la matriz de homografía (4 puntos).
Paso 1 :
Para la localización inicial del objeto se utiliza la función cvGoodFeatu-
resToTrack(), con selección manual para la máscara.
Paso 2 :
Para el seguimiento se hace uso de la función cvCalcOpticalFlowPyrLK(),
calculando en cada iteración la media del desplazamiento de los píxeles,
obtenido a partir de track_error. Se calcula el mínimo y máximo valor
en las coordenadas tanto del eje X como del eje Y. Éstas cuatro coorde-
nadas determinarán una región del espacio en la que se está desplazando
el objeto.
Paso 3 :
Si en algún momento los puntos estimados no verifican que se desplazan
en media igual que el conjunto (en principio el objeto no se deforma geo-
métricamente), estos son eliminados, para garantizar que no pertenecen
al objeto. Este paso es aún matizable, en el sentido de que otra restric-
ción para usar la media del conjunto es que no haya alguna deformación
por efecto de la perspectiva.
Paso 4 :
Si se alcanza el mínimo de puntos necesarios para calcular de forma ópti-
ma la matriz de homografía (según lo indicado anteriormente, al menos
4), se busca de nuevo al objeto en la región delimitada por los puntos del
paso 2. La forma de búsqueda en este caso es por fuerza bruta siguiendo
la técnica de template matching definida en 4.5.2. En este caso, el patrón
a buscar se corresponde con la sección de la imagen delimitada por los
puntos del paso 2, y la imagen donde buscar al objeto es la imagen actual.
αh m = H m∗
donde H estará relacionada con rotación y traslación de forma que:
t T
H = γ(R + n ) (6.6)
d∗
nT tnT
det(H) = det(R + t ) = (1 + )
d∗ d∗
svd(H) = {σ1 , σ2 , σ3 }, σ1 ≤ σ2 ≤ σ3
nT
H = (R + t )
d∗
ktk
≡ σ1 + σ3
d∗
ktk σ1 + σ3
≡
d∗ σ2
G(x, y, σ) = e 2σ 2
2πσ 2
Posteriormente se calculan las diferencias D entre las distintas imágenes sua-
vizadas, donde ∗ es la operación de convolución en x e y:
Figura 6.30: Píxeles con los que se realiza la comparación del valor de D para
encontrar máximos locales en SIFT.
6.2. Objeto de referencia plano 146
Las primeras pruebas experimentales con este método resultan no ser tan
buenas en cuanto a coste computacional. Aunque sea un buen método para la
extracción robusta de características, no es válido para aplicaciones en tiempo
real, y para una imagen media de 752x480, como es nuestro caso, el tiempo
de extracción de características es del orden de segundos para cada imagen.
6.2. Objeto de referencia plano 147
Propuesta recientemente por Herbert Bay [111], SURF es una técnica para
la extracción de puntos en una imagen, cuya principal ventaja es su robustez
ante cambios en la rotación o de escala. Esto hace que el posterior empare-
jamiento de características entre imágenes sea muy robusto. Además lo hace
con un coste computacional inferior al de otros extractores de calidad simi-
lares como SIFT [115]. A continuación se presenta una breve descripción del
funcionamiento de este método.
∂ 2 G(p, σ)
Lxy =
∂x∂y
2
∂ G(p, σ)
Lxx =
∂x2
∂ 2 G(p, σ)
Lyy =
∂y 2
Para que el algoritmo sea más eficiente, en lugar de calcular las segun-
das derivadas, se hace una aproximación mediante filtros en forma de caja,
6.2. Objeto de referencia plano 148
Las tres características que definen a cada punto son las siguientes:
Ésta técnica está aún bajo desarrollo en la fecha de entrega del proyecto. Las
primeras pruebas experimentales con códigos de prueba han dado resultados
relativamente pobres en lo que a velocidad se refiere, aunque la eficacia en la
detección y seguimiento6.4 de los puntos es bastante buena.
6.4
No se realiza ninguna tarea de seguimiento; los puntos son recalculados en cada imagen
de la secuencia.
6.3. Otras alternativas para la realimentación visual 150
Fusión sensorial
Es por ello que se requiere de una fusión sensorial completa, de manera que
cuando un sensor no aporte toda la información necesaria para el control y
estabilización del quadrotor, se pueda complementar con alguna otra medida
proveniente de otras fuentes.
151
7.1. Descripción del sensor inercial 152
características:
struct CmtEuler {
CmtEuler eulerData;
struct CmtMatrix {
double m data[3][3];
};
CmtMatrix matrixData;
matrixData = packet->getOriMatrix(0);
7.2. Funciones de interfaz con la IMU 155
Acelerómetro :
Ofrece una medida de la aceleración lineal (en m/s2 ) de la IMU respecto
al sistema inercial, pero expresado respecto al propio sistema de la IMU.
Un inconveniente de esta medida es que lleva incorporado el efecto de la
aceleración de la gravedad. Es como si, en situación de reposo, la IMU se
estuviera moviendo en dirección vertical hacia arriba con una aceleración
igual a la de la gravedad, aproximadamente: [0, 0, 9,713923]T .
Giróscopo (”gyro”) :
Proporciona un vector velocidad angular (en rad/s) de la IMU respecto
al sistema inercial, pero expresado respecto al propio sistema de la IMU.
Brújula (”compass”) :
Aporta la dirección del vector norte magnético respecto al sistema de
coordenadas local de la IMU. Las unidades son en a.u. (”arbitrary units”,
unidades normalizadas con la fuerza del campo magnético de la Tierra).
Dadas las unidades, de esta medida probablemente sólo tenga sentido
usar la dirección.
struct CmtCalData {
CmtVector m acc, m gyr, m mag;
};
struct CmtVector {
double m data[3];
};
CmtCalData calData;
7.2. Funciones de interfaz con la IMU 156
calData = packet->getCalData(0);
...= packet->getCalAcc(0);
...= packet->getCalGyr(0);
...= packet->getCalMag(0);
Hay otra opción para obtener los ”calibrated data”, se trata del formato ”raw
data”, en formato entero, sin convertir, y donde va la temperatura ya integra-
da. En este caso, la estructura es la siguiente:
struct CmtRawData {
CmtShortVector m_acc, m_gyr, m_mag;
uint16_t m_temp
};
CmtRawData rawData;
rawData = packet->getRawData(0);
a ← getCalAcc(0)
ω ← getCalGyr(0)
θ ← getOriEuler(0) o alternativamente: getOriQuat(0), getOriMatrix(0).
ω (g)
ag ← getCalAcc(0)
ω (g)
ω g ← getCalGyr(0)
ω (g)
θ g ≡ ω θ (w)
g ←getOriEuler(0)
Sin embargo, nos interesan todas las medidas respecto al sistema de referencia
inercial:
ω
ω
Rg · ag(g)
ag
ω ω
ω g = Rg · ω (g)
g
ω ω
θg θg
ω
ẗg = ω ag −ω g, siendo g ω ≈ [0, 0, 9,713923]T
7.3. Medidas incompletas de la IMU 158
ω
ẗg
xraw = ω θg
ω
θ̇ g
ω
ṫg (k) ≈ ω ṫg (k − 1) + Tm ω ẗg (k)
ω Tm ω
ṫg (k) ≈ ω ṫg (k − 1) + ( ẗg (k) + ω ẗg (k − 1))
2
7.3. Medidas incompletas de la IMU 159
ω 1
ṫg (k) ≈ ω ṫg (k − 1) + (T (k) ω ẗg (k) + T (k − 1) ω ẗg (k − 1))
2
Donde se tiene que T (k) se define como el tiempo transcurrido desde que
se tomó la medida (k − 1) hasta que se tomó la medida k .
ω
ṫg
ω
ẗg
ximu =
ω
θg
ω ˙
θg
Sin embargo, lo que interesa como vector para la realimentación del control
es:
ω
tg
ω
ṫg
x= (7.1)
ω
θg
ω ˙
θg
o (w)
tg =w R0 ·o tg
o (w)
ṫg =w R0 ·o ṫg
Resulta, por tanto, necesario disponer de la matriz w R0 . Esta matriz puede
obtenerse en cada momento de la siguiente forma:
w
R0 =w Rg ·g Rc ·o Rc(−1)
Con todo esto, se puede ofrecer el vector de medida definitivo:
o (w)
tg
w (w)
ṫg
w
xg = w
θg
w
θ̇ g
Desde el punto de vista del control, la única diferencia apreciable respec-
to al uso del vector de medida mostrado en 7.1 es que, aún manteniendo la
referencia constante, si se mueve el objeto, se moverá el quadrotor (si bien
sin cambiar su orientación), para reubicarse en la misma posición relativa al
objeto, que es quien fija la referencia.
7.5. Calibración IMU-Cámara 161
manipulador al que está rígidamente acoplada aquélla. Para realizar esta cali-
bración es necesario recurrir de nuevo a un objeto de geometría conocida, del
tipo tablero de ajedrez, por ejemplo.
Dada esta importante limitación, una opción era hacer las diversas tomas
intentando que el origen del sistema de coordenadas de la IMU no se despla-
7.5. Calibración IMU-Cámara 163
Lo que se intentó en los experimentos era forzar a que ese punto fuera el
que permaneciera inmóvil. De esta forma, el origen de la IMU sí se habría
desplazado, pero este desplazamiento es fácilmente calculable.
c1
Tc2 =c1 Toc2 T−1
o
min(kc1 tc2 k)
7.5. Calibración IMU-Cámara 166
g
tc = [−28,51, −53 − 2, −21]T (mm)
En una segunda estimación (Figura 7.8), esta medida se corrigió, obtenién-
dose finalmente:
g
tc = [−28,51, −53 − 2, −37]T (mm)
g
θc = [0, π, 0]T
−1 0 0 −28,51
0 1 0 −53,2
g
Tc =
(10−3 m)
0 0 −1 −37
0 0 0 1
7.6. Otras alternativas de realimentación sensorial 168
Con ésta técnica, es posible realizar maniobras a gran velocidad, como por
ejemplo pasar a través de un pequeño hueco en una pared a una velocidad de
varios m/s (Figura 7.9) o esquivar obstáculos en tiempo real. A diferencia del
control visual planteado en el presente proyecto, la cámara en estos casos no
va a bordo del quadrotor.
7.6. Otras alternativas de realimentación sensorial 169
Todo lo relacionado con el modelado lineal del sistema del quadrotor y las
propuestas de estructuras de control para el seguimiento de trayectorias se
ha extraído del documento [52], trabajo fin de Máster de Guilherme Vianna,
integrante del grupo de investigación.
171
8.1. Descripción del modelo del quadrotor 172
Término Correspondencia
C Términos constantes
Ω Velocidad angular del rotor
JR Momento de inercia rotacional
l Distancia del centro de masa a los rotores
J Momento de inercia del cuerpo rígido
φ, θ, ψ Ángulos de Tait-Bryan
8.1. Descripción del modelo del quadrotor 174
1 0 −sinθ φ̇
ω = 0 cosφ sinφ cosθ θ̇
los ejes {−
x→ −
→ → −
L , yL , zL } respectivamente.
ξ˙ = v
˙ I FB
mv 0 = R
donde ξ˙ = v 0 = RW V y S(ω) = RW
T
R˙W
ṘW = RW S(ω)
Jω̇ = −ω × Jω + τb
donde:
ψ
8.1. Descripción del modelo del quadrotor 178
W
pB
W
W
ṗB
xB = W
ϕB
W
ϕ̇B
Figura 8.6: Detalle de integración de los sensores inercial y óptico a bordo del
quadrotor.
Capítulo 9
184
9.1. Ampliaciones y otras alternativas para el control 185
Sería interesante poder desarrollar algún código con esta librería, pero debido
a falta de tiempo se deja como una posible alternativa para el desarrollo futuro
de aplicaciones para el control visual.
Sería muy interesante poder desarrollar esta idea, porque a partir de vehícu-
los aéreos realmente autónomos, es posible generar una comunicación entre
ellos con un formato determinado, y poder realizar tareas complejas. A conti-
nuación se detalla brevemente esta propuesta.
or
...
}
}
El otro lenguaje del cual también se han extraído varias ideas es el presentado
en [127]. En este documento se propone un lenguaje para la comunicación entre
un vehículo aéreo no tripulado (UAV) y una torre de control. Lo singular que
presenta esta propuesta es que la comunicación se basa en el lenguaje natural,
con lo que aparentemente es relativamente sencillo de entender e implementar.
Un ejemplo del mismo se muestra a continuación:
HORIZON: Inbound.
CONTROLLER: Horizon. Clear to land runway 29.
HORIZON: Roger. Preparing to land on runway 29.
Así pues, queda mostrar un ejemplo del lenguaje propuesto. Cabe destacar que
no es más que una primera propuesta, con bastantes elementos mejorables:
CONTROL_MODULE task1
OPEN
>STATE_DEFINITION OPEN:
<GROUP : identificadorGrupo1>
UAV_SET
UAV_DEF
UAV_ID := UAV2
UAV_POSITION
GPS_COORDENATE := (11p3822)
GPS_ALTITUDE := (23)
END UAV_POSITION
END UAV_DEF
...
END UAV_SET <GROUP;>
>STATE_DEFINITION CLOSE;
>CONTROL_ROUTINE OPEN:
...
<PROCS;>
<MAIN>
9.1. Ampliaciones y otras alternativas para el control 187
loop until
(identificadorGrupo1.uav1.GPS_COORDENATE != coorden)
identificadorGrupo1.uav1.go_to_coorden();
end loop
<MAIN;>
>CONTROL_ROUTINE CLOSE;
>COMMUNICATION_PROTOCOL OPEN:
FORBIDDEN,ON_DEMAND in identificadorGrupo1
>COMMUNICATION_PROTOCOL CLOSE;
CONTROL_MODULE CLOSE
Por ejemplo, dado que la cámara del sistema es monocroma, todos los
algoritmos para la localización y el seguimiento del objeto están basados en
este tipo de imágenes. Sin embargo, existen gran cantidad de métodos para la
localización y seguimiento de objetos que son muy robustos ante cambios en
la escala y rotaciones, basados en el color o en otras propiedades; información
visual que no es posible capturar con este tipo de sensor óptico.
9.1
Intel Threading Building Blocks (Intel TBB) es una biblioteca basada en plantillas
para C++ desarrollada por Intel para facilitar la escritura de programas que exploten las
capacidades de paralelismo de los procesadores con arquitectura multinúcleo.
9.1. Ampliaciones y otras alternativas para el control 188
Con esta idea, en [130] se presenta una propuesta que consiste en la aplica-
ción de los algoritmos genéticos para la obtención de los parámetros necesarios
de un controlador PID robusto ante posibles perturbaciones (tales como rá-
fagas de viento) para controlar el vuelo de un mini-helicóptero. Se parte de
una población inicial, y mediante un proceso de aprendizaje y evolución de la
población aplicando operadores de mutación y cruce, tras varias generaciones
(unas 27, y 6 horas después) consiguen obtener los parámetros para un con-
trolador que, como se puede ver en [130], hace que el vuelo del helicóptero
sea relativamente estable. En la Figura 9.1 se puede observa un detalle de los
experimentos presentados en esta propuesta.
¿Sería posible generar una red de UAV’s (Figura 9.2), gobernados por
agentes inteligentes, interconectados entre sí [60] y hablando el mismo len-
guaje, entrenados para evitar cierto tipo de obstáculos, basando sus leyes de
navegación en esquemas de control visual para realizar una tarea específica?
9.1. Ampliaciones y otras alternativas para el control 190
9.2. Conclusión
Código desarrollado
194
APÉNDICE A. CÓDIGO DESARROLLADO 195
Apéndice B
OpenCV
Conseguir empezar a trabajar con esta librería fue toda una hazaña. El
conseguirlo para una distribución de Linux, mucho menos. A continuación se
exponen de forma detallada los pasos a seguir para la instalación y puesta
en marcha de la libreria OpenCV, en su versión 2.0, en la distribución de
Linux Ubuntu 9.10. También se ha conseguido instalar de forma satisfactoria
196
B.2. Configuración de OpenCV 197
B.2.1.1. Paso 0
En primer lugar, es imprescindible asegurarnos que las versiones de los
paquetes que se van a descargar estén actualizadas, y sean estables. Para ello,
en el menú de usuario de Ubuntu, accedemos a :
En esta ventana deben estar marcados, al menos, las que se indican a conti-
nuación para el propósito de esta guía:
B.2.1.2. Paso 1
Obtenemos todos los prerequisitos necesarios para el correcto funciona-
miento de la libreria OpenCV:
Estas son las librerias que dan soporte para video en OpenCV:
B.2.1.3. Paso 2
Obtenemos la versión 2.0 de la libreria de Intel, en su versión para sistemas
tipo UNIX, y la desempaquetamos por ejemplo en nuestra carpeta personal
’home’:
Fuente de la descarga:
http://sourceforge.net/projects/opencvlibrary/files/
opencv-unix/2.0/
B.2.1.4. Paso 3
A continuación se van a generar los enlaces simbólicos para las librerias de
video. En este punto es necesario loguearse en el sistema como super-usuario
(sudo -s) y realizar las siguientes operaciones:
B.2. Configuración de OpenCV 199
B.2.1.5. Paso 4
Volvemos a la carpeta donde se haya descomprimido los fuentes de la
libreria OpenCV, y procedemos a realizar las operaciones de configuración e
instalación:
Nota 2: En el caso de que tras este punto se haya producido algún error,
es necesario volver al paso 2. Esto es debido a que cuando lanzamos
el comando ./configure se modifica el make generado, por lo que si se
han creado enlaces simbólicos con alguna de las librerias anteriores, es
necesario partir de una copia limpia del conjunto de fuentes de OpenCV.
B.2.1.6. Paso 5
Una vez que hemos creado todos los enlaces, descomprimido la libreria e
instalado todas las librerias auxiliares, se procede a compilar la libreria para
nuestro sistema. Es posible que para realizar la siguiente operación tengamos
que loguearnos como super-usuario. Los pasos a seguir son los siguientes:
1. En el directorio donde se ha descomprimido la libreria, procedemos a
compilar los fuentes haciendo uso del comando make:
B.2. Configuración de OpenCV 200
> make
B.2.1.7. Paso 6
Configuramos nuestro sistema para localizar y enlazar las librerias de
OpenCV:
> echo /usr/local/opencv/lib >
/etc/ld.so.conf.d/opencv.conf
Actualizamos las librerias para asegurarnos que todo está correcto:
> ldconfig -v | grep opencv
Es posible que se muestren algunos mensajes de error de rutas a librerias.
No hay problema, salvo probablemente la última línea, que es la que vamos
buscando. Si aparece ena la consola “/usr/local/opencv/lib”, todo ha ido co-
rrectamente.
B.2.1.8. Paso 7
Configuramos el pkg-config y las variables de entorno, escribiendo los si-
guientes comandos en el terminal:
> echo ’export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:
/usr/local/opencv/lib/pkgconfig’ >> /etc/bash.bashrc
> echo ’export PYTHONPATH=
/usr/local/opencv/lib/python2.6/
site-packages/opencv’ >> /etc/bash.bashrc
La segunda línea es necesaria si se tiene pensado programar con Python. Si
no es el caso, se puede omitir dicha exportación. A continuación reiniciamos
el terminal para que todos los pasos de configuración sean actualizados.
B.2. Configuración de OpenCV 201
B.2.1.9. Paso 8
En principio, si se ha llegado a este punto sin ningún error en el terminal, es
porque se ha instalado correctamente la libreria de OpenCV en el sistema. Para
verificarlo, accedemos al directorio donde hemos descomprimido la libreria
de OpenCV, y accedemos al subdirectorio samples/c, y autentificándonos de
nuevo como super-usuario, procedemos a ejecutar el siguiente comando en el
terminal:
> . build_all.sh
Si todo ha ido bien, la mayoria de los ejemplos se compilarán para obtener los
ejecutables en la carpeta OpenCV2.0.X/bin.
B.2.1.10. Paso 9
Este paso no es necesario para la instalación de la libreria en el sistema,
pero sí para la correcta compilación de cualquier ejemplo que se implemente
usando definiciones de la libreria OpenCV. Si optamos por compilar nuestros
fuentes haciendo uso de la herramienta make, para poder enlazar correcta-
mente las librerias de OpenCV será necesario establecer el formato de enlace
simbólico con las mismas en un archivo Makefile.
CC=g++
CFLAGS=-I. -Wall
LFLAGS=-lrt -lueye_api
DEPS = general.hpp Matrix.hpp CSensorCamara.hpp
main: main.cpp
B.2.2.1. Paso 0
Para instalar la librería de OpenCV es necesario acudir a la página donde
se encuentra en versión ejecutable el instalable de la versión 2.0:
https://sourceforge.net/projects/opencvlibrary/files/opencv-win/
2.0/
Una vez seguidos los pasos de instalación, se da por finalizado este paso
inicial.
B.2.2.2. Paso 1
Se inicia el compilador Dev C++, en cualquiera de sus versiones actuales.
Si no dispone del programa, se puede descargar del siguiente enlace web:
http://sourceforge.net/projects/dev-cpp/
Una vez finalizado este paso, se supone que el lector dispone del programa
Dev C++ correctamente instalado en su máquina y ejecutándose.
B.2.2.3. Paso 2
Se crea un nuevo proyecto, en el cual se pueden generar tantos archivos
fuente como sea necesario. Por ejemplo, se puede crear un archivo fuente
denominado main.cpp, cuyo código sea de prueba, como el mostrado a conti-
nuación:
#include ‘‘highgui.h”
#include ‘‘cv.h’’
int main( int argc, char** argv ) {
IplImage* img = cvLoadImage( argv[1] );
cvNamedWindow( ‘‘Example1”, CV_WINDOW_AUTOSIZE );
cvShowImage( “Example1”, img );
cvWaitKey(0);
cvReleaseImage( &img );
cvDestroyWindow( “Example1” );
}
B.2. Configuración de OpenCV 203
El código anterior carga una imagen a partir de la ruta pasada como argumento
de llamada y la muestra en una ventana gráfica.
B.2.2.4. Paso 3
En este paso, se procede a la definición de un nuevo tipo de compilador en
Dev C++. En primer lugar:
> C:\OpenCV2.0\bin
> C:\Dev-Cpp\Bin
> C:\Dev-Cpp\libexec\gcc\mingw32\3.4.2
> C:\OpenCV2.0\lib
> C:\Dev-Cpp\lib
> C:\OpenCV2.0\include\opencv
> C:\Dev-Cpp\include
> C:\OpenCV2.0\include\opencv
> C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include
> C:\Dev-Cpp\include\c++\3.4.2\backward
> C:\Dev-Cpp\include\c++\3.4.2\mingw32
> C:\Dev-Cpp\include\c++\3.4.2
> C:\Dev-Cpp\include
B.2.2.5. Paso 4
Todo lo necesario para poder compilar el proyecto ya está configurado.
Tan solo hace falta decirle al Dev C++ qué compilador queremos usar. Así,
cuando se vaya a compilar el proyecto, es necesario:
Una última opción, no necesaria pero sí adecuada, es decirle a Dev C++ que
queremos que genere código optimizado. Para ello, en la misma ruta que el
anterior, seleccionamos “Compiler” y en “Further Optimizations”→”Best Op-
timizations” →”Yes” (Figura B.7).
B.2.2.6. Paso 5
#include <bits/atomicity.h>
#if __GNUC__ >= 4
#include <bits/atomicity.h>
#if __GNUC__ >= 4 || __MINGW32__
http://opencv.willowgarage.com/documentation/cpp/index.html.
Apéndice C
Interfaz de programación de la
cámara
is_InitCamera (..)
210
APÉNDICE C. INTERFAZ DE PROGRAMACIÓN DE LA CÁMARA 211
Se establece la condición, con esta función, de que la cámara cada vez que
se llame a la función de captura devolverá la imagen recién capturada.
Además, para las condiciones de inicialización, si esta función desactiva
el trigger por software la cámara tarda en torno a 20 frames en adecuarse
a las condiciones lumínicas, mientras que con el trigger activado, tras
unos 5 frames ya se ha estabilizado el sensor. Puede devolver éxito en la
inicialización o fracaso.
Cada vez que esta función es llamada (1 vez por iteración del bucle) se
captura la imagen actual, con un retardo despreciable. La alternativa
a esta función se denomina is_CaptureVideo(), la cual según el manual
de la cámara sirve para realizar captura contínua, pero al transferir la
imagen al espacio de programa del usuario, el tiempo no es despreciable,
y los efectos, tal y como se explica en el capítulo 8, no son deseables.
Puede devolver éxito en la captura o fracaso.
APÉNDICE C. INTERFAZ DE PROGRAMACIÓN DE LA CÁMARA 213
Apéndice D
214
mar 2010 abr 2010 may 2010 jun 2010 jul 2010 ago 2010 sep 2010
Id. Nombre de tarea Comienzo Fin
28/2 7/3 14/3 21/3 28/3 4/4 11/4 18/4 25/4 2/5 9/5 16/5 23/5 30/5 6/6 13/6 20/6 27/6 4/7 11/7 18/7 25/7 1/8 8/8 15/8 22/8 29/8 5/9 12/9
Lectura de manuales de
8 13/04/2010 20/04/2010
programación.
Estudio e Implementación de la
34 descomposición de la matriz de 20/07/2010 30/07/2010
homografía.
Diagrama de clases de la
aplicación
216
CActuador PrincipalQuadrotor CObservador
-GestorPic +datosSensor +AA
-Escalado +x +B
-Inicializado +u +C
+sensor +L
+CActuador()
+gestorPic +uk_1
+inicializa()
+actuador +yk_1
+actua()
+sensorAltura +Xk
+finaliza()
+Inicializado
+~CActuador() +main()
+leyDeControl() +CObservador()
+inicializa()
+actualizaEstado()
CGestorPic +finaliza()
-ControladorPuerto CSensor
-MedidaAltura +Hgc
-Inicializado +Inicializado
IntrinsicMatrix.xml
+CActuador () +CSensor()
+inicializa() +inicializa()
+actua() +verifica() DistortionCoeffs.xml
+finaliza() +finaliza()
+~CActuador() +leeDatos()
+~CSensor()
-fusionaDatos() ConfigHardware.ini
<<uses>>
<<uses>>
TMatrix
<<uses>>
TVector
homographyDecomposition.hpp seleccion.hpp
*.hpp
*.hpp
<<uses>>
<<uses>>
Bibliografía
[1] Jianhong Liang, Xusheng Lei, Song Wang, Yongliang Wu and Tianmiao
Wang. A Small Unmanned Aerial Vehicle for Polar Research. Procee-
dings of the IEEE International Conference on Automation and Logistics
Qingdao, China September 2008.
[3] Nicolas Guenard, Tarek Hamel, and Robert Mahony. A Practical Visual
Servo Control for an Unmanned Aerial Vehicle. IEEE Ttransactions on
robotics, vol. 24, no. 2, April 2008.
[5] Xusheng Lei, Jianhong Liang, Song Wang, Tianmiao Wang. An Inte-
grated Navigation System For A Small UAV Using Low-Cost Sensors.
Proceedings of the 2008 IEEE International Conference on Information
and Automation June 20 -23, 2008, Zhangjiajie, China.
[6] Tahir Hameed, Wang Wei Ren Zhang. Conceptual Designing – Unman-
ned Aerial Vehicle Flight Control System. The Ninth International Con-
ference on Electronic Measurement & Instruments.
[7] Nicolas Guenard, Tarek Hamel, Laurent Eck. Control Laws For The
Tele Operation Of An Unmanned Aerial Vehicle Known As An X4-
flyer. Proceedings of the 2006 IEEE/RSJ International Conference on
Intelligent Robots and Systems October 9 - 15, 2006, Beijing, China.
[9] Ondrej Spinka, Stepan Kroupa, Zdenek Hanzalek. Control System for
Unmanned Aerial Vehicles.
218
BIBLIOGRAFÍA 219
[10] Bhaskar Prasad Rimal, Hyoim Shin and Eunmi Choi. Simulation of
Nonlinear Identification and Control of Unmanned Aerial Vehicle: An
Artificial Neural Network Approach.
[13] Janne Heikkilä and Olli Silvén. A Four-step Camera Calibration Proce-
dure with Implicit Image Correction.
[14] J.-Y. Bouguet, ”Camera Calibration Toolbox for Matlab”, June 2008,
http://www.vision.caltech.edu/bouguetj/calibdoc/index.
html.
[16] Ong Wei Ming Eugene. Ground Control Station for Unmanned Aerial
Vehicles.
[17] Odile Bourquardez, Robert Mahony, Tarek Hamel and François Chau-
mette. Stability and performance of image based visual servo control
using first order spherical image moments. Proceedings of the 2006
IEEE/RSJ International Conference on Intelligent Robots and Systems
October 9 - 15, 2006, Beijing, China.
[19] Billibon H. Yoshimi and Peter K. Allen. Active, uncalibrated visual ser-
voing.
[20] Tarek Hamel, Robert Mahony. Image based visual servo control for a
class of aerial robotic systems.
BIBLIOGRAFÍA 220
[21] Alessandro Astolfi, Liu Hsu, Mariana S. Netto, and Romeo Ortega. Two
Solutions to the Adaptive Visual Servoing Problem. IEEE Transactions
on robotics and automation, vol. 18, no. 3, june 2002.
[23] Ezio Malis and Patrick Rives. Uncalibrated Active Affine Reconstruction
closing the loop by Visual Servoing. Proceedings of the 2003 IEE/RSJ
Intl. Conference on Intelligent Robots and Sytems. Las Vegas, Nevada.
October 2003.
[25] Fransois-Xavier Espiau, Ezio Malis and Patrick Rives. Robust features
tracking for robotic applications: towards 21/2D visual servoing with
natural images. Proceedings of the 2002 IEEE International Conference
on Robotics & Automation Washington, DC May 2002.
[33] Zhongshi Wang , Wei Wu , Xinhe Xu , Dingyu Xue. Recognition and lo-
cation of the internal corners of planar checkerboard calibration pattern
image.
[35] Yi-Hsien Lin, Chin-Hsing Chen. Template matching using the parame-
tric template vector with translation, rotation and scale invariance.
[40] Civita, M. L.. Integrated Modeling and Robust Control for Full- Enve-
lope Flight of Robotic Helicopters. PhD thesis, Carnegie Mellon Univer-
sity, Pittsburgh, PA. 2003.
[45] Harris, C. and Stephens, M. 1988. A combined corner and edge detector.
In 4th Alvey Vision Conference. 147–151.
[51] François Chaumette and Seth Hutchinson. Visual Servo Control Part I:
Basic Approaches.
[53] Egan G.K. and Taylor B. Characterisation of Infrared Sensors for Ab-
solute Unmanned Aerial Vehicle Attitude Determination.
[54] Sentoso, F., Liu, M., and Egan, G.K.. Linear Quadratic Optimal Control
Synthesis for a UAV.
[55] A.K. Goodwin, G.K. Egan and F. Crusca. UAV Ridge Soaring in an
Unknown Environment.
[56] W.K. Kong, G.K. Egan and T. Cornall. Feature Based Navigation for
UAV’s.
[57] G.K. Egan, R.E. Cooper and B. Taylor. Unmanned Aerial Vehicle Re-
search at Monash University
[59] G.K. Egan and R.J. Cooper. An Unmanned Aerial Vehicle Autopilot.
[75] Hill, J., and Park, W.T. Real Time Control of a Robot with a Mobile
Camera. Proceedings of the 9th ISIR , Washingtong DC, March, pp.
233-246, 1979.
[78] Lamiroy, B., Espiau, B., Andreff, N., and Horaud, R. Controlling Robots
with Two Cameras: How to Do Properly. Proc. IEEE/RSJ Int. Conf. on
Robotics and Automation, pp. 2100-2105, 2000.
[79] Lamiroy, B. Puget, C. Horaud, R. What Metric Stereo Can Do for Visual
Servoing. Proceedings of the 2000 IEEE/RSJ Int. Conf. On Intelligent
Robots and Systems, pp. 251-256, 2000.
[81] Lippiello, V., Siciliano, B. and Villani, L. Position and Orientation Esti-
mation Based on Kalman Filtering of Stereo Images. Proceedings of the
2001 IEEE International Conference on Control Applications, Mexico
City, September 5-7, 2001.
[82] Deng, L., Janabi-Sharifi, F., and Wilson, W.J. Stability and Robustness
of Visual Servoing Methods. Proceedings of the 2002 IEEE International
Conference on Robotics and Automation, Washington, DC, May, 2002.
[88] Mezouar, Y., and Chaumette, F. Path Planning in Image Space for Ro-
bust Visual Servoing. Proceedings of the 2000 IEEE International Con-
ference on Robotics and Automation, San Francisco, CA. April, 2000.
[89] Malis, E., Chaumette, F., and Boudet, S. 2½D Visual Servoing. IEEE
Trans. on Robotics and Automation, 15(2), pp. 234-246, 1999.
[90] Fang, Y., Behal, A., Dixon, W.E., and Dawson, D.M. Adaptive 2.5D Vi-
sual Servoing of Kinematically Redundant Robots Manipulators. Pro-
ceedings of the 41st IEEE Conference on Decision and Control, Las
Vegas, Nevada USA, 2002.
[96] Colombo, C. Allota, B., and Darío, P. Affine Visual Servoing: A Frame-
work for Relative Positioning with a Robot. Int. Conf. on Robotics and
Automation, pp. 464-471, Nagoya, Japan, 1995.
[123] Ezio Malis and Manuel Vargas. Deeper understanding of the homo-
graphy decomposition for vision-based control.