Jeffrey Cross
Jeffrey Cross

Programm mit Roboterbetriebssystem für sanfte Servobewegungen

Robot Operating System (ROS) ist eine Open-Source-Plattform für Robotik, mit der Ihr Roboter die Welt visualisieren, kartieren und navigieren sowie physische Interaktionen mit Hilfe modernster Algorithmen durchführen kann. Wenn Sie einen komplexen Roboter bauen möchten, stehen möglicherweise ROS-Codes zur Verfügung, die Ihnen helfen. Sie können so wenig von ROS verwenden, wie Sie möchten, und es wird auf Maschinen ab der Raspberry Pi-Ebene installiert.

Lesen Sie hier die Artikel aus dem Magazin Machen:. Sie haben noch kein Abonnement? Holen Sie sich heute eine.

Betrachten wir, wie man ein Servo als Einführung in ROS steuert. Ein Nachteil von Servomotoren ist, dass sie oft so schnell wie möglich laufen, um Ihrem Befehl zu gehorchen. Dies kann dazu führen, dass Ihr Roboter umkippt, weil er plötzlich mit Höchstgeschwindigkeit zu drehen begann. Sobald wir ROS zur Steuerung des Servos erhalten, können wir eine sinusartige Steuerung hinzufügen, um Ihren Roboter ruhig zu halten. Sie können dies in ROS tun, ohne den Steuercode oder den Code, der das Servo für ROS verfügbar macht, oder die Servohardware selbst zu ändern. Und Sie können den Code in Zukunft problemlos für andere Projekte wiederverwenden!

ROS unterstützt die Installation auf Ubuntu oder Debian sehr gut, so dass Sie nicht kompilieren müssen, um loszulegen. Dieser Build verwendet eine Linux-Maschine, auf der Ubuntu ausgeführt wird, ein Hobby-Servo, ein Arduino und ein paar kleine Kabel wie Verbindungskabel. ROS wird auf dem Ubuntu-Computer ausgeführt und die Meldungen werden über USB an den Arduino gesendet. Nachdem Sie die binären ROS-Pakete installiert haben, teilen Sie Ihrer Arduino-Umgebung die ROS-Bibliotheken mit, indem Sie die folgenden Befehle in einem Konsolenprogramm eingeben (z. B. gnome-terminal oder konsole): cd ~ / sketchbook / libraries rm -rf ros_lib rosrun rosserial_arduino make_l ibraries.py.

Programmieren Sie den Arduino

Foto von Hep Svadja

Jetzt können wir eine Skizze in ein Arduino hochladen, um die Low-Level-Servosteuerung durchzuführen und von der Linux-Maschine aus zu steuern. Dadurch wird ein Servo an einen Ort verschoben, der als Prozentsatz (0,0 bis 1,0) der vollen Bewegung angegeben ist, die wir zulassen möchten. Durch die Verwendung eines Prozentwerts anstelle eines expliziten Winkels kann der Arduino-Code den exakten Winkel einschränken, der eingestellt werden kann, um explizit Winkel zu vermeiden, von denen Sie wissen, dass sie eine Kollision verursachen.

Wie Sie sehen, werden die normalen Setup- und Loop-Funktionen bei Verwendung von ROS recht spärlich. Die Schleifenfunktion kann für jeden Arduino-Code, der gerade Daten abonniert, gleich sein. Im Setup müssen Sie ROS initialisieren und dann für jeden ROS-Nachrichtenteilnehmer, den Sie haben, ein Abonnement aufrufen. Jeder Abonnent benötigt RAM auf Ihrem Arduino, sodass Sie möglicherweise nur 6-12 davon haben, je nachdem, was Ihre Skizze noch tun muss.

#umfassen #umfassen #umfassen #umfassen #define SERVOPIN 3 Servo Servo; void servo_cb (const std_msgs :: Float32 & msg) {const float min = 45; const float range = 90; float v = msg.data; wenn (v> 1) v = 1; wenn (v <0) v = 0; Schwimmwinkel = min + (Bereich * v); servo.write (Winkel); } ros :: Abonnent sub ("/ head / tilt", servo_cb); ros :: NodeHandle nh; void setup () {servo.attach (SERVOPIN); nh.initNode (); nh.subscribe (sub); } void loop () {nh.spinOnce (); Verzögerung (1); }

Jetzt müssen Sie in der Lage sein, mit dem Arduino aus der ROS-Welt zu sprechen. Am einfachsten ist dies mit einer Roboter-Startdatei. Während die unten stehende Datei sehr einfach ist, können diese andere Startdateien enthalten, sodass Sie einen sehr komplexen Roboter mit einem einzigen Befehl starten können.

$ cat rosservo.launch $ roslaunch ./rosservo.lanch

Mit dem Befehl rostopic können Sie sehen, wohin Sie ROS-Nachrichten an Ihren Roboter senden können. Wie Sie unten sehen können, die /Kopfneigung ist im Arduino erhältlich. Eine Nachricht kann mit gesendet werden rostopisch pub bedeutet die Option -1, die Nachricht nur einmal zu veröffentlichen, und wir möchten mit sprechen /Kopfneigung Senden einer einzelnen Gleitkommazahl.

$ rostopic list / diagnose / kopf / neigung / rosout / rosout_agg $ rostopic pub -1 / kopf / neigung std_msgs / Float32 0.4 $ rostopic pub -1 / kopf / neigung std_msgs / Float32 0.9

Zu diesem Zeitpunkt kann alles, was weiß, wie man eine Nummer in ROS veröffentlicht, zur Steuerung des Servos verwendet werden. Wenn wir uns von 0 auf 1 bewegen, läuft der Servo mit voller Geschwindigkeit, was an sich schon in Ordnung ist, aber wir möchten, dass der Motor auf volle Geschwindigkeit beschleunigt und dann verlangsamen wenn es sich der Zielposition nähert. Weniger plötzliche Bewegung, weniger ruckartige Roboterbewegung, weniger Überraschung für die Menschen in der Umgebung.

Glatt mit einem anderen Knoten

Das untenstehende Python-Skript hört auf Nachrichten / kopf / neigung / glatt und veröffentlicht viele Nachrichten an /Kopfneigung Bewegen Sie das Servo mit einer langsamen Rampe und einer Rampe nach unten, wenn Sie sich der gewünschten Position nähern. Das moveServo_cb wird aufgerufen, wenn eine Nachricht ankommt / kopf / neigung / glatt. Der Rückruf generiert dann für jeweils 10 Grad eine Zahl von -90 bis +90 in das Winkel-Array. Das Sünde() wird für diese Winkel genommen, die Werte ergeben, die langsam von -1 bis +1 reichen. Wenn Sie 1 hinzufügen, wird der Bereich von 0 bis +2. Wenn Sie also durch 2 dividieren, steigt unser Array von 0 auf +1. Dann müssen Sie durch das m-Array gehen und jedes Mal eine Nachricht veröffentlichen, wobei Sie sich jedes Mal etwas weiter durch den Bereich r bewegen und bei 1 * r oder dem gesamten Bereich enden.

#! / usr / bin / env python from time import sleep numpy als np import rospy aus std_msgs.msg importieren Float32 currentPosition = 0.5 pub = Keine def moveServo_cb (data): globale currentPosition, pub targetPosition = data.data r = targetPosition - curren tPositionswinkel = np.array ((Bereich (1 90)) [0 :: 10]) - 90 m = (np.sin (Winkel * np.pi / 180.) + 1) / 2 für mi in np. nditer (m): pos = currentPosition + mi * r print "pos:", pos pub.publish (pos) sleep (0.05) currentPosition = targetPosi tion print "pos-e:", currentPos ition pub.publish (currentPosition) def Listener (): global pub rospy.init_node ('servoencod er', anonymous = True) rospy.Subscriber ('/ head / til t / smooth', Float32, moveSer vo_cb) pub = rospy.Publisher ('/ head / tilt ', Float32, Warteschlangengröße = 10) rospy.spin () wenn __name__ ==' __main__ ': listener ()

Starten Sie zum Testen der reibungslosen Servobewegung das Python-Skript, und veröffentlichen Sie Ihre Nachrichten an / kopf / neigung / glatt und Sie sollten eine glattere Bewegung sehen.

$ ./servoencoder.py $ rostopic pub -1 / Kopf / Neigung / glatt std_msgs / Float32 1 $ rostopic pub -1 / Kopf / Neigung / glatt std_msgs / Float32 0

Sie können auch den Namen von Dingen in ROS neu zuordnen. Auf diese Weise können Sie neu zuordnen / kopf / neigung / glatt sein /Kopfneigung und das Programm, das den Servo befiehlt, wird nicht einmal wissen, dass die Sinusbewegung verwendet wird.

Weitergehen

Ich habe mich hier auf die einfache Servosteuerung konzentriert, aber ROS unterstützt noch viel mehr. Wenn Sie wissen möchten, was Ihren Roboter am Bewegen hindert, gibt es bereits Unterstützung für die Verwendung eines Kinect in ROS. Selbst wenn der Navigationsstapel diese Daten für das Mapping verwendet, können Sie auch ein kleines Python-Skript speisen, das ein Servo bewegt, um das dem Roboter nächstgelegene Objekt zu verfolgen. Ja, die Augen folgen dir wirklich.

Zwei meiner ROS-Projekte sind Terry und Houndbot. Terry ist ein Indoor-Roboter mit zwei Kinects, von denen einer ausschließlich für die Navigation verwendet wird, der andere für die Tiefenkartierung, wie ich es für richtig halte. Mit seinen sechs Arduinos kann Terry über ein ROS-gestütztes Web-Interface oder direkt über die PS3-Fernbedienung gesteuert werden.

Ich habe den Houndbot für den Außenbereich entworfen. Es verfügt über eine RC-Fernbedienung, GPS, Kompass und ROS-gesteuerte Ohren. Ich arbeite daran, eine PS4-Eye-Twin-Kamera für die Navigation zu verwenden. Ein Kinect kann nicht verwendet werden, da die Sonne das verhindert. Da der Hund etwa 20 kg wiegt, habe ich die Aufhängung vor kurzem verbessert, was dazu führte, dass ich benutzerdefinierte Legierungsteile herstellte.

Ressourcen des Roboterbetriebssystems

Installation auf Ubuntu Tauchen Sie ein in die Welt der Navigation mit ROS ROS Q & A Holen Sie sich eines der vielen Bücher über ROS Holen Sie sich Ihren Roboterarm mit ROS & MoveIt in Bewegung! Führen Sie den NASA-GM Robonaut2 in einem Simulator aus. ROS ist da oben!

Aktie

Leave A Comment