Selbst gemachtes eigenständiges Fluggerät von einem Android-Smartphone

Ursprünglicher Autor: Paul Guermonprez, Nicolas Vailliet, Cedric Andreolli
  • Übersetzung

Spaß mit einem autonomen Flugzeug zu haben, macht natürlich Spaß, aber es ist noch interessanter, sie selbst zu erstellen! Dieser Artikel richtet sich an diejenigen, die ihren eigenen intelligenten Copter entwickeln möchten und eine Reihe einfacher Anweisungen zum Erzielen von Ergebnissen mit einem Smartphone unter Android, OpenCV, C ++ und Java enthalten. Wenn Sie die ersten Schritte durchgehen und Ihr Gerät weiter verbessern möchten, finden Sie am Ende des Beitrags einen nützlichen Link und einen Denkanstoß.

Autonom und intelligent?

Damit der Copter unabhängig fliegen kann, muss er alle erforderlichen Sensoren, ausreichende Rechenleistung und Kommunikationsmöglichkeiten enthalten. Es scheint nicht so viel zu sein, aber fast alle verfügbaren kommerziellen Modelle tun es nicht. Es gibt zum Beispiel Modelle, deren Bewegung durch im Raum befindliche Sensoren bestimmt wird. Eine weitere Option ist die GPS-Steuerung. Ein GPS-Empfänger ist billig und einfach zu bedienen, hat jedoch große Verzögerungen beim Datenempfang und ist nicht genau genug. Das alles ist nicht gut für uns.
Um den Titel "intellektuell" zu tragen, muss Ihr Copter in der Lage sein, die umgebende Realität wahrzunehmen und zu analysieren. Dies erfordert nicht nur einen leistungsstarken Prozessor, einen großen Akku, eine hochwertige Kamera und ausreichend Sensoren, sondern auch schnelle Kommunikationsgeräte. Natürlich sollte das gesamte System gut verwaltet und einfach zu programmieren sein. Wir kommen also zu dem Gedanken: Ist es möglich, das Gehirnzentrum eines Hubschraubers auf der Basis eines Smartphones zu realisieren? Die Verwendung eines Android-basierten Geräts ist am bequemsten, da es für dieses Betriebssystem praktische Entwicklungstools und Softwarekomponenten gibt, z. B. Intel Integrated Performance Primitives (Intel IPP) oder OpenCV. Ein modernes Smartphone verfügt über alle Hardwarekomponenten, die wir benötigen. Es ist also absolut nicht erforderlich, das Rad neu zu erfinden.

Motorsteuerung

Damit die Zentrale ausgewählt ist, müssen wir nun die Motoren daran anschließen. Wir haben uns für den Servocontroller Pololu Maestro für ca. 5 US-Dollar entschieden. Er wird über USB angeschlossen und verfügt über eine Bluetooth-Schnittstelle. Mit dieser Karte werden Standard-Servoantriebe gesteuert. Mit Hilfe des Servocontrollers Pololu Maestro und eines Smartphones ist es relativ einfach, ein gesteuertes Flugzeug in ein autonomes umzuwandeln.



Mit ein paar Codezeilen und Standard-Android-USB-Tools steuern wir die Servomotoren und damit die Bewegung des Copters. Noch ein paar Codezeilen - und wir erhalten Zugriff auf GPS, Kamera und Datenübertragung über das Netzwerk.
Rufen Sie controlTransfer von UsbDeviceConnection auf:
import android.hardware.usb.UsbDeviceConnection;
// …
private UsbDeviceConnection connection;
// …
connection.controlTransfer(0x40, command, value, channel, null, 0, 5000);


Mit dem Controller können Sie die Servoantriebe steuern, Endposition, Geschwindigkeit und Beschleunigung einstellen - alles, was für eine reibungslose Bewegung erforderlich ist. Das Befehlsargument kann einen von drei Werten annehmen:
public static final int USB_SET_POSITION = 0x85;
public static final int USB_SET_SPEED = 0x87;
public static final int USB_SET_ACCELERATION = 0x89;

Wählen Sie die entsprechenden Werte aus und übergeben Sie sie mit dem Kanalargument an den gewünschten Servomotor. Ein Link zum vollständigen Quellcode und zur Konfiguration des USB-Zugriffs im Anwendungsmanifest finden Sie am Ende des Beitrags.

Eigenschaften von Quadrocoptern

Bisher läuft alles gut. Hardwarekomponenten lassen sich problemlos miteinander verbinden, die Programmierung ist nicht schwierig, da alles von Android implementiert wird. Es gibt jedoch ein Merkmal, das mit dem Aufbau eines Quadrocopters verbunden ist. Im Gegensatz zu einfacheren Modellen wie einem Auto oder Flugzeug muss der Quadrocopter seine Stabilität ständig überwachen. Deshalb ist das Stabilisierungsmodul eine notwendige Komponente. Natürlich kann der Stabilisator programmatisch gemacht werden, indem eine Menge Code in C ++ oder Java geschrieben wird. Es ist jedoch viel einfacher, für ein paar Dollar eine Stabilisierungskarte zu kaufen, die direkt an den Pololu angeschlossen ist und die vier Servoantriebe des Geräts steuert. Alles andere kann mit einfachen Befehlen wie ± Höhe, ± Geschwindigkeit /, ± Neigung und ± Richtung ausgeführt werden.
Wenn Sie einen Quadrocopter bauen, denken Sie daran: Diese Karte wird Ihr Leben erheblich vereinfachen. Sie müssen lediglich die Erstkalibrierung durchführen und diese dann vergessen.

Alles zusammen

Als Ergebnis der ersten Phase des Entwurfs eines autonomen Quadrocopters haben wir die folgende Hardwarekette:
Smartphone <> Micro-USB-USB-Adapter <> USB-Mini-USB-Kabel <> Pololu Maestro-Karte <> 4 JR-Kabel <> Stabilisierungskarte <> JR-Kabel < > Servoantriebe <> Motoren



Bei einem einfacheren Gerät wird die Kette kürzer:
Smartphone <> Micro-USB-USB-Adapter <> USB-Mini-USB-Kabel <> Pololu Maestro-Karte <> JR-Kabel <> Servoantriebe <> Motoren



Darüber hinaus können Sie Installieren Sie andere Antriebe an Ihrem Fluggerät, z. B. für Landeklappen oder Fahrwerke. Die Pololu Maestro-Karte bietet Steuerungsunterstützung für bis zu 24 Laufwerke - für unser Projekt ist dies wahrscheinlich sogar überflüssig.
Die Basisplattform wird erstellt. Jetzt ist es Zeit, unser Gerät mit Vision auszustatten.

Computer Vision

Ohne ein Computer-Vision-System kann ein intelligentes Gerät offensichtlich nicht als solches betrachtet werden. Unser Copter soll nicht nur Fotos aufnehmen, sondern auch analysieren können - dafür nutzen wir die Möglichkeiten von OpenCV.
Die OpenCV - ist eine Open - Source - Software - Bibliothek für die Bildanalyse , dass zahlreiche unterliegt Implementierungen von Systemen der Computer Vision und der virtuellen Realität. Ursprünglich von Intel entwickelt, ist es jetzt für eine Vielzahl von Hardwareplattformen und Betriebssystemen verfügbar.
In der Praxis versuchen wir, ein einfaches Zeichen in Form eines Kreises zu erkennen und in einem gewissen Abstand vor diesem Zeichen zu sitzen. Um die Testaufgabe zu vereinfachen, bewegen wir das Smartphone von Hand.



OpenCV ist keine Bibliothek, auf die Java für Android direkt zugreift. Dies ist eine native Bibliothek, die häufig in C ++ - Programmen verwendet wird. Daher benötigen wir Android NDK. Das Aufnehmen von Bildern und die Visualisierung erfolgen in Java. Für die Interaktion zwischen Java und C ++ wird JNI verwendet. Wir müssen das Android NDK und Android SDK installieren, ein neues Circles-Projekt erstellen, die C / C ++ - Komponente hinzufügen und die Projekteigenschaften ändern, um die OpenCV-Bibliothek zu verwenden, wie in den folgenden Screenshots gezeigt:









Als Ergebnis hat Ihr Projekt:
Die Java-Hauptdatei „Src / MainActivity. Java »
XML-Markup-Datei" Res / layout / activity_main.xml "und Manifest
zwei Makefiles" Jni / Android.mk "und" Jni / Application.mk "
CPP-Code" Jni / ComputerVision_jni.cpp "und Header" Jni / ComputerVision_jni.h " "


Im Gegensatz zu Java muss C ++ für einen bestimmten Prozessor kompiliert werden. Die Anpassung erfolgt durch Bearbeiten der Variablen APP_ABI in der Datei Application.mk. Wenn Sie ein Intel-basiertes Smartphone haben, ist der richtige Wert x86. Weitere NDK wird alles selbst machen.

Bereitstellung

OpenCV ist eine Bibliothek, die von einer unbegrenzten Anzahl von Android-Anwendungen verwendet wird, während die Version der Bibliothek, die sie verwenden können, unterschiedlich ist. Als Entwickler können Sie Ihre Anwendung mit einer bestimmten Version von OpenCV verknüpfen, es gibt jedoch eine bessere Option. Verwenden Sie den Abhängigkeitsmanager "OpenCV Manager". Dies ist eine Android-Anwendung, die feststellt, dass Sie OpenCV gerade benötigen, und die genaue Version herunterlädt, die Sie benötigen.
Wir möchten in OpenCV Kreise erkennen, deren Mittelpunkt und Radius bestimmen und Anweisungen an den Smartphone-Bediener ausgeben, um einen zentrierten Kreis mit der richtigen Größe zu erhalten. Der folgende Java-Code ruft das Kamerabild mithilfe der Java-API für Android ab, ruft die C ++ - Funktion über JNI auf und fügt einen Zeiger auf das Bild im Speicher hinzu. C ++ - Code implementiert die Bildverarbeitung zum Erkennen von Kreisen. Als nächstes wird Java erneut aufgerufen, um die erkannten Kreise und Kommentare anzuzeigen.
Java Code:
…
// capture images from the camera
import org.opencv.Android.CameraBridgeViewBase;
// load OpenCV native dependancy 
import org.opencv.Android.OpenCVLoader;
…
public void onResume()
{
super.onResume();
// OpenCV loading with a callback
// non typical code specific to OpenCV
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback);
}
…
// once the OpenCV manager link established,
// we can load the dynamic library 
System.loadLibrary("jni_part");
…

C ++ Code
…
// typical for JNI : Java class method name
// pointer to RGB image as argument
JNIEXPORT int JNICALL Java_com_example_circles_MainActivity_process
(JNIEnv *jenv, jobject obj, jlong addrGray, jlong addrRgba)
…
// Get the bitmap from pointer
Mat& mRgb = *(Mat*)addrRgba;
// blur, required before detecting circles 
medianBlur(mGr,mGr,5);
// OpenCV detection – Hough transformation
HoughCircles(mGr, //grayscale input image
*circles, //output vector
CV_HOUGH_GRADIENT, //detection method to use
4, //inverse ratio of the accumulator resolution to the image
mGr.rows/8, //min distance between centers of detected circles
220, //higher threshold of the two passed intern canny edge detector
200, //accumulator threshold	100
20, //min radius
mGr.cols/8 //max radius
);


Für den Test habe ich das Smartphone vor ein Blatt Papier mit einem gedruckten Kreis bewegt. Angenommen, aus einem Abstand von 20 cm hat das Bild des Kreises eine Größe von 300 Pixel - wir betrachten dies als die richtige Position. Wenn der Kreis kleiner ist, muss das Smartphone näher, wenn mehr, dann weiter bewegt werden. Dies ist die einfachste Option. Es können zwei konzentrische Kreise verwendet werden, der größere für die Fernnavigation und der kleinere für die Nahnavigation. Nichts hindert die Erkennung anderer spezifischer Figuren, beispielsweise Pfeile. Letztendlich müssen wir ein System bekommen, das sowohl GPS-Daten als auch Farbinformationen von der Kamera verwendet.

Zukunftspläne

Installieren Sie OpenCV Manager und Ihre APK-Datei von Eclipse. Führen Sie es aus und führen Sie alle Konfigurationsschritte aus. Sie bestimmt die Kreise im Sichtfeld und steuert die Bewegung des Smartphones zum Mittelpunkt des Kreises eines bestimmten Durchmessers.
Auf einem Test-Smartphone erhielten und verarbeiteten wir das Bild alle 8 Hundertstel Sekunden - 12,5 Bilder pro Sekunde. Dies beweist, dass Computer Vision für einen Copter eine sehr reale Sache ist, auch wenn die Zeit und die finanziellen Ressourcen begrenzt sind.
Die Weiterentwicklungsmöglichkeiten sind sehr vielfältig. OpenCV ist eine Open Source-Bibliothek, die auf viele Plattformen portiert ist. Darüber hinaus ersetzt Intel IPP einige OpenCV-Aufrufe auf niedriger Ebene und beschleunigt Ihren Code durch das Einfügen von Funktionen, die für Intel-Prozessoren optimiert sind. Sie können Code-Portabilität sparen - in Zukunft benötigen Sie möglicherweise ein leistungsfähigeres Smartphone.
Aber was als nächstes zu tun - Sie werden die Eingabeaufforderung Materialien aus der Intel - Website . Es ist sehr detailliert beschrieben, wie man eine Flugmaschine baut und was man sie lehrt.
Jetzt noch ein paar weiterführende Links:

Jetzt auch beliebt: