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.
fuente
Respuestas:
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.
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:
(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:
Los grados
X+-15
medios anterioresX
más o menos 15: un segmento de 30 grados. Para obtener el desplazamiento exacto, puede construir una tabla preprocesada que convierta la relaciónen 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
La idea de los marcadores podría funcionar.
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.
fuente
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.
fuente