Eingang zu Aeronet, Folge 4: Finden und Ficken


Heute kombinieren wir ein autonomes Drohnensteuerungsprogramm mit einem Ballerkennungsprogramm, um eine autonome Drohne bereits zu platzen.


In früheren Artikeln haben wir den Start einer autonomen virtuellen und realen Drohne sowie die Entwicklung eines ROS-Knotens untersucht, der die Koordinaten eines Balls im Raum definiert und überträgt . Jetzt werden wir das Drohnensteuerungsprogramm neu gestalten, damit es automatisch versucht, den Ball zu platzen.


Programm zum Ball fliegen


Das zum Ball fliegende Programm basiert auf dem gleichen Geschwindigkeitsregelungszyklus wie im manuellen Regelungsprogramm .
Der Unterschied besteht darin, dass anstelle der Steuertasten von der Tastatur der Geschwindigkeitsvektor der Drohne durch Informationen über die Position des Balls gesteuert wird, die aus dem Thema /baloon_detector/twist .
setvel_forward Geschwindigkeiten und setvel_forward Vektor setvel so eingestellt, dass die Drohne direkt in den Ball flog.
Wenn die Drohne den Ball länger als 0,2 Sekunden nicht sieht, glauben wir, dass wir ihn platzen lassen und die Drohne in den Landemodus versetzen.


Der vollständige Text des Programms ist unten angegeben: (crash_baloon.py)
 #!/usr/bin/env python # coding=UTF-8 # baloon position steering import rospy import mavros import mavros.command as mc from mavros_msgs.msg import State from geometry_msgs.msg import PoseStamped, Twist, Quaternion, TwistStamped 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() baloon_twist = TwistStamped() def state_callback(data): global current_state current_state=data def localpose_callback(data): global current_pose current_pose = data def baloon_callback(data): global baloon_twist baloon_twist = data def publish_setvel(event): global current_pose, setvel_pub, setvel, setvel_forward, baloon_twist 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, baloon_twist rospy.init_node("offbrd",anonymous=True) rate=rospy.Rate(10) state=rospy.Subscriber("/mavros/state",State,state_callback) pose_sub=rospy.Subscriber("/mavros/local_position/pose",PoseStamped,localpose_callback) baloon_sub=rospy.Subscriber("/baloon_detector/twist",TwistStamped,baloon_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) 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 not rospy.is_shutdown(): time_delay = rospy.Time.now().to_sec() - baloon_twist.header.stamp.to_sec() #print baloon_twist print 'time delay = ',time_delay if time_delay<0.2:#    0.2   if baloon_twist.twist.linear.x > 0.8: setvel_forward = 1.5 elif baloon_twist.twist.linear.x > 0.8: setvel_forward = 0.0 else: setvel_forward = -0.5 setvel.angular.z = baloon_twist.twist.angular.z*4 if baloon_twist.twist.angular.y<0: setvel.linear.z=0.5 elif baloon_twist.twist.angular.y>0.2: setvel.linear.z=-0.25 else: setvel.linear.z=0 else:#    setvel.angular.z=setvel_forward=setvel.linear.z=0 print setvel, setvel_forward rate.sleep() set_mode(0,"AUTO.LAND") print 'Landing.......\r' setvel_timer.shutdown() rospy.sleep(5) if __name__=="__main__": main() 

Debugging-Empfehlungen


Zum Debuggen empfehlen wir, einen offenen Raum zu wählen, den Ball an der Basis zu befestigen und sicherzustellen, dass sich keine roten Objekte in der Nähe befinden, damit das Führungsprogramm keine Fehlalarme enthält.
Die Funktionsweise des Führungsprogramms vor dem Flug sollte mit einem Browser unter 192.168.11.1:8080 überprüft werden:


Wenn alles richtig konfiguriert ist, muss das Programm den Ball sicher unterscheiden und darf keine Fehlalarme verursachen.


Zu Beginn des Führungsprogramms sollte die Drohne den Ball nach dem Start sehen. Andernfalls denkt die Drohne, dass der Ball bereits geplatzt ist, und wechselt in den Landemodus.
In Zukunft können Sie das Programm ändern - zum Beispiel mit dem AUTO.MISSION-Modus zum Ball fliegen. Wechseln Sie nach Erreichen des gewünschten GPS-Punkts in den visuellen Suchmodus.
Die Auswahl der Koeffizienten für Geschwindigkeiten im Hauptzyklus des Programms erfolgt experimentell für eine bestimmte Drohne.


Bei Wettbewerben sahen die Versuche, den Ball zu platzen, folgendermaßen aus:



Ich wäre dankbar für Kommentare und Fragen von denen, die versuchen, unser Experiment zu wiederholen.


Quellcodes für die Programme werden auf Github hochgeladen .

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


All Articles