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.
quelle
Antworten:
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.
Im Bild sehen Sie diese Lichter in verschiedenen x-Koordinatenreihenfolgen. Wenn sich der Hubschrauber von der im Diagramm gezeigten Position aus dreht:
(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:
Die
X+-15
obigen mittlerenX
Grade 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 konvertiertDies 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
Die Markierungsidee könnte funktionieren.
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.
quelle
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.
quelle