FlightController Datenübertragung (OpenMV)

Dient dazu, die berechneten Channel-Werte der OpenMV Kamera an den Flightcontroller weiterzuleiten. Zur Zeit ist die Datenübertragung nur von der OpenMV zum Flightcontroller implementiert, eine Rückleitung gibt es zur Zeit nicht.

Hardware

Es wird der UART3 der OpenMV Kamera verwendet. Der Anschluss erfolgt über P04 (TXD und P5 (RXD). Auf dem Flightcontroller ist die Schnittstelle an den ??? UART angeschlossen.

Datenverbindung

UART1, 115200 Baud, 8 Datenbits, no parity, 1 Stop, kein Handshake (OpenMV)

Bei der Smartphone-Datenübertragung ist die Baudrate 9600 Baud.

Checksumme

Die Datenübertragung zwischen der OpenMV Kamera und dem Flightcontroller erfolgt über DatenFrames (s.u.). Um diese Übertragung sicher zu machen, wird eine Checksumme verwendet. Dieselbe Checksummen-Berechnung wird auch für die Kommunikation zwischen OpenMV und Handy benutzt.

Frame Protokoll

  • StartByte (0xAA)
  • DummyByte (0x00)
  • Channel0 (16 Bit) = Yaw
  • Channel1 (16 Bit) = Pitch
  • Channel2 (16 Bit) = Throttle
  • Channel3 (16 Bit) = Roll
  • Channel4 (16 Bit) = KameraServo (nur bei Smartphone, not used bei OpenMV)
  • Channel5 (16 Bit) = Status
  • CRC16 (16 Bit, Startwert = 0)
  • DummyByte (0x00)
  • StopByte (0x55)

Kodierung Channels

Die Channels werden im „Servoformat“ kodiert:

In Servo-Mittelposition ist der Channelwert = 1500

In Servo-Position links ist der Channelwert = 900

In Servo-Position rechts ist der Channelwert = 2100

Todo Liste März 2018

Was geht

  • Finden des Punkts mit der höchsten Intensität (über ColorTable), nur für Debugging
  • Bildauswertung mit colortable in SquareArray[]
  • Finden der 3 Leds in SquareArray, mit Löschen der Neighbours
  • Datenempfang UART (Bluetooth) * Datenauswertung Bluetooth-Protokoll (work in progress)

todo

Durchgestrichene Punkte sind bereits erledigt.

Prio 1: Datenübertragung

  • [SW] CRC-Berechnung
  • [SW] Fertigstellung Datenauswertung Bluetooth-Protokoll
  • [SW] Datensenden UART
  • [SW] Bluetooth-Protokoll Senden
  • [SW] UART-Protokoll Flightcontroller (Senden)

Prio 2: Regelung

  • [SW] Umsetzen des Java-Codes zur Led-Auswertung in C
  • [SW] PID-Implementierung (testen CMSIS-Algo)
  • [SW] Daten für UART bereitstellen
  • [SW] Messen der Framerate (ohne Debugausgabe), Framerate über Bluetooth abrufbar

Prio 3: Copter-Test (1)

  • [HW] testen der PID-Einstellungen für kleinen Copter (1)
  • [HW, SW] testen der Entfernungseinstellung über Bluetooth und Handy

Prio 3: Plakat und StandDoku

  • [HW, SW] Layout des Plakats
  • [HW, SW] Druck des Plakats
  • [HW, SW] Layout Flyer
  • [HW, SW] Druck Flyer

Prio 4: Messen

  • [HW, SW] Wie empfindlich ist die Bildschärfe auf unterschiedliche Entfernungen (2,5m – 10m) bei verschiedenen Linsen?

Prio 5: Handling

  • [SW] Zustandssignalisierung über Leds
  • [SW] Abspeichern der PID Werte in ein EEprom o.ä.

Prio 6: Verbesserungen

  • [SW] LedErkennung per Filter mit 4 Aussenpunkten, dafür ggf. zweite ColorTable notwendig
  • [SW] LedErkennung: Entfernung der 4 Aussenpunkte abhängig von der Entfernung
  • [SW] Regelung der Belichtung abhängig von MaxIntensity, Entfernung
  • [SW] Änderung der SquareSize abhängig von der Entfernung des Copters

Prio 7: Copter-Test (2)

  • [HW, SW] testen der PID-Einstellungen für kleinen Copter (2), Finetuning mit allen Verbesserungen

Prio 8: Formationsflug

  • [HW] Leds am großen Copter anbringen, mittlere Led mit Servo
  • [SW] Ansteuerung des Servos vom Flightcontroller, Auswertung des Gyro
  • [HW] Fernsteuerungfrage klären

Bluetooth Datenübertragung

Dient dazu, Parameter der OpenMV Kamera während dem Betrieb lesen und ändern zu können oder Aktionen auf der OpenMV Kamera zu starten.

Hardware

Es wird der UART1 der OpenMV Kamera verwendet. Der Anschluss erfolgt über P0 (RXD und P1 (TXD). Zusätzlich wird der Pin P2 verwendet. Dieser kann den Mode-Eingang des Bluetooth-Moduls umschalten. Im Normalbetrieb ist dieser Pin Low.

Datenverbindung

UART1, 115200 Baud, 8 Datenbits, no parity, 1 Stop, kein Handshake

Checksumme

Die Datenübertragung zwischen Handy und OpenMV Kamera erfolgt über Frames (s.u.). Um diese Übertragung sicher zu machen, wird eine Checksumme verwendet. Dieselbe Checksummen-Berechnung wird auch für die Kommunikation zwischen OpenMV und Flightcontroller benutzt.

Frame Protokoll

  • StartByte (0xAA)
  • PacketType (1 Byte unsigned)
  • Index (4 Byte int)
  • Data (4 Byte float)
  • CRC16 (2 Byte, Startwert = 0)
  • StopByte (0x55)

Set Data in OpenMV: PacketType = 1

Datenübertragung vom Handy zur OpenMV Kamera.

Schreibt Daten in Variablen der OpenMV Kamera. Mit jedem Frame wird eine float Variable, die durch Index festgelegt wird, an die OpenMV Kamera gesendet.

Die Kamera antwortet mit PacketType = 3 mit der Einstellung, die geändert wurde.

Die Einstellungen sind:

"Throttle P",   "Throttle I",   "Throttle D",   "Throttle Offset",  "Throttle Status",  "Throttle setPoint",
"Yaw P",        "Yaw I",        "Yaw D",        "Yaw Offset",       "Yaw Status",       "Yaw setPoint",
"Pitch P",      "Pitch I",      "Pitch D",      "Pitch Offset",     "Pitch Status",     "Pitch setPoint",
"Roll P",       "Roll I",       "Roll D",       "Roll Offset",      "Roll Status",      "Roll setPoint",
"CameraPitch P","CameraPitch I","CameraPitch D","CameraPitch Offset","CameraPitch Status","CameraPitch setPoint",
"toleranceFactor", "sendDebugData"

Query Data from OpenMV: PacketType = 2

Datenübertragung vom Handy zur OpenMV Kamera.

Fragt nach einer Variablen der OpenMV Kamera am angegebenen Index. Die OpenMV Kamera antwortet mit „Response Data“ (PacketType = 3) des angefragten Index.

Query all Data from OpenMV: PacketType = 3

Datenübertragung vom Handy zur OpenMV Kamera.

Fragt nach allen Variablen der OpenMV Kamera. Die OpenMV Kamera antwortet mit mehreren „Response Data“ (PacketType = 3) Paketen (für jede Variable ein Paket).

Response Data from OpenMV: PacketType = 4

Datenübertragung von der OpenMV Kamera zum Handy.
Schickt  Variablen der OpenMV Kamera zurück zum Handy. Dies ist eine Antwort auf die „Query Data“ Frage des Handys (PacketType = 2). Mit jedem DatenFrame wird eine float Variable, die durch Index festgelegt wird, von der OpenMV Kamera zurück ans Handy gesendet.

Save Settings to Flash: PacketType = 5

Wenn dieser Befehl an die Kamera and die Kamera geschickt wird, speicht sie alle Einstellungen auf dem Flash Filesystem der OpenMV Kamera.

Index und Data sind Null / dont care.

Debug Data from OpenMV: PacketType = 6

Datenübertragung von der OpenMV Kamera zum Handy.
Schickt  Variablen der OpenMV Kamera zurück zum Handy.Wenn die Variable „SendDebugData“ > 0.5 ist, dann werden die DebugDaten in jedem Kameraframe gesendet.

DEBUG DATA FRAME PROTOKOLL
  1. StartByte (0xAA)
  2. PacketType (1 Byte unsigned) = 4
  3. Led0-X-Pos (-1.0 – 1.0, float)
  4. Led0-Y-Pos (-1.0 – 1.0, float)
  5. Led1-X-Pos (-1.0 – 1.0, float)
  6. Led1-Y-Pos (-1.0 – 1.0, float)
  7. Led2-X-Pos (-1.0 – 1.0, float)
  8. Led3-Y-Pos (-1.0 – 1.0, float)
  9. Entfernung (in m, float)
  10. FPS, float
  11. throttle Short
  12. yaw Short
  13. pitch Short
  14. roll Short
  15. CRC16 (16 Bit, Startwert = 0, alle Daten inkl. PacketType)
  16. StopByte (0x55)

Set Waypoint in OpenMV: PacketType = 7

Wenn dieser Befehl an die Kamera geschickt wird, gibt sie einen Befehl an den FC weiter zum Waypoint-Erstellen.

Im Moment nicht implementiert.

Settings saved to FlashAcknowledge: PacketType = 8

Dieses Package schickt die OpenMV Kamera zurück, sobald alle Settings im Flash gespeichert wurden.

Index und Data sind Null / dont care.

Datenformat Schnittstelle Smartphone <-> Flight Controller

Schnittstelle

Die Daten zwischen Smartphone und Flightcontroller werden über eine serielle Schnittstelle übertragen. An den USB-OTG-Port des Handys wird dafür ein Kabel mit integriertem FTDI- oder CP2102 Chip angesteckt. Diese Chips wandeln das USB-Signal in ein serielles UART Signal um. Zu beachten ist, dass der Flightcontroller 3,3V Pegel benötigt. Dies muss bei der Wahl des Kabels beachtet werden.

UART mit 115200 Baud

1 Startbit, 8 Datenbits, 1 Stopbit

3,3V TTL-Pegel

Kein Handshake

Datenprotokoll

Aufbau des Datenframes

Startbyte Channel_0 Channel_1 …. Channel_n CRC_16Bit Stopbyte

n ist auf 15 eingestellt.

Ein Frame besteht also aus 52 Bytes (Start-, Stopbyte, 2 Byte CRC und 16 16Bit-Channels). Da ein Byte aus 10 Bits besteht (Startbit, 8 Datenbits, Stopbit), benötigt ein Frame

(52 Byte * 10 Bits/Byte) /  115200 Baud = 4,514ms

Damit können maximal ca. 200 Frames/s vom Handy an den Flightcontroller geschickt werden.

Startbyte

Als Startbyte wird 0xAA hex (170 dezimal) übertragen.

Channel_0 … Channel_n

Alle Channels werden als 16 Bit signed integer binär codiert übertragen (Low-Byte first, High-Byte second). Insgesamt werden 16 Channels übertragen (n = 15).

CRC_16Bit

Die Checksumme wird berechnet: todo

und als 16 Bit Wert übertragen (Low-Byte first, High-Byte second).

Stopbyte

Als Stopbyte wird 0x55 hex (85 dezimal) übertragen.

 

Positionserkennnung

Dem Copter wird über einen Zeigestab seine relative Position übermittelt. Am Zeigestab sind 3 Leds (RGB = rot, grün, blau) angebracht. Die Leds bilden ein gleichseitiges Dreieck [Bild].

Anordnung: Rot = vorne links, blau = vorne rechts, grün = hinten Mitte.

Der Copter wertet über eine Kamera die Position der 3 Leds aus und berechnet aus diesen Werten seine Steuerbefehle:

  • Roll: Drehung um die Längsachse
  • Pitch: Drehung um die Querachse
  • Yaw: Drehung um die Hochachse
  • Throttle: „Gas“, Copter steigt oder sinkt

 

Bild aus: https://technikblog.ch/2013/03/projekt-multicopter-wie-funktioniert-ein-multicopter

 

Idealposition

Der Copter versucht, durch Steuerbefehle sich so zu positionieren, dass der

  • Mittelpunkt der Punkte (R,G, B) sich in der Mitte des Kamerabildes befindet,
  • die Punkte R und B den Abstand n haben und
  • der Punkt G sich in der Mitte der Gerade RB befindet:

Copterdrehung

Eine Drehung des Bildes resultiert aus der Schräglage entweder des Copters oder des Zeigestabs. Diese Drehung muss nicht ausgeglichen werden, da sie eine Folge der Copter-Positionsregelung (Roll) ist:

Versatz in Y-Richtung

Hier befindet sich der Copter zwar in der Idealposition. Allerdings ist die Kamera nicht optimal auf den Copter ausgerichtet. Optional kann daher die Kamera über ein Servo in ihrer Längsachse gedreht werden, um diesen Versatz zu korrigieren.

 

Versatz in X-Richtung

Dieser Versatz bedeutet, dass der Copter in seiner Hochachse nicht optimal in Richtung des Zeigestabs positioniert ist. Es muss eine Korrektur des Yaw Wertes erfolgen.

 

Abstand  RB entspricht nicht dem Idealabstand n

Dies bedeutet, dass der Copter zu nah (Abstand RB > n) oder zu weit entfernt (Abstand RB < n) vom Zeigestab positioniert ist.  Dies muss über den Pitch-Wert korrigiert werden.

Punkt G befindet sich nicht auf der Gerade RB

Ist G nicht auf der Gerade RB positioniert, dann ist der Copter zu hoch (G oberhalb von Gerade RB) oder zu tief (G unterhalb Gerade RB) positioniert. Dies muss über eine Änserung des Throttle korrigiert werden.

Punkt G befindet sich nicht in der Mitte der Strecke RB

Befindet sich G auf der Gerade RB näher an B, dann muss die Copterposition nach links korrigiert werden. Ist G näher an R, wird nach rechts korrigiert. Dies erfolgt durch eine Modifikation des Roll Wertes.

Gemischte Korrekturen

In der Praxis werden alle oben genannten Korrekturen gleichzeitig auftreten:

Berechnungspraxis

jkkjgkj

 

Was für einen sicheren Drohnen-Flug beachtet werden muss

Für einen sicheren Flug mit einer Drohne sollte folgendes beachtet werden:

  1. Die Drohne sollte mit einem Schalter an der Fernbedienung armed bzw gedisarmed werden können, damit die Motoren abgeschaltet werden können, wenn es eine Gefahr gibt
  2. Die Akkus der Fernbedienung sollten voll geladen sein.
  3. Die Propeller der Drohne sollten nicht beschädigt sein, das heißt nach einem Crash sollten immer neue Propeller verwendet werden, damit sie nicht während dem Flug zerbrechen.

Software Update 1.4.2017

Für die Erkennung des Markers wird ArUco mit OpenCV verwendet, weil es GPU-Beschleunigt auf einem Computer laufen kann und eine 3D Marker Erkennung bietet. Die Drohne soll über einen PCTx mit dem Computer gesteuert werden.

Schwierigkeiten:

  • OpenCV .lib Dateien nicht in der Version 3.2.0 vorhanden
  • .lib Dateien in der Version 2.4.13 nicht verwendbar für den Compiler von Visual Studio 2014

OpenMV habe ich noch nicht geschafft, weil die Erkennung von Markern ist nicht gut Dokumentiert ist (Umwandlung von OpenCV Haarcascades in Haarcascades, die mit OpenMV kompatibel sind)

Bestellte Teile

Rahmen Frame 450 Glass Fiber 13,23 € 295 g
Flugcontroller http://www.banggood.com/Upgrade-NAZE32-F3-Flight-Controller-Acro-6-DOF-Deluxe-10-DOF-for-Multirotor-Racing-p-1010232.html?rmmds=search 29.99 € 10 g
Naze32 rev6 with GPS 10,39 € 8 g
Motoren Racestar 2212 920KV 27,32 € 200 g
Propeller 1045 3,08 € 28 g
ESC´s 4x FVT LittleBee 20A 40,66 € 24 g
Batterie Eachine 11.1V 2200mh 3S 16,54 € 180 g
Batterie Halter 5x Battery Tie Down Strap 1,60 €

Fernbedienung – Flysky fs-i6 2.4g

Reciever zusätzlich – FS-iA6B Empfänger PPM Output