Eingabe von Aeronet Episode 2: Homing Drone


Im vorherigen Artikel haben wir das Verfahren zum Starten einer autonomen virtuellen Drohne in die Luft untersucht. Unter Anleitung des Lehrers schaffen es sogar Schulkinder, die Drohne gemäß dieser Anweisung zu starten. Es stellt sich die Frage: Was kommt als nächstes? Nun, Drohne, gut gestiegen. Darüber hinaus virtuell - in Spielzeug und Simulatoren und schöner gemalt.


Als nächsten Schritt schlagen wir vor, eine Homing-Drohne zu entwickeln, mit der Sie Ihr Ziel erkennen und erfolgreich erreichen können. Es ist am einfachsten, einen farbigen Ballon als Ziel zu verwenden.


Eine solche Aufgabe (einen Ball mit einer autonomen Drohne zu platzen) wurde kürzlich von Teams in der Aeronet-Sektion des Allrussischen Robocross-2019 ausgeführt . Wir wurden von dem Song „Seek and Destroy“ aus dem Debütalbum einer amerikanischen Gruppe inspiriert, das in meiner turbulenten Jugend sehr beliebt war.
In der nächsten Artikelserie werden wir uns ansehen, wie man einer autonomen Drohne beibringt, einfache Anweisungen aus dem Refrain des oben genannten Songs zu befolgen.


Wir brauchen also Folgendes:


  1. Eine fliegende Drohne, die wir vom Programm aus steuern können
  2. Zielerkennungs- und Leitsystem
  3. Kombinieren Sie die beiden vorherigen Punkte miteinander - und voila, Sie können gegeneinander antreten, dessen Drohne schneller und mit mehr Bällen fliegen wird.

Als nächstes das Wichtigste zuerst.


jMAVSim tastaturgesteuert


Stellen Sie sich eine Drohne vor, die einen Ball sieht, wie auf dem Bild oben. Die Kamera der Drohne schaut geradeaus.


Um auf einem Ball fliegen zu können, muss unsere Drohne in der Lage sein: sich vorwärts / rückwärts zu bewegen, links und rechts zu drehen, höher und tiefer zu fliegen. Der Ball bewegt sich im Kameraobjektiv nicht nur durch Windböen, sondern auch durch die Neigung der Drohne entlang der Rolle und des Spielfelds, aber wir vernachlässigen diese Neigungen bisher.


Wir werden die Geschwindigkeit der Drohne steuern und Nachrichten über Mavros an das Thema /mavros/setpoint_velocity/cmd_vel_unstamped .


Um die Drohne über die Tastatur zu manipulieren, verwenden wir das Curses-Modul ( Beschreibung auf Russisch , Englisch ).


Der Algorithmus ist einfach: Die aktuellen Werte der gewünschten Geschwindigkeiten werden in einer Sollwertvariablen vom Typ geometr_msgs.msg.Twist gespeichert. Durch Drücken einer Taste auf der Tastatur erhöhen / verringern wir die gewünschte Geschwindigkeitskomponente. Mit dem Timer veröffentlichen wir 20 Mal pro Sekunde die Geschwindigkeit im angegebenen Thema.


Für die Vorwärtsgeschwindigkeit (relativ zur Drohne) ist eine Klärung erforderlich. Tatsache ist, dass die Fluggeschwindigkeit im lokalen Koordinatensystem der "Welt" eingestellt werden muss, in der unsere Drohne fliegt. Daher müssen Sie die aktuelle Position (Pose) der Drohne in diesem Koordinatensystem verfolgen. Die X-Achse der Drohne wird relativ zur X-Achse der "Welt" um einen bestimmten Winkel gedreht. Mavros veröffentlicht die aktuelle Position der Drohne in den Koordinaten der "Welt" im Thema /mavros/local_position/pose . Nachdem wir den Winkel Gieren von der Position erhalten haben, um die gewünschte Drohnengeschwindigkeit in Weltkoordinaten zu erhalten und zu veröffentlichen, multiplizieren wir die gewünschte Vorwärtsgeschwindigkeit setvel_forward mit cos (Gieren) für die X-Achse bzw. sin (Gieren) für die Y-Achse der Welt.



Volltext des Programms:
 #!/usr/bin/env python # coding=UTF-8 import rospy import mavros import mavros.command as mc from mavros_msgs.msg import State from geometry_msgs.msg import PoseStamped, Twist, Quaternion from mavros_msgs.srv import CommandBool from mavros_msgs.srv import SetMode import tf.transformations as t import math current_state=State() current_pose = PoseStamped() current_vel = Twist() def localpose_callback(data): global current_pose current_pose = data def publish_setvel(event): global current_pose, setvel_pub, setvel, setvel_forward q=current_pose.pose.orientation.x, current_pose.pose.orientation.y,current_pose.pose.orientation.z,current_pose.pose.orientation.w roll, pitch, yaw = t.euler_from_quaternion(q) setvel.linear.x = setvel_forward * math.cos(yaw) setvel.linear.y = setvel_forward * math.sin(yaw) setvel_pub.publish(setvel) def main(): global current_pose, setvel, setvel_pub, setvel_forward rospy.init_node("offbrd",anonymous=True) rate=rospy.Rate(10) pose_sub=rospy.Subscriber("/mavros/local_position/pose",PoseStamped,localpose_callback) setvel_pub=rospy.Publisher("/mavros/setpoint_velocity/cmd_vel_unstamped",Twist,queue_size=1) arming_s=rospy.ServiceProxy("/mavros/cmd/arming",CommandBool) set_mode=rospy.ServiceProxy("/mavros/set_mode",SetMode) setvel=Twist() setvel_forward = 0 arming_s(True) set_mode(0,"AUTO.TAKEOFF") print 'Taking off.....\r' rospy.sleep(5) # keyboard manipulation import curses stdscr = curses.initscr() curses.noecho() stdscr.nodelay(1) stdscr.keypad(1) for i in range (0,10): setvel_pub.publish(setvel) rate.sleep() set_mode(0,"OFFBOARD") setvel_timer = rospy.Timer(rospy.Duration(0.05), publish_setvel) while (rospy.is_shutdown()==False): rate.sleep() # keyboard hcommands handling c = stdscr.getch() if c == ord('q'): break # Exit the while() elif c == ord('u'): setvel.linear.z += 0.25 elif c == ord('d'): setvel.linear.z -= 0.25 elif c == curses.KEY_LEFT: setvel.angular.z += 0.25 elif c == curses.KEY_RIGHT: setvel.angular.z -= 0.25 elif c == curses.KEY_UP: setvel_forward += 0.25 elif c == curses.KEY_DOWN: setvel_forward -= 0.25 elif c == ord('s'): setvel_forward=setvel.linear.z=setvel.angular.z=0 if c!=curses.ERR: print setvel,'\r' curses.endwin() set_mode(0,"AUTO.LAND") print 'Landing.......\r' if __name__=="__main__": main() 

Um das Programm zur Ausführung auszuführen, müssen wir jMAVSim ausführen und mavros mit dem Befehl roslaunch mavros damit verbinden (nach dem Ausführen von roscore, wenn es nicht automatisch gestartet wurde):


 roslaunch mavros mavros_sitl.launch fcu_url:="udp://@192.168.7.14:14580" 

Stellen Sie sicher, dass wir über rostopic echo / mavros / state verbunden sind. Das verbundene Feld muss = True sein.


Speichern Sie anschließend den Programmcode in einer Datei und führen Sie ihn mit dem python fly_mavsim.py . Der virtuelle Quadrocopter sollte eine Höhe von ca. 2 Metern erreichen (die Starthöhe wird im Parameter MIS_TAKEOFF_ALT in QGroundControl festgelegt) und hängen bleiben. Mit den Tasten auf der Tastatur kann gesteuert werden: Rechts-Links-Pfeile - Drehen, Auf-Ab-Pfeile - Vorwärts- / Rückwärtsbewegung, U - Aufwärtsfliegen (UP), D - Abwärtsfliegen (AB), s - An Ort und Stelle hängen (STOP, alle Geschwindigkeiten = 0), q - Beenden Sie das Programm (QUIT) und landen Sie den Quadrocopter.


Sie können durch die virtuelle Welt fliegen und überprüfen, wie sich eine ideale virtuelle Drohne im Flug verhält.


Drohne während des Fluges


Änderungen der Geschwindigkeit durch Tastenanschläge werden zusammengefasst. Sie können die Drohne in einem Kreis, in einer Spirale, um einen bestimmten Punkt fliegen lassen und ein Zielsystem simulieren.


Dann beginnt der Spaß: Von einer kugelförmigen Drohne im Vakuum bewegen wir uns in die reale Welt.


Tastaturgesteuerte echte Drohne


Im Netzwerk gibt es viele Anweisungen zum Zusammenstellen und Konfigurieren von Kopierern auf dem PX4-Stapel. Ein ziemlich detaillierter Prozess ist in der Dokumentation der Entwickler beschrieben .


Da ich eine vorgefertigte Drohne verwendet habe, habe ich mich während der Montage und der vorläufigen Konfiguration des Systems vor zahlreichen Kniebeugen bewahrt.


Als Bordcomputer verwenden wir Raspberry PI 3 Model B + mit installiertem Raspbian + ROS Kinetic. Himbeere ist über uart mit dem Pixracer-Flugregler verbunden, gemäß dem Schema:


Pixracer + Raspberry PI


Das GPS-Modul ist mit dem GPS-Port des Flugreglers verbunden. Ich benutze das TS100-Modul von Radiolink, die Qualität ist gut, die Kosten sind nicht hoch.


ROS Kinetic kann mithilfe der Anweisungen selbst installiert werden. Auf Raspberry sollten Sie den Zugriff über Wifi und ssh konfigurieren ( hier ist beispielsweise eine Anweisung ).


Sie können auch ein fertiges Bild für Himbeere der Firma "Copter Express" verwenden. In diesem Fall sollten Sie das standardmäßige clevere Paket deaktivieren, das wir nicht benötigen:


 sudo systemctl stop clever sudo systemctl disable clever 

Ein weiteres Himbeer-Image mit ROS und OpenCV wird hier beschrieben. Ich habe es in meiner Arbeit nicht ausprobiert, aber die verwendeten Tools sind ähnlich.


Nachdem wir die Drohne eingeschaltet und über ssh eine Verbindung zu Raspberry hergestellt haben, starten wir mavros und überprüfen die Verbindung mit dem Flugregler:


 roslaunch mavros px4.launch fcu_url:='/dev/ttyAMA0:921600' gcs_url:='tcp-l://0.0.0.0:5760' rostopic echo /mavros/state 

Wenn alles richtig funktioniert, erhalten wir einmal pro Sekunde Meldungen über den Status des Fluglotsen mit dem Feld Connected = True.



Der Parameter gcs_url im Aufruf von gcs_url wird benötigt, damit wir das QGroundControl über WLAN über TCP-Bridge mit dem Flugcontroller der Drohne verbinden können. Verbindungsparameter werden in QGroundControl festgelegt:



Um die Drohne für den autonomen Flug vorzubereiten, folge ich ein paar einfachen Schritten:


1. Stellen Sie sicher, dass die Drohne im manuellen Modus gut fliegt. Dazu müssen die richtigen Parametereinstellungen ausgewählt und alle Sensoren kalibriert werden. Die Verwendung einer im Handel erhältlichen Drohne hat mich an dieser Stelle vor den Problemen bewahrt. Ich habe den LPE-Schätzer mit aktiviertem GPS und einem Barometer verwendet:



2. Wenn das System an einem neuen Ort oder zum ersten Mal gestartet wird, sollten Sie warten, bis sich das GPS-Modul „aufgewärmt“ hat. Bei regelmäßiger Arbeit auf der Straße erfasst GPS normalerweise 16 bis 22 Satelliten.



3. Bevor Sie an einen neuen Ort fliegen und die Drohne keinen Punkt hält, sollten Sie den Kompass neu kalibrieren:



Sie sollten einen externen Kompass verwenden und sicherstellen, dass in den Einstellungen die richtige Ausrichtung eingestellt ist:



Wenn alle Einstellungen korrekt vorgenommen wurden, muss die Drohne den Punkt sicher im HOLD-Modus halten und im Position-Modus stabil fliegen.


Nach erfolgreichen Testflügen im manuellen Modus können wir überprüfen, wie unser Programm fly_jmavsim.py auf einer echten Drohne funktioniert: Video .


Eine echte Drohne fliegt nicht so perfekt wie eine virtuelle - aber sie muss auch Befehle von der Tastatur befolgen - in die richtige Richtung fliegen und beim Befehl anhalten.


In diesem Fall können wir anstelle der Tastatursteuerung Computer Vision verwenden, das im nächsten Artikel erläutert wird. Die ersten Balljagdtests sahen ungefähr so ​​aus .


Die Einstellungen unseres Flight Controllers + Programmcodes werden auf dem Github veröffentlicht .

Source: https://habr.com/ru/post/de461887/


All Articles