Bestimmen der Ausrichtung des Spielzeughubschraubers aus dem Bild

7

Ich arbeite an der Entwicklung eines autonomen Steuerungssystems für ferngesteuerte Spielzeug-IR-Hubschrauber (wie zum Beispiel den Syma s107) unter Verwendung einer Webcam und eines Arduino mit einigen IR-LEDs. Ich verwende C ++ mit OpenCV auf einem Laptop mit etwa 2 GHz und muss das System so nah wie möglich an der Echtzeit halten.

Ich bin mir nicht sicher, wie ich die Drehung des Hubschraubers im 2D-Bild effektiv bestimmen kann (genauer gesagt, sein Gieren in Bezug auf die Kamerabilderbene). Diese Informationen sind wichtig, um den Hubschrauber auf dem Bildschirm stabilisieren zu können, da er sonst außer Sichtweite schwebt.

Ich habe überlegt und zumindest teilweise versucht, die Position des Körpers und des Schwanzes zu bestimmen und einige Tricks der Geometrie und Perspektive zu verwenden, um eine Schätzung der Form zu erhalten, aber es erwies sich als schwierig, Schwanz und Körper mit ausreichend geringem Geräusch genau zu finden. Ich habe auch überlegt, an bestimmten Stellen des Hubschraubers farbige Markierungen zu verwenden, bin mir aber nicht sicher, wie ich eine genauere Schätzung erhalten kann als ungefähr links und ungefähr rechts.

jonsca
quelle
2
Können Sie einige (vorzugsweise nicht große) Beispielbilder posten und die Probleme damit hervorheben?
@mtrw Ich weiß es nicht. Dies ist eher ein Bilderkennungsproblem. Es ist jedoch kein bisschen Bilderkennung, von dem ich etwas weiß.
dmckee --- Ex-Moderator Kätzchen
OK. Ich nehme es zurück. Ihr aktivstes Tag ist [Bildverarbeitung]. Dies ist möglicherweise gut für dsp.se geeignet.
dmckee --- Ex-Moderator Kätzchen

Antworten:

4

Für das Gieren reicht es aus, drei unterschiedliche Datenpunkte in einer Ebene parallel zur Rotordrehung am Hubschrauber zu befestigen: beispielsweise verschiedenfarbige LEDs. Sie könnten sie auf drei dünne Radialarme legen, die am Fahrwerk befestigt sind. Vielleicht würden auch farbige reflektierende Materialien funktionieren, aber Sie müssten Änderungen des Umgebungslichts ausgleichen.

Dann ist es einfach, den Gierwinkel zu ermitteln. Angenommen, die Lichter sind rot, grün und blau, 120 Grad voneinander entfernt und von oben gesehen ccw.

Geben Sie hier die Bildbeschreibung ein

Im Bild sehen Sie diese Lichter in verschiedenen x-Koordinatenreihenfolgen. Wenn sich der Hubschrauber von der im Diagramm gezeigten Position aus dreht:

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

(Natürlich werden an den Grenzen dieser Regionen zwei Lichter zu einem einzigen Punkt zusammengeführt. Diese können als Sonderfälle behandelt werden.)

Mit 3 Lichtern haben Sie also alle möglichen Gieren in 6 x 60 Grad Segmente aufgeteilt.

Sie können die Auflösung weiter auf 30 Grad senken, indem Sie einfach die linke und rechte "Spalt" -Breite vergleichen. Wenn der Azimut-Theta-Null-Grad direkt von der Kamera weg zeigt und das rote Licht auf der Nase ist (wie auf dem Bild), lautet der Algorithmus:

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

Die X+-15obigen mittleren XGrade plus oder minus 15: ein 30-Grad-Segment. Um den genauen Versatz zu erhalten, können Sie eine vorverarbeitete Tabelle erstellen, die das Verhältnis konvertiert

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

Dies ist eine ziemlich einfache Trigonometrie, die zu berechnen ist, und das Schöne ist, dass sie unabhängig davon funktioniert, wie weit der Hubschrauber entfernt ist, solange er niemals auf den Kopf gestellt wird!

Ein weiterer Nebeneffekt: Der Bildabstand zwischen den beiden äußeren Lichtern gibt Ihnen einen umgekehrten Abstand zur Kamera.


quelle
Möglicherweise müssen Sie auch die Position des Hubschraubers relativ zur Kamera berücksichtigen (zumindest in X-Richtung), da dies wahrscheinlich die Darstellung der Abstände zwischen den LEDs beeinflusst. Aber ich denke, eine clevere Triggerarbeit sollte es Ihnen ermöglichen, dies zu kompensieren.
Sie müssen die Fokuseigenschaften der Kameraoptik und der Bildebene kennen, um sicherzugehen, aber solange der Hubschrauber nicht extrem nahe ist, sind die außeraxialen Effekte gering.
1

Die Markierungsidee könnte funktionieren.

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


   \ /                   \ /        
    c                     c   

Stellen Sie sich vor, Sie platzieren Markierungen auf der anderen Seite des Hubschraubers und lassen sie auf der nahen Seite blockieren. Wenn sich der Hubschrauber dreht, ist die Markierung auf der sich nähernden Seite der Kamera ausgesetzt.

mgamba
quelle
1

Die vollständige Position und Ausrichtung des Copters kann berechnet werden mit: 4 bekannten Punkten in einer Ebene + kalibrierter Kamera oder mit 6 bekannten Punkten (bestimmte 3D-Konfigurationen funktionieren nicht, z. B. dürfen sich die Punkte nicht in derselben Ebene befinden). Siehe diese Frage für einen 6-Punkt-Algorithmus . Für einen 4-Punkt-Algorithmus habe ich die MSc-Arbeit von Liljequist - Ebenen, Homografien und Augmented Reality sehr nützlich gefunden, aber ich kann sie online nicht finden. Knapperes Papier, das sich auf die Kalibrierung konzentriert, wurde von Zhang geschrieben - Eine flexible neue Technik für die Kamerakalibrierung.

Gutes Buch zum Thema: Hartley, Zisserman - Geometrie mit mehreren Ansichten in der Bildverarbeitung.

buq2
quelle