Autonomes, kamerabasiertes Steuerungssystem für einen DJI Tello Quadcopter, entwickelt während meines Auslandsemesters an der Oslo Metropolitan University. Die Drohne erkennt geometrische Formen über ihre Bordkamera und führt entsprechende Flugmanöver aus — vollständig ohne menschliches Eingreifen. Realisiert in einem Vierer-Team in weniger als drei Wochen, ausschliesslich mit Open-Source-Software und Consumer-Hardware.
Ziele
- Erkennung vordefinierter geometrischer Formen (Dreieck, Rechteck) in Echtzeit mit OpenCV
- Zuordnung jeder Form zu einem spezifischen autonomen Flugmanöver
- Implementierung einer 6-DoF Poseschätzung zur räumlichen Lokalisierung des Ziels
- Integration aller Module zu einem vollständig autonomen Parkour-Durchlauf
Systemarchitektur
Das System folgt einer Perception–Estimation–Control Pipeline:
- Formerkennung — Die Bordkamera der Drohne liefert ein Live-Videobild. OpenCV verarbeitet jeden Frame und identifiziert Dreiecke und Rechtecke mittels Konturanalyse und geometrischer Verifikation.
- Poseschätzung — Nach bestätigter Formerkennung schätzt ein Perspective-n-Point (PnP) Algorithmus die 6-DoF Pose (Position + Orientierung) des Ziels relativ zur Kamera.
- Koordinatentransformation — Die Kamerapose wird über Rotations- und Translationsmatrizen in das Körperkoordinatensystem der Drohne transformiert.
- Flugsteuerung — Die berechneten Korrekturen werden über das DJI Tello SDK an die Drohne übermittelt. Die Drohne richtet sich aus und führt das Manöver durch.
Vision-Pipeline
Die Formerkennung folgt einem fünfstufigen Prozess:
- Bilderfassung — Frames der Tello-Bordkamera via UDP-Stream
- Vorverarbeitung — Graustufen, Gaussian Blur, Canny-Kantenerkennung
- Konturextraktion —
cv2.findContoursmitRETR_CCOMPzur Erkennung von Formen mit Innenstruktur (Rechteckrahmen) - Polygonannäherung —
approxPolyDPzur Klassifikation nach Eckenzahl - Geometrische Verifikation — Innenwinkelprüfung für Dreiecke (40–100°) und Rechtecke (≈90°)
Für die Rechteckerkennung wurden Canny-Kanten und adaptives Schwellenwertverfahren kombiniert, um unter verschiedenen Lichtverhältnissen robust zu funktionieren.
Poseschätzung
Die Poseschätzung basiert auf OpenCVs solvePnP-Funktion unter Verwendung der bekannten Realmasse des Zielrechtecks. Die intrinsischen Kameraparameter und Verzeichnungskoeffizienten wurden durch eine vorherige Schachbrettmuster-Kalibrierung bestimmt.
Das Ergebnis ist ein 6-dimensionaler Posevektor [rx, ry, rz, tx, ty, tz], der Rotation und Translation des Ziels relativ zur Kamera beschreibt. Dieser wird in das Drohnenkoordinatensystem transformiert, um die nötigen Korrekturen in alle vier Achsen zu berechnen.
Ergebnisse
Die Formerkennung war äusserst zuverlässig — beide Formen wurden in jedem Testdurchlauf beim ersten Versuch erkannt. Die Poseschätzung zeigte geringfügige Abweichungen auf der horizontalen Achse (Y), zurückzuführen auf einen Kalibrierungsversatz. Das Flugmanöver für das Dreieck war fehlerfrei; die Anfluggenauigkeit auf das Rechteck benötigte weitere Abstimmung.
Der vollständige Parkour-Durchlauf konnte aus Zeitgründen nicht getestet werden. Angesichts der Hardwarebeschränkungen (Drohne für ca. 170 CHF) und der Projektdauer von unter drei Wochen wurden die Ergebnisse als sehr zufriedenstellend bewertet.
Mein Beitrag
- Gesamtstruktur und Architektur des Codes
- Haupt-Steuerungsschleife (
main.py) - Drohnen-Steuerungsmodul (
controls.py) — Koordinatentransformation, Ausrichtungslogik, Flugbefehle - Implementierung der Poseschätzung
- Bau der Hindernisse für den Parkour
- Testing und Debugging