Zurück zu Guides

ROS2 und MoveIt2 Roboternarm-Integration: Ein praktisches Leitfaden

Wie man einen Roboterarm mit ROS2 und MoveIt2 <unk> URDF-Setup, ros2_control, Bewegungsplanung und Teleoperationsservo-Modus integriert.

[← Führer]

Ein Schritt für Schritt Durchgang für Armintegration mit ROS2 Humble und MoveIt2, von URDF-Autoren über die Live-Kartesian Servo-Steuerung.

Voraussetzungen

Dieser Leitfaden zielt auf Ubuntu 22.04 LTS mit ROS2 Humble Hawksbill (EOL Mai 2027), Python 3.10 und die MoveIt2 binäre Version für Humble ab. Installieren Sie den vollständigen Desktop-Stack, bevor Sie weitermachen:

  • ROS2 Humble Desktop-Full: T1 enthält rviz2, rqt und alle Kernbibliotheken.
  • MoveIt2: T2 zieht in moveit_core, moveit_ros_planning, moveit_ros_move_group, und alle Planner Plugins.
  • ros2_control: T3 für die Hardwareabstraktion obligatorisch.
  • Python-Pakete: T4 für kinematische Hilfsprogramme, die in den Tutorial-Snippets verwendet werden.
  • ** Kolk:** T5 für die Erstellung Ihrer maßgeschneiderten Pakete.

Überprüfen Sie Ihre Umgebung: T6 sollte keine Fehler zeigen. Wenn Sie auf einem einzigen Computer Warnungen über die "Netzwerkkonfiguration" sehen, exportieren Sie T7, um Multicast-Probleme zu vermeiden.

Einrichtung der URDF

Das **Unified Robot Description Format (URDF) ** ist die einzige Quelle der Wahrheit für die Kinematik, Dynamik und Hardware-Schnittstelle Ihres Arms.

Gelenkgrenzen sind das erste, was richtig ist. Weicher Grenzen (die MoveIt2 für die Planung verwendet) sollten 5° innerhalb der harten Grenzen sein (die von der Firmware für den Notfallstop verwendet wird). Wenn die J2-Hardware-Grenze Ihres Arms -120° bis -120° ist, setzen Sie die URDF T8 und T9 (±120° in Radianen) und setzen Sie dann MoveIt2 Gelenkgrenzen auf ±117° in T10.

Inertientensoren sind häufig falsch und verursachen instabile Simulationsdynamik. Für eine Verbindung mit einer Masse von m, die als Zylinder von Radius r und Länge L geschätzt wird, verwenden Sie T11, T12, T13. Off-diagonale Begriffe sind für symmetrische Verbindungen Null. Fehlende Trägheit (z. B. All-Null- oder Platzhalterwerte) wird dazu führen, dass die Gazebo-Physik explodiert und den Kollisionsprüfer von MoveIt2 unvorhersehbar verhalten lässt.

Visuelle gegen Kollisionsgeometrie: Verwenden Sie Hochpolymeres (DAE/OBJ) für visuelle Tags und vereinfachte konvexe Rumpfmesse für Kollisions-Tags. Der FCL-Kollisionsprüfer von MoveIt2 läuft zur Planungszeit gegen die Kollisionsgeometrie Überdetaillierte Meshen erhöhen die Planungszeit 510×. Generieren Sie konvexe Rumpfmassen mit T14.

Der ros2_control-Hardware-Schnittstelle-Tag muss im T15-Element Ihres URDF erscheinen. Dieser Tag erklärt den Typ der Steuerungsschnittstelle und die Pluginklasse für Ihren Hardware-Treiber:

  • Hardware-Plugin: Setzen Sie auf Ihren Treiber, z.B. T16 für [OpenArm]T60) Arme.
  • Befehlschnittstelle: Anzeigen Sie T17 für die Positionssteuerung.
  • Studio-Interface: Deklarieren Sie immer T20 und T21. Fügen Sie T22 hinzu, wenn die Hardware Drehmoment-Feedback bereitstellt.
  • Param-Tag: Durchschreiten Sie hardware-spezifische Parameter (z. B. Serienport, baudrate, Roboter-IP) durch Param-Tags im Hardware-Element.

Die Kernkonzepte von MoveIt2

Wenn Sie diese vier Konzepte verstehen, bevor Sie eine einzige Zeile Planungscode schreiben, werden Sie Stunden an Fehlerbehebung sparen.

MoveGroup ist die hochrangige Planungsoberfläche. Sie umfasst die Planungsleitung, die Planungsszene und den Ausführungsmanager. Sie interagieren mit ihr über die Klasse T23 C++ oder den Python-Wrapper. Eine MoveGroup wird für eine benannte Gruppe in Ihrem SRDF definiert (z.B. "Arm", "Greifer") und fungiert als Eingangspunkt für alle Planungsanfragen.

Planning Pipeline verknüpft ein Planner-Plugin mit optionalen Pre-/Post-Processing-Adaptern. MoveIt2 liefert drei Planner-Backends wählen Sie je nach Aufgabe:

Planner Best For Limitations
OMPL (default) General-purpose, cluttered environments, no dynamics needed Non-deterministic; replanning may give different paths
CHOMP Smooth, gradient-optimized trajectories Can get stuck in local minima; slow in tight spaces
PILZ Industrial Motion Planner Deterministic LIN/PTP/CIRC industrial moves No obstacle avoidance; requires clear workspace

** Planungsszene** ist eine Live-Durchführung der Umgebung in 3D. Sie beginnt von Ihrem URDF und wird zur Laufzeit mit Kollisionsobjekten (Kisten, Kugeln, Meshen) aktualisiert, die über den T25 hinzugefügt werden. Fügen Sie immer Ihren Tisch, das Feststellungsstück und bekannte Hindernisse zur Szene hinzu, bevor Sie MoveIt2 Pläne durch freien Raum planen, nicht um unbekannte Objekte.

** Beschränkungsplanung:** MoveIt2 unterstützt Pfadbeschränkungen (z.B. halten Sie den End-Effektor während der Bewegung aufrecht), Gelenkbeschränkungen, Positionsbeschränkungen und Orientierungsbeschränkungen. Beschränkungen sind im T26 angegeben. Bei einfacher Orientierungskontrolle (z. B. bei Bewegung halten Sie die Griffe auf der Ebene), funktioniert eine Orientierungskontrolle mit Toleranz von ± 10° um die Achsen der Schalt- und Rollschraube zuverlässig.

Das Handbuch für die Bewegungsplanung

Dieser vier-Schritt-Workflow führt Sie von einem neuen Terminal zu einem kollizierten kartesischen Pfad.

Stupe 1 Launch die Demo: T28 bringt rviz2 mit dem Panda-Demo-Arm auf. Wechseln Sie die Startdatei für das MoveIt2-Konfigurationspaket Ihres eigenen Arms (generiert durch den MoveIt2-Setup-Assistenten).

Schritt 2 Setzen Sie Planungsszene: Veröffentlichen Sie eine T29 Nachricht auf T30. Fügen Sie ein Feld hinzu, das Ihren Arbeitstisch in der richtigen Posen darstellt. Bestätigen Sie, dass es in rviz2 "Planungsszene" -Anzeige angezeigt wird, bevor Sie weitermachen.

Schritt 3 Planen Sie einen kartesianischen Weg: Verwenden Sie T31, wo T32 einen Wegpunkt pro Zentimeter Endefektorreise bedeutet. Ein Rücklaufwert von 1.0 bedeutet, dass 100% des Weges berechnet wurde. Werte unter 0,9 bedeuten in der Regel, dass eine gemeinsame Grenze oder eine Kollision in der Mitte des Weges getroffen wurde Anpassen Sie Ihre Wegpunkte oder entspannen Sie die Beschränkung.

Schritt 4 Durchführen mit Kollisionsprüfung: Rufen Sie T33 an, der die Strecke durch den Streckexekutionsmanager durchläuft. Der Manager streamt gemeinsame Befehle zu ros2_control bei der konfigurierten Frequenz (typischerweise 250500 Hz). Wenn eine Kollision während der Ausführung durch die überwachte Planungsszene erkannt wird (erfordert den Streck des T34-Szene-Updates), wird MoveIt2 die Strecke abbrechen.

Teleoperationsservo-Modus

moveit_servo ermöglicht die Kartezische Geschwindigkeitssteuerung in Echtzeit ohne Umplanung. Es akzeptiert T35 Nachrichten bei bis zu 100 Hz und erzeugt kontinuierlich gemeinsame Geschwindigkeitsbefehle, die die gewünschte End-Effektorgeschwindigkeit verfolgen, unter Berücksichtigung gemeinsamer Grenzen und der Vermeidung von Singularität.

Um den Servo-Modus für den Arm zu starten, fügen Sie den Servo-Knoten mit der Servo-Konfiguration YAML in die Startdatei hinzu.

  • bewegen_Gruppenname: Die Planungsgruppe zu servo muss dem Namen Ihrer SRDF-Gruppe entsprechen.
  • Cartesian_command_in_topic: Standard T36. Veröffentlichen Sie T37 hier bei 50100 Hz.
  • joint_command_out_topic: Ausgang T38 weitergeleitet an ros2_control.
  • incoming_command_timeout: Setzt auf 0,1 s. Wenn innerhalb dieses Fensters kein Befehl empfangen wird, stoppt servo den Arm eine kritische Sicherheitsfunktion für Teleop.
  • niedrigere_Singularität_Schwelle / harte_stop_singularität_Schwelle: Setzen Sie auf 17 und 30 (Bedingungsnummerschwellen). Der Arm wird sich verlangsamen und dann stoppen, wenn er sich der Singularität nähert.

Für Teleoperationsdaten-Sammlung veröffentlichen Sie Twist-Befehle, die von Ihrem Eingangseinrichtung (VR-Controller, SpaceMouse oder Handschuh) abgeleitet werden, bei einer konstanten 100 Hz. Jitter in der Befehlsfrequenz verursacht Geschwindigkeitsunterbrochenheiten, die die Demonstrationsqualität schwächen.

Häufige Probleme und Lösungen

  • Kontroller Timing / "Trajektorie point is not strictly increasing": Stellen Sie sicher, dass Ihre Hardware-Schnittstelle T39 (nicht T40) für position-controlled Arme implementiert. Geschwindigkeitsschnittstellen erfordern eine genaue Timing, die USB-basierte Arme nicht garantieren können.
  • Verstöße gegen die Grenzwerte während der Planung: Ein Sicherheitsgrenz von 5° (0,0873 rad) in T41 durch Einstellung von T42 und T43 innerhalb der Festgrenzen angewendet wird. Dies verhindert, dass der Planer Träger erzeugt, die die Grenzschalter der Hardware mitten in der Ausführung auslösen.
  • Unstabile Dynamik in der Simulation: Falsche URDF-Inerzienwerte sind die häufigste Ursache.
  • MoveGroup versagt bei der Verbindung: Überprüfen Sie, ob der Move_group-Knode ausgeführt wird (T45) und dass Ihr RMW (Standard Cyclone DDS) die gleiche Domain-ID wie Ihre anderen Knoten hat. Setzen Sie T46 konsequent.
  • Servo produziert eine schlagkräftige Bewegung: Stellen Sie sicher, dass Ihre Servo-Befehlsschleife mit einer festen Geschwindigkeit läuft.

Referenz für Schlüsselpakete

Package Purpose Install
moveit_servo Real-time Cartesian servo / teleop Included in ros-humble-moveit
moveit_planners_ompl OMPL sampling-based planners Included in ros-humble-moveit
moveit_visual_tools rviz2 debugging markers and trajectory visualization ros-humble-moveit-visual-tools
joint_state_broadcaster Broadcasts /joint_states from ros2_control ros-humble-ros2-controllers
robot_state_publisher Publishes TF tree from URDF + joint states ros-humble-robot-state-publisher
moveit_ros_perception OctoMap integration for 3D obstacle avoidance Included in ros-humble-moveit

OpenArm 1 MoveIt2 Konfiguration

Die OpenArm 1 Schiffe mit vorgebauter MoveIt2 Konfiguration, aber das Verständnis der Struktur hilft bei der Anpassung für Ihre Aufgaben.

  • URDF/XACRO: T49 definiert 6 Revolt-Gelenke + 1 prismatische Griffgelenke. Gelenke-Grenzen werden innerhalb von Hardware-Grenzen 5 Grad festgelegt. Inertia-Tensoren werden aus CAD-Modellen berechnet.
  • SRDF: T50 definiert die "Arm" Planungsgruppe (Glied 1-6) und die "Greifer" Gruppe (Greifer-Glied). Zwei benannte Posen: "Home" (alle Nullen) und "ready" (Glied bei [0, -0.5, 0.7, 0, 0.8, 0] rad).
  • joint_limits.yaml: Geschwindigkeitsgrenzen für die Sicherheit bei der Telebetriebsführung auf 1,0 rad/s gesetzt.
  • kinematics.yaml: Standard-KDL-Lösung. Für Aufgaben, bei denen IK in der Nähe der Singularität erforderlich ist, wechseln Sie zu T51: T52 und aktualisieren Sie kinematics.yaml.

Python MoveGroupInterface Beispiel

Ein vollständiges Python-Beispiel, das eine Pick-and-Place-Sequenz mit der MoveIt2 Python API plant und ausführt:

#!/usr/bin/env python3
"""MoveIt2 pick-and-place example for OpenArm 1."""
import rclpy
from rclpy.node import Node
from moveit2 import MoveIt2
from geometry_msgs.msg import PoseStamped
import numpy as np

class PickPlace(Node):
    def __init__(self):
        super().__init__("pick_place")
        self.moveit2 = MoveIt2(
            node=self,
            joint_names=[f"joint_{i}" for i in range(1, 7)],
            base_link_name="base_link",
            end_effector_name="gripper_link",
            group_name="arm",
        )
        # Wait for MoveIt2 to be ready
        self.moveit2.wait_for_execution(timeout=10.0)

    def execute(self):
        # 1. Move to ready pose
        self.moveit2.move_to_configuration(
            [0.0, -0.5, 0.7, 0.0, 0.8, 0.0]
        )
        self.moveit2.wait_for_execution()

        # 2. Move to pick pose (Cartesian)
        pick_pose = PoseStamped()
        pick_pose.header.frame_id = "base_link"
        pick_pose.pose.position.x = 0.3
        pick_pose.pose.position.y = 0.0
        pick_pose.pose.position.z = 0.05
        pick_pose.pose.orientation.w = 1.0
        self.moveit2.move_to_pose(pick_pose)
        self.moveit2.wait_for_execution()

        # 3. Close gripper
        self.moveit2.move_to_configuration(
            joint_positions=[0.0],  # closed
            joint_names=["gripper_joint"],
            group_name="gripper",
        )
        self.moveit2.wait_for_execution()

        # 4. Move to place pose
        place_pose = PoseStamped()
        place_pose.header.frame_id = "base_link"
        place_pose.pose.position.x = 0.3
        place_pose.pose.position.y = -0.2
        place_pose.pose.position.z = 0.1
        place_pose.pose.orientation.w = 1.0
        self.moveit2.move_to_pose(place_pose)
        self.moveit2.wait_for_execution()

        # 5. Open gripper
        self.moveit2.move_to_configuration(
            joint_positions=[0.04],  # open
            joint_names=["gripper_joint"],
            group_name="gripper",
        )
        self.moveit2.wait_for_execution()

def main():
    rclpy.init()
    node = PickPlace()
    node.execute()
    rclpy.shutdown()

if __name__ == "__main__":
    main()

Cartesianische Pfadplanung: Detaillierter Arbeitsfluss

Die Kartez-Pfadensätze sind für Aufgaben, bei denen der Endefektor eine bestimmte Bahn im 3D-Raum (Wippen, Zeichnen, Einfügen) folgen muss, unerlässlich.

  • Wegpunkt-Ausstand: Setzen Sie T53 (1 cm zwischen den Waypoints) für eine reibungslose Bewegung. Größere Schritte (5 cm) erzeugen eine zerstreckende Bewegung an den Ecken. Kleinere Schritte (<5 mm) verlängern die Planungszeit ohne sichtbare Verbesserung.
  • ** Sprungschwelle:** Setzen Sie T54, um den Sprungdetektor zu deaktivieren (für die meisten Aufgaben empfohlen). Eine nicht-null-Schwelle verhindert die Planung, wenn sich ein Gelenk über die Schwelle zwischen benachbarten Wegpunkten bewegt, was IK-Unterläufe erfasst, aber auch gültige Wege in der Nähe von Gelenkgrenzen ablehnt.
  • Fraktionsprüfung: T55 gibt einen Bruchteil (0,0-1.0) zurück, der anzeigt, wie viel der gewünschten Weg erreichbar war. Wenn der Bruchteil < 0,95, überschreitet der Weg wahrscheinlich eine gemeinsame Grenze oder Kollisionsgrenze. Anpassung der Annäherungsrichtung oder Entspannung der Orientierungsgrenze.
  • ** Orientierungsgeschränkungen während der kartesischen Bewegung:** Für Aufgaben wie Gießen oder Einfügen, fügen Sie eine Orientierungsgeschränkung hinzu, um die Griffhöhe zu halten. Setzen Sie die Orientierungsgeschränkung auf +/-10 Grad um die Spitze- und Rollsachsen, mit 360 Grad Freiheit in der Gie.

Kollisionsprüfung: Einfügen von Objekten in die Planungsszene

MoveIt2 vermeidet nur Kollisionen mit Objekten, von denen er weiß.

  • Tischfläche: Fügen Sie als Box ein Primitiv mit den Abmessungen Ihrer Tabelle hinzu, das in der richtigen Höhe positioniert ist. Dies ist das am häufigsten vermisste Kollisionsobjekt und verursacht Arm-Tisch-Krachsen.
  • **Kamera-Montage: ** Für Ober- und Nebenkamera-Montage fügen Sie vereinfachte Boxformen hinzu.
  • Anhängige Objekte: Wenn der Griff einen Gegenstand ergreift, befestigen Sie ihn mit T56 an den Endfaktor. Dies verhindert, dass der Planer Wege erzeugt, die das ergriffene Objekt mit der Umwelt kollidieren.
  • OctoMap (dynamische Hindernisse): Für Umgebungen mit beweglichen Hindernissen führen Sie die Punktwolke einer Tiefenkamera der OctoMap-Integration von MoveIt2 ein. MoveIt2 erstellt eine 3D-Besatzungskarte und planet um sie herum. Verwenden Sie T57 und setzen Sie T58 (2 cm Vokse) für ein gutes Gleichgewicht von Details und Planungsgeschwindigkeit.

Verwandte Leitfäden

Arbeiten mit RCSV

RCSV bietet ROS2- und MoveIt2-Integrationsunterstützung für alle von uns verkauft und bedienteten Arm-Plattformen.

  • OpenArm Resources -- Open-Source URDF, MoveIt2-Konfiguration und ros2_control-Treiber für OpenArm 1
  • Hardware Store -- Kauf von OpenArm 1 mit vorkonfiguriertem ROS2-Treiber
  • Reparatur und Wartung --ROS2-Integrationsdienste, Fahrerentwicklung und Kalibrierung
  • Datenplattform -- Übertragen Sie die über den MoveIt2-Servo-Modus gesammelten Teleoperationsdaten
  • [Kontaktieren Sie uns] T72) -- bitten Sie um ROS2-Integrationsunterstützung für Ihre Armplattform

Bereit zum Bauen?

Erkunden Sie OpenArm unseren Open-Source-Roboterarm, der für die Integration von ROS2 und MoveIt2 entwickelt wurde, mit vorgebauten URDF, MoveIt2-Konfiguration und ros2_control-Treiber.

[OpenArm Ressourcen]