Determinación de la orientación del helicóptero de juguete a partir de la imagen

7

Estoy trabajando en el desarrollo de un sistema de control autónomo para helicópteros de control remoto IR de juguete (como el Syma s107, por ejemplo) usando una cámara web y un Arduino con algunos LED IR. Estoy usando C ++ con OpenCV en una computadora portátil que funciona a aproximadamente 2Ghz y necesito mantener el sistema lo más cerca posible del tiempo real.

No estoy seguro de una manera de determinar efectivamente la rotación del helicóptero en la imagen 2D (más precisamente su guiñada con respecto al plano de la imagen de la cámara). Esta información es importante para poder estabilizar el helicóptero en la pantalla porque, de lo contrario, flota fuera de la vista.

He considerado y al menos parcialmente tratado de determinar la ubicación del cuerpo y la cola y usar algunos trucos de geometría y perspectiva para obtener una estimación de la forma, pero encontrar con precisión la cola y el cuerpo con un ruido lo suficientemente bajo resultó difícil. También he considerado el uso de marcadores de colores de algún tipo en ciertos puntos del helicóptero, pero no estoy seguro de cómo obtener una estimación más precisa que aproximadamente a la izquierda y aproximadamente a la derecha.

jonsca
fuente
2
¿Puedes publicar algunas imágenes de muestra (preferiblemente no grandes) y resaltar los problemas con ellas?
@mtrw no lo sé. Esto es más un problema de reconocimiento de imagen. Sin embargo, no es un poco de reconocimiento de imágenes de lo que sé algo.
dmckee --- ex-gatito moderador
OKAY. Me retracto. Su etiqueta más activa es [procesamiento de imágenes]. Esto podría ser adecuado para dsp.se.
dmckee --- ex gatito moderador el

Respuestas:

4

Para guiñar es suficiente tener tres puntos de datos distintos fijados al helicóptero en un plano paralelo a la rotación del rotor: leds de diferentes colores, por ejemplo. Puede colocarlos en tres brazos radiales delgados fijados al tren de aterrizaje. Tal vez los materiales reflectantes coloreados también funcionarían, pero tendría que compensar los cambios de luz ambiental.

Entonces obtener el ángulo de guiñada es simple. Suponga que las luces son rojas, verdes y azules separadas por 120 grados y en dirección contraria cuando se ven desde la parte superior.

ingrese la descripción de la imagen aquí

Luego, en la imagen, verá estas luces en varias órdenes de coordenadas x. A medida que el helicóptero gira hacia la izquierda desde la posición que se muestra en el diagrama:

G R B   // green and blue in front; red in back
R G B   // green in front; red and blue in back
R B G   // red and gree in front; blue in back
B R G   // etc...
B G R
G B R

(Por supuesto, en las fronteras de estas regiones, dos luces se fusionarán en un solo punto. Estos pueden manejarse como casos especiales).

Entonces, con 3 luces, ha dividido todas las guiñadas posibles en segmentos de 6 x 60 grados.

Puede obtener una resolución de hasta 30 grados simplemente comparando los anchos de "espacio" izquierdo y derecho. Si apunta directamente lejos de la cámara hay azimut theta cero grados y la luz roja está en la nariz (como en la imagen), entonces el algoritmo es:

Xr = -sin(theta)
Xg = -sin(theta + 60)
Xb = -sin(theta + 120)
if (Xg < Xr && Xr <= Xb) {
  // Green and blue are in front of red
  dxLeft = Xr - Xg
  dxRight = Xb - Xr
  yaw = (dxLeft < dxRight) ? 15+-15 : -15+-15;
}
else if (Xr < Xg && Xg < Xb) {
  // Green is in front of red and blue
  dxLeft = Xg - Xr
  dxRight = Xb - Xg
  yaw = (dxLeft < dxRight) ? 30+-15 : 60+-15;
}
else ... four more cases

Los grados X+-15medios anteriores Xmás o menos 15: un segmento de 30 grados. Para obtener el desplazamiento exacto, puede construir una tabla preprocesada que convierta la relación

R = dxLeft < dxRight ? xLeft / xRight : xRight / xLeft

en un desplazamiento de azimut exacto entre -15 y 15. Esto es bastante simple de resolver, y lo bueno es que funciona independientemente de qué tan lejos esté el helicóptero, ¡siempre y cuando nunca se ponga de cabeza!

Otro beneficio adicional: la distancia de imagen entre las dos luces exteriores le brinda una distancia inversa a la cámara.


fuente
También es posible que deba tener en cuenta la ubicación del helicóptero en relación con la cámara (al menos en la dirección X), ya que esto probablemente afectará la forma en que aparecen las distancias entre los LED. Pero creo que un trabajo trigonométrico inteligente debería permitirle compensarlo.
Necesitaría saber las propiedades focales de la óptica de la cámara y el plano de imagen para estar seguro, pero mientras el helicóptero no esté extremadamente cerca, los efectos fuera del eje serán pequeños.
1

La idea de los marcadores podría funcionar.

 ___ ___                ___  ___ 
  m | m                  m /  m
    |                     /   
    +                    +   
    |                   /   
    |                  /   
 --- ---           --- --- 


   \ /                   \ /        
    c                     c   

Imagine poner marcadores en el lado más alejado del helicóptero y hacer que se bloqueen en el lado cercano. Cuando el helicóptero gira, el marcador del lado que se aproxima estará expuesto a la cámara.

mgamba
fuente
1

La ubicación y orientación completas del helicóptero se pueden calcular con: 4 puntos conocidos en un avión + cámara calibrada, o con 6 puntos conocidos (cierta configuración 3D no funcionará, por ejemplo, los puntos no deben estar en el mismo plano). Vea esta pregunta para el algoritmo de 6 puntos , para el algoritmo de 4 puntos He encontrado la tesis de maestría de Liljequist - Planos, Homografías y Realidad Aumentada muy útil, pero no puedo encontrarla en línea. El papel más conciso que se centra en la calibración está escrito por Zhang: una nueva técnica flexible para la calibración de la cámara.

Buen libro sobre el tema: Hartley, Zisserman - Geometría de múltiples vistas en visión artificial.

buq2
fuente