Inhaltsverzeichnis:

ROS MoveIt Roboterarm Teil 2: Robotersteuerung - Gunook
ROS MoveIt Roboterarm Teil 2: Robotersteuerung - Gunook

Video: ROS MoveIt Roboterarm Teil 2: Robotersteuerung - Gunook

Video: ROS MoveIt Roboterarm Teil 2: Robotersteuerung - Gunook
Video: 20180805 Control KUKA manipulator vis ROS MoveIt 2024, November
Anonim
Image
Image

github.com/AIWintermuteAI/ros-moveit-arm.git

Im vorherigen Teil des Artikels haben wir URDF- und XACRO-Dateien für unseren Roboterarm erstellt und RVIZ gestartet, um unseren Roboterarm in einer simulierten Umgebung zu steuern.

Diesmal machen wir es mit dem echten Roboterarm! Wir werden den Greifer hinzufügen, eine Robotersteuerung schreiben und (optional) den IKfast Inverse Kinematics Solver generieren.

Geronimo!

Schritt 1: Hinzufügen des Greifers

Hinzufügen des Greifers
Hinzufügen des Greifers
Hinzufügen des Greifers
Hinzufügen des Greifers
Hinzufügen des Greifers
Hinzufügen des Greifers

Das Hinzufügen eines Greifers war anfangs etwas verwirrend, daher habe ich diesen Teil im vorherigen Artikel übersprungen. Es stellte sich heraus, dass es doch nicht so schwer war.

Sie müssen Ihre URDF-Datei ändern, um Greiferlinks und Gelenke hinzuzufügen.

Die modifizierte URDF-Datei für meinen Roboter ist diesem Schritt beigefügt. Im Grunde folgt es der gleichen Logik wie der Armteil, ich habe gerade drei neue Links (claw_base, claw_r und claw_l) und drei neue Gelenke hinzugefügt (Joint5 ist fest und Joint6, Joint7 sind Drehgelenke).

Nachdem Sie Ihre URDF-Datei geändert haben, müssen Sie auch das von MoveIt generierte Paket und die xacro-Datei mit dem MoveIt-Setup-Assistenten aktualisieren.

Starten Sie den Setup-Assistenten mit dem folgenden Befehl

roslaunch moveit_setup_assistant setup_assistant.launch

Klicken Sie auf Vorhandene MoveIt-Konfiguration bearbeiten und wählen Sie den Ordner mit Ihrem MoveIt-Paket.

Fügen Sie einen neuen Planungsgruppengreifer (mit Gliedern und Gelenken für den Greifer) und auch einen Endeffektor hinzu. Meine Einstellungen sind in den Screenshots unten. Beachten Sie, dass Sie für den Greifer keinen Kinematik-Solver auswählen, dies ist nicht erforderlich. Generieren Sie das Paket und überschreiben Sie die Dateien.

Lauf

Kätzchen machen

Befehl in Ihrem catkin-Arbeitsbereich.

Okay, jetzt haben wir einen Arm mit Greifer!

Schritt 2: Aufbau des Arms

Den Arm bauen
Den Arm bauen
Den Arm bauen
Den Arm bauen
Den Arm bauen
Den Arm bauen
Den Arm bauen
Den Arm bauen

Wie ich bereits erwähnt habe, wurde das 3D-Modell des Arms von Jürgenlessner erstellt, vielen Dank für eine großartige Arbeit. Die detaillierte Montageanleitung finden Sie, wenn Sie dem Link folgen.

Allerdings musste ich die Steuerung ändern. Ich verwende Arduino Uno mit Sensorschild zur Steuerung von Servos. Die Sensorabschirmung hilft sehr bei der Vereinfachung der Verkabelung und erleichtert auch die externe Stromversorgung von Servos. Ich verwende ein 12V 6A Netzteil, das über ein Step-Down-Modul (6V) an das Sensorschild angeschlossen ist.

Ein Hinweis zu Servos. Ich benutze MG 996 HR Servos von Taobao gekauft, aber die Qualität ist wirklich schlecht. Es ist definitiv ein billiger chinesischer Abklatsch. Der für das Ellenbogengelenk lieferte nicht genug Drehmoment und fing sogar unter starker Belastung einmal an zu rauchen. Ich musste das Ellbogengelenk-Servo durch MG 946 HR von einem besseren Hersteller ersetzen.

Lange Rede, kurzer Sinn - kaufen Sie hochwertige Servos. Wenn magischer Rauch aus Ihren Servos kommt, verwenden Sie bessere Servos. 6V ist eine sehr sichere Spannung, erhöhen Sie sie nicht. Es erhöht das Drehmoment nicht, kann aber die Servos beschädigen.

Verkabelung für Servos wie folgt:

Basis 2

Schulter2 4Schulter1 3

Ellbogen 6

Greifer 8

Handgelenk 11

Fühlen Sie sich frei, es zu ändern, solange Sie auch daran denken, die Arduino-Skizze zu ändern.

Nachdem Sie mit der Hardware fertig sind, werfen wir einen Blick auf das Gesamtbild!

Schritt 3: MoveIt RobotCommander-Schnittstelle

MoveIt RobotCommander-Schnittstelle
MoveIt RobotCommander-Schnittstelle

Also, was nun? Warum braucht man MoveIt und ROS überhaupt? Können Sie den Arm nicht einfach direkt über Arduino-Code steuern?

Ja, du kannst.

Okay, wie wäre es nun mit GUI- oder Python/C++-Code, um Roboterpose bereitzustellen, zu der Sie gehen können? Kann Arduino das?

Irgendwie. Dazu müssen Sie einen Solver für inverse Kinematik schreiben, der eine Roboterpose (Translations- und Rotationskoordinaten im 3D-Raum) annimmt und in Gelenkwinkelnachrichten für Servos umwandelt.

Obwohl Sie es selbst tun können, ist es eine Menge Arbeit. MoveIt und ROS bieten also eine schöne Schnittstelle für den IK-Solver (inverse kinematics), um all die schweren trigonometrischen Hebevorgänge für Sie zu erledigen.

Kurze Antwort: Ja, Sie können einen einfachen Roboterarm erstellen, der eine hartcodierte Arduino-Skizze ausführt, um von einer Pose zur anderen zu gelangen. Aber wenn Sie Ihren Roboter intelligenter machen und Computer-Vision-Funktionen hinzufügen möchten, sind MoveIt und ROS der richtige Weg.

Ich habe ein sehr vereinfachtes Diagramm erstellt, das erklärt, wie das MoveIt-Framework funktioniert. In unserem Fall wird es noch einfacher, da wir kein Feedback von unseren Servos haben und das Thema /joint_states verwenden, um der Robotersteuerung die Winkel für Servos bereitzustellen. Uns fehlt nur eine Komponente, nämlich die Robotersteuerung.

Auf was warten wir? Lassen Sie uns einige Robotersteuerungen schreiben, damit unser Roboter … Sie wissen schon, kontrollierbarer wäre.

Schritt 4: Arduino-Code für Robotersteuerung

Arduino-Code für Robotersteuerung
Arduino-Code für Robotersteuerung
Arduino-Code für Robotersteuerung
Arduino-Code für Robotersteuerung
Arduino-Code für Robotersteuerung
Arduino-Code für Robotersteuerung

In unserem Fall ist Arduino Uno, auf dem ein ROS-Knoten mit Rosserial ausgeführt wird, die Robotersteuerung. Der Arduino-Skizzencode ist diesem Schritt beigefügt und auch auf GitHub verfügbar.

Der auf Arduino Uno ausgeführte ROS-Knoten abonniert grundsätzlich das /JointState-Thema, das auf dem Computer veröffentlicht wurde, auf dem MoveIt ausgeführt wird, und wandelt dann die Gelenkwinkel aus dem Array von Radiant in Grad um und übergibt sie mit der Standardbibliothek Servo.h an Servos.

Diese Lösung ist etwas hackig und nicht wie bei Industrierobotern. Idealerweise veröffentlichen Sie den Bewegungsverlauf zum Thema /FollowJointState und erhalten dann das Feedback zum Thema /JointState. Aber in unserem Arm können die Hobby-Servos kein Feedback liefern, also abonnieren wir direkt das /JointState-Thema, das vom FakeRobotController-Knoten veröffentlicht wird. Grundsätzlich gehen wir davon aus, dass alle Winkel, die wir an Servos übergeben haben, ideal ausgeführt werden.

Weitere Informationen zur Funktionsweise des Rosserials finden Sie in den folgenden Tutorials

wiki.ros.org/rosserial_arduino/Tutorials

Nachdem Sie die Skizze auf Arduino Uno hochgeladen haben, müssen Sie sie mit dem seriellen Kabel an den Computer anschließen, auf dem Ihre ROS-Installation ausgeführt wird.

Um das gesamte System aufzurufen, führen Sie die folgenden Befehle aus

roslaunch my_arm_xacro demo.launch rviz_tutorial:=true

sudo chmod -R 777 /dev/ttyUSB0

rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0 _baud:=115200

Jetzt können Sie in RVIZ interaktive Marker verwenden, um den Roboterarm in eine Pose zu bewegen und dann auf Planen und Ausführen drücken, damit er sich tatsächlich in die Position bewegt.

Magie!

Jetzt können wir Python-Code für unseren Rampentest schreiben. Naja fast…

Schritt 5: (Optional) Generieren des IKfast-Plug-Ins

Standardmäßig schlägt MoveIt vor, den KDL-Kinematik-Solver zu verwenden, der mit weniger als 6 DOF-Armen nicht wirklich funktioniert. Wenn Sie dieses Tutorial genau verfolgen, werden Sie feststellen, dass das Armmodell in RVIZ einige Posen nicht annehmen kann, die von der Armkonfiguration unterstützt werden sollten.

Die empfohlene Lösung besteht darin, einen benutzerdefinierten kinematischen Solver mit OpenRave zu erstellen. Es ist nicht so schwierig, aber Sie müssen es und seine Abhängigkeiten aus dem Quellcode erstellen oder den Docker-Container verwenden, je nachdem, was Sie bevorzugen.

Die Vorgehensweise ist in diesem Tutorial sehr gut dokumentiert. Es wurde bestätigt, dass es auf VMs mit Ubuntu 16.04 und ROS Kinetic funktioniert.

Ich habe den folgenden Befehl verwendet, um den Solver zu generieren

openrave.py --database inversekinematics --robot=arm.xml --iktype=translation3d --iktests=1000

und dann rannte

rosrun moveit_kinematics create_ikfast_moveit_plugin.py test_robot arm my_arm_xacro ikfast0x1000004a. Translation3D.0_1_2_f3.cpp

zum Generieren des MoveIt IKfast-Plug-Ins.

Das ganze Verfahren ist etwas zeitaufwändig, aber nicht sehr schwierig, wenn Sie das Tutorial genau befolgen. Bei Fragen zu diesem Teil meldet euch bitte in den Kommentaren oder per PN bei mir.

Schritt 6: Der Rampentest

Der Rampentest!
Der Rampentest!
Der Rampentest!
Der Rampentest!

Jetzt können wir den Rampentest ausprobieren, den wir mit der ROS MoveIt Python API ausführen werden.

Der Python-Code ist an diesen Schritt angehängt und auch im Github-Repository verfügbar. Wenn Sie keine Rampe haben oder einen anderen Test versuchen möchten, müssen Sie die Roboterposen im Code ändern. Dafür zuerst ausführen

rostopisches Echo /rviz_moveit_motion_planning_display/robot_interaction_interactive_marker_topic/feedback

im Terminal, wenn RVIZ und MoveIt bereits ausgeführt werden. Bewegen Sie dann den Roboter mit interaktiven Markern an die gewünschte Position. Die Positions- und Orientierungswerte werden im Terminal angezeigt. Kopieren Sie sie einfach in den Python-Code.

So führen Sie den Rampentestlauf durch

rosrun my_arm_xacro pick/pick_2.py

RVIZ und Rosserial-Knoten laufen bereits.

Bleiben Sie dran für den dritten Teil des Artikels, in dem ich eine Stereokamera zur Objekterkennung verwenden und eine Pick-and-Place-Pipeline für einfache Objekte ausführen werde!

Empfohlen: