Determinando a orientação do helicóptero de brinquedo a partir da imagem


7

Estou trabalhando no desenvolvimento de um sistema de controle autônomo para helicópteros de controle remoto IR de brinquedo (como o Syma s107, por exemplo) usando uma webcam e um Arduino com alguns LEDs IR. Estou usando C ++ com OpenCV em um laptop rodando a cerca de 2Ghz e preciso manter o sistema o mais próximo possível do tempo real.

Não tenho certeza de como determinar efetivamente a rotação do helicóptero na imagem 2D (mais precisamente sua guinada em relação ao plano de imagem da câmera). Esta informação é importante para poder estabilizar o helicóptero na tela porque, caso contrário, ele fica fora de vista.

Eu considerei, e pelo menos parcialmente tentei determinar a localização do corpo e da cauda e usar alguns truques de geometria e perspectiva para obter uma estimativa da forma, mas encontrar com precisão o rabo e o corpo com ruído baixo o suficiente foi difícil. Também considerei usar marcadores coloridos de algum tipo em determinados pontos do helicóptero, mas não sei como obter uma estimativa mais precisa do que a esquerda e a direita aproximadamente.


2
Você pode postar algumas fotos (de preferência não grandes) e destacar os problemas com elas?

@ mtrw eu não sei. Este é mais um problema de reconhecimento de imagem. Não é, no entanto, um pouco de reconhecimento de imagem que eu saiba alguma coisa.
dmckee --- ex-moderador gatinho

ESTÁ BEM. Eu retiro. A tag mais ativa é [processamento de imagem]. Isso pode ser adequado para o dsp.se.
dmckee --- ex-moderador gatinho

Respostas:


4

Para guiar, basta ter três pontos de dados distintos fixados ao helicóptero em um plano paralelo à rotação do rotor: leds de cores diferentes, por exemplo. Você pode colocá-los em três braços radiais finos fixados no trem de pouso. Talvez os materiais refletores coloridos funcionassem também, mas você teria que compensar as mudanças de luz ambiental.

Então, obter o ângulo da guinada é simples. Suponha que as luzes estejam vermelhas, verdes e azuis separadas por 120 graus e ccw quando vistas de cima.

insira a descrição da imagem aqui

Então, na imagem, você verá essas luzes em várias ordens de coordenadas x. À medida que o helicóptero gira a partir da posição mostrada no 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

(Obviamente, nas fronteiras dessas regiões, duas luzes se fundirão em um único ponto. Elas podem ser tratadas como casos especiais.)

Assim, com 3 luzes, você dividiu todas as garras possíveis em segmentos de 6 x 60 graus.

Você pode reduzir ainda mais a resolução de 30 graus apenas comparando as larguras esquerda e direita da "folga". Se apontar diretamente para fora da câmera estiver em azimute teta zero graus e a luz vermelha estiver no nariz (como na imagem), o algoritmo é:

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

Os graus X+-15médios acima, Xmais ou menos 15: um segmento de 30 graus. Para obter o deslocamento exato, você pode construir uma tabela pré-processada que converte a taxa

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

em um deslocamento exato de azimute entre -15 e 15. Isso é bastante simples de trigonometria, e o bom é que ele funciona independentemente da distância do helicóptero, desde que nunca vire de cabeça para baixo!

Outro benefício colateral: a distância da imagem entre as duas luzes externas oferece uma distância inversa à da câmera.


Você também pode levar em consideração a localização do helicóptero em relação à câmera (pelo menos na direção X), pois isso provavelmente afetará a aparência das distâncias entre os LEDs. Mas acho que algum trabalho inteligente de trigonometria deve permitir que você o compense.

Você precisa conhecer as propriedades focais da óptica da câmera e do plano de imagem para ter certeza, mas enquanto o helicóptero não estiver extremamente próximo, os efeitos fora do eixo serão pequenos.

1

A ideia dos marcadores poderia funcionar.

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


   \ /                   \ /        
    c                     c   

Imagine colocar marcadores no lado mais distante do helicóptero e bloqueá-los no lado mais próximo. Quando o helicóptero gira, o marcador no lado que se aproxima será exposto à câmera.


1

A localização e a orientação completas do helicóptero podem ser calculadas com: 4 pontos conhecidos em um avião + câmera calibrada ou com 6 pontos conhecidos (determinadas configurações 3D não funcionarão, por exemplo, os pontos não devem estar no mesmo plano). Veja esta pergunta para o algoritmo de 6 pontos. Para o algoritmo de 4 pontos, achei a tese de mestrado de Liljequist - Aviões, Homografias e Realidade Aumentada muito útil, mas não consigo encontrá-la on-line. Um papel mais conciso, focado na calibração, é escrito por Zhang - Uma nova técnica flexível para calibração de câmera.

Bom livro sobre o tema: Hartley, Zisserman - Geometria de múltiplas visões em visão computacional.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.