ROS Moveit Das ausführlichste Tutorial im gesamten Netzwerk

Vorwort

moveit_configEs gibt viele Inhalte im Zusammenhang mit der Verwendung, Konfiguration und den Prinzipien von Moveit, insbesondere das vom Assistenten generierte Paket, das viele Inhalte enthält. Benutzer können die Beziehung während der Konfiguration leicht verwechseln, was den Konfigurationsprozess schwierig und langwierig macht .

Gleichzeitig ist die Moveit-Dokumentation im Internet relativ chaotisch und auch die Konfigurationsmethoden sind unterschiedlich. Daher hat der Autor während des Lernprozesses die Tutorials zur Verwendung, Konfiguration und den Prinzipien von Moveit zusammengestellt, in der Hoffnung, hilfreich zu sein an künftige Generationen.

Tipp: Dieser Artikel hat etwa 94.000 Wörter und das Lesen dauert mehr als 2 Stunden. Es wird empfohlen, ihn als Nachschlagewerk als Moveit-Nachschlagewerk zu speichern.

Autor: Herman Ye @Auromix Auromix ist eine Organisation von Roboter-Enthusiasten. Willkommen zur Teilnahme an unseren Open-Source-Projekten
auf Github

Inhaltsverzeichnis

Installation von Moveit

Der Autor hat eine Ein-Klick-Konfiguration und Installation von Moveit erstellt , um die Verwendung zu erleichtern. Dieses Ein-Klick-Konfigurations- und Installationsskript bestimmt auch, ob je nach Benutzerbedarf zusätzliche grundlegende Tutorial-Beispiele von Moveit heruntergeladen werden sollen, um Benutzer beim Lernen zu unterstützen.

Kopieren Sie die folgenden Anweisungen in die Befehlszeile und konfigurieren und installieren Sie sie mit einem Klick

wget -O $HOME/moveit1_install.sh https://raw.githubusercontent.com/auromix/ros-install-one-click/main/moveit1_install.sh && sudo chmod +x $HOME/moveit1_install.sh && sudo bash $HOME/moveit1_install.sh && rm $HOME/moveit1_install.sh

So verwenden Sie Moveit

Basierend auf dem Panda-Roboterarm als grundlegendem Tutorial-Beispiel für die One-Click-Konfiguration und -Installation von Moveit gibt es die folgenden Verwendungsmethoden für die einfache Verwendung in RViz.

roslaunch panda_moveit_config demo.launch
roslaunch panda_moveit_config demo_gazebo.launch

Für bestimmte Verwendungszwecke werden bei Verwendung des Ein-Klick-Konfigurationsinstallationsskripts von Moveit Eingabeaufforderungen angezeigt.

Dateianalyse des Konfigurationspakets config

robotname_moveit_configEs enthält zu viele Dateien, was den Benutzern normalerweise Kopfschmerzen bereitet. Im Folgenden finden Sie eine detaillierte Analyse der einzelnen Inhalte in diesen Konfigurationspaketen, die je nach Bedarf konsultiert werden können.
Wenn Sie mehr über die klassische Demo in Config erfahren möchten, empfiehlt sich die Lektüre demo.launchund demo_gazebo.launchDatei-Slice-Analyse

Fügen Sie hier eine Bildbeschreibung ein

Slice-Analyse 1: demo.launch

Fügen Sie hier eine Bildbeschreibung ein

Der Dateiname ist die klassische Demo von Moveit, die das Robotermodell in RViz anzeigt und Moveit robot_moveit_config/launch/demo.launchüber RViz- Plug-Ins steuert, um die Bewegungsplanung und Flugbahnsteuerung abzuschließen. Das Folgende ist der vollständige Code des offiziellen Falls von Moveit :MotionPlanning
panda_moveit_config/launch/demo.launch

<launch>
  <arg name="arm_id" default="panda" />
  <!-- specify the planning pipeline -->
  <arg name="pipeline" default="ompl" />

  <!-- By default, we do not start a database (it can be large) -->
  <arg name="db" default="false" />
  <!-- Allow user to specify database location -->
  <arg name="db_path" default="$(find panda_moveit_config)/default_warehouse_mongo_db" />

  <!-- By default, we are not in debug mode -->
  <arg name="debug" default="false" />

  <!-- By default we will load the gripper -->
  <arg name="load_gripper" default="true" />

  <!-- By default, we will load or override the robot_description -->
  <arg name="load_robot_description" default="true"/>

  <!-- Choose controller manager: fake, simple, or ros_control -->
  <arg name="moveit_controller_manager" default="fake" />
  <!-- Set execution mode for fake execution controllers -->
  <arg name="fake_execution_type" default="interpolate" />
  <!-- Transmission used for joint control: position, velocity, or effort -->
  <arg name="transmission" />                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

  <!-- By default, hide joint_state_publisher's GUI in 'fake' controller_manager mode -->
  <arg name="use_gui" default="false" />
  <arg name="use_rviz" default="true" />
  <!-- Use rviz config for MoveIt tutorial -->
  <arg name="rviz_tutorial" default="false" />

  <!-- If needed, broadcast static tf for robot root -->
  <node pkg="tf2_ros" type="static_transform_publisher" name="virtual_joint_broadcaster_0" args="0 0 0 0 0 0 world $(arg arm_id)_link0" />



  <group if="$(eval arg('moveit_controller_manager') == 'fake')">
    <!-- We do not have a real robot connected, so publish fake joint states via a joint_state_publisher
         MoveIt's fake controller's joint states are considered via the 'source_list' parameter -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" unless="$(arg use_gui)">
      <rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam>
    </node>
    <!-- If desired, a GUI version is available allowing to move the simulated robot around manually
         This corresponds to moving around the real robot without the use of MoveIt. -->
    <node name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" if="$(arg use_gui)">
      <rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam>
    </node>

    <!-- Given the published joint states, publish tf for the robot links -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="true" output="screen" />
  </group>

  <!-- Run the main MoveIt executable without trajectory execution (we do not have controllers configured by default) -->
  <include file="$(dirname)/move_group.launch" pass_all_args="true">
    <arg name="allow_trajectory_execution" value="true" />
    <arg name="info" value="true" />
  </include>

  <!-- Run Rviz and load the default config to see the state of the move_group node -->
  <include file="$(dirname)/moveit_rviz.launch" if="$(arg use_rviz)">
    <arg name="rviz_tutorial" value="$(arg rviz_tutorial)"/>
    <arg name="rviz_config" value="$(dirname)/moveit.rviz"/>
    <arg name="debug" value="$(arg debug)"/>
  </include>

  <!-- If database loading was enabled, start mongodb as well -->
  <include file="$(dirname)/default_warehouse_db.launch" if="$(arg db)">
    <arg name="moveit_warehouse_database_path" value="$(arg db_path)"/>
  </include>

</launch>

Für jeden Teil des Codes gibt es die folgende Analyse:

arm_id

  <arg name="arm_id" default="panda" />
  # 机器人的标识符。这个参数指定在机器人有多个实现时使用哪一个。
  # 当多机器人协同时,标识符可以用来区分它们。默认值设置为“panda”

Pipeline

  <arg name="pipeline" default="ompl" />
  # 机器人运动规划的管道。
  # MoveIt提供了几种规划算法,例如OMPL、SBPL等。此参数允许用户选择使用哪种算法进行运动规划。默认值为“ompl”。

Informationen OMPL(Open Motion Planning Library)zum Algorithmus finden Sie in der offiziellen OMPL-Dokumentation und im OMPL Primer

db&db_path

  <!-- By default, we do not start a database (it can be large) -->
  <arg name="db" default="false" />
  <!-- Allow user to specify database location -->
  <arg name="db_path" default="$(find panda_moveit_config)/default_warehouse_mongo_db" />
  # db:指定是否启动运动规划数据库。
  # 如果设为true,MoveIt会启动MongoDB数据库来存储或检索运动规划数据。默认值为false。
  # db_path:指定运动规划数据库的路径。
  # 这个参数允许用户指定MongoDB数据库的位置。默认值设置为“$(find panda_moveit_config)/default_warehouse_mongo_db”。

Bei Bewegungsplanungsdaten handelt es sich in der Regel um Daten, die Roboter oder mobile Geräte zur Planung von Bewegungspfaden verwenden, wie z. B. Zielposition, aktuelle Position des Roboters, Informationen zur Hindernisvermeidung usw.
In MoveIt Warehousebesteht die Funktion darin, eine dauerhafte Speichermethode bereitzustellen, um die gesamte Planungsszene und den Roboterstatus zu speichern. Durch die Verwendung geeigneter Speicher-Plugins wie warehouse_ros_mongooder warehouse_ros_sqlitekönnen Benutzer Szenen und Zustände in verschiedenen Backend-Datenbanken wie MongoDBoder speichern. SQLiteDies ermöglicht es Benutzern, gespeicherte Szenen und Zustände zu verschiedenen Zeiten und an unterschiedlichen Orten erneut zu laden und zu verwenden.

Neben der Bereitstellung persistenter Speicherfunktionen kann Warehouse auch zum Abfragen, Filtern und Sortieren von Daten verwendet werden. Mithilfe der von MoveIt bereitgestellten Schnittstelle können Benutzer die benötigten Szenen und Zustände einfach aus dem Warehouse abrufen und abrufen. Dies ist nützlich für die Echtzeitplanung und Entscheidungsfindung bei Roboteroperationen, da bestimmte Szenarien und Zustände schnell abgerufen werden können, ohne sie jedes Mal neu berechnen oder regenerieren zu müssen.

MongoDBist eine beliebte dokumentenbasierte (NoSQL) Datenbank , die JSONDaten im Binärformat speichert. Im Gegensatz zu herkömmlichen relationalen Datenbanken verfügt MongoDB über eine flexible Struktur und eignet sich zum Speichern halbstrukturierter Daten oder Dokumente jeglicher Art.

Informationen zur Verwendung einer Datenbank zum Speichern und Aufrufen von Bewegungsplanungsdaten in Moveit finden Sie unter Moveit1 Warehouse MangoDB

debuggen

  <!-- By default, we are not in debug mode -->
  <arg name="debug" default="false" />
  # debug:指定是否启用RViz调试模式。如果设为true,则启用RViz中的调试模式。默认为false。
  # 该参数也会被传递给move_group.launch,用于开启move_group的GDB调试。

RViz debug modeKann Entwicklern bei der Diagnose und Lösung von Problemen helfen. Im Debug-Modus kann Rviz weitere Debugging-Informationen anzeigen, z. B. den Inhalt und die Empfangshäufigkeit von ROS-Nachrichten, Informationen zur Bildrate sowie die in der RViz-Visualisierung verwendete Ressourcen- und Speichernutzung usw.

Diese Informationen können Entwicklern dabei helfen, Probleme schnell zu lokalisieren und zu lösen, z. B. beim Debuggen von Kommunikationsproblemen zwischen Knoten, beim Visualisieren der Ressourcennutzung usw. Gleichzeitig kann der Debug-Modus auch explizit die Namen, Beschriftungen und Koordinateninformationen verschiedener visueller Elemente in Rviz anzeigen, um die Positionsdynamik von Elementen besser zu verstehen und anzupassen.

last_greifer

  <!-- By default we will load the gripper -->
  <arg name="load_gripper" default="true" />
  # load_gripper:指定是否加载机器人夹爪的控制器。此参数用于加载和配置夹爪的运动控制器。默认值为true。
  # 该参数将通过 pass_all_args="true" 属性被传递给move_group.launch

Load_robot_description

  <!-- By default, we will load or override the robot_description -->
  <arg name="load_robot_description" default="true"/>
  # 指定是否加载或覆盖机器人描述。MoveIt需要知道机器人的描述才能进行规划和控制。
  # 这个参数用于加载机器人的URDF文件或覆盖已有的机器人描述。默认值为true。
  # 该参数将通过 pass_all_args="true" 属性被传递给move_group.launch

load_robot_descriptionLaden Sie die Beschreibungsdatei des Roboters (normalerweise im urdfSDF-Format) in den ROS-Parameterserver. Wenn der Parameter „load_robot_description“ wahr ist, wird die zuvor festgelegte Roboterbeschreibungsdatei geladen oder überschrieben. Bei „false“ wird die zuvor geladene Roboterbeschreibungsdatei verwendet.

robot_descriptionDie Veröffentlichung robot_state_publishererfolgt über Knoten. Dieser Knoten erhält die Beschreibungsinformationen des Roboters vom Parameterserver, berechnet die Transformation jeder Verbindungskomponente des Roboters und veröffentlicht den TF-Baum und die Gelenkstatusinformationen des Roboters. Der Knoten move_group empfängt TF- und Gelenkstatusinformationen für die Bewegungsplanung und -ausführung.

moveit_controller_manager

  <!-- Choose controller manager: fake, simple, or ros_control -->
  <arg name="moveit_controller_manager" default="fake" />
  # moveit_controller_manager:选择控制器管理器的类型。
  # 控制器管理器用于加载和配置机器人的控制器。
  # MoveIt提供了几种类型的控制器管理器,包括“fake”,“simple”和“ros_control”。默认值为“fake”。

Zu den von MoveIt bereitgestellten Controller-Managern gehören die folgenden drei Typen:

  1. fake: Diese Art von Steuerung simuliert nur Bewegungen und kommuniziert nicht mit dem echten Roboter. Es wird häufig für schnelle Tests und Demonstrationen verwendet, und für Simulationen werden häufig gefälschte Controller verwendet, um Bewegungen zu simulieren.

  2. simple: Dieser Steuerungstyp kommuniziert mit dem Roboter, bietet jedoch nur grundlegende Steuerung wie Linear-/Bogeninterpolation usw. Es funktioniert gut für einige einfachere Roboter.

  3. ros_control: Dies ist ein flexiblerer Steuerungstyp, der eine Vielzahl von Roboter- und Steuerungshardware unterstützt. Es bietet übergeordnete Steuerungsschnittstellen, z. B. Motorsteuerungsschnittstellen und Sensorleseschnittstellen.
    Abhängig vom Anwendungsszenario und den Anforderungen des Roboters kommen unterschiedliche Arten von Controller-Managern zum Einsatz.
    ros_control ist eine leistungsstarke Steuerung für Roboter. Weitere Informationen finden Sie im WIKI-Dokument ros_control und im Quellcode von ros_control.

Fügen Sie hier eine Bildbeschreibung ein
Bildquelle: ROS WIKI ros_control

fake_execution_type

  <!-- Set execution mode for fake execution controllers -->
<arg name="fake_execution_type" default="interpolate" />
  # fake_execution_type:设置虚拟控制器的执行模式。
  # 如果选择“fake”控制器管理器,则使用虚拟控制器进行模拟运动。
  # 此参数指定用于虚拟运动的执行模式,包括“interpolate”,“last point。默认值为“interpolate”。

interpolate: Diese Option gibt an, dass MoveIt davon ausgeht, dass der Controller zwischen jedem Zielpunkt der Flugbahn interpoliert. Diese Methode kann den kontinuierlichen Trajektorienausführungsprozess simulieren.

last point: Diese Option gibt an, dass MoveIt davon ausgeht, dass der Controller direkt zum letzten Zielpunkt der Flugbahn springt. Mit dieser Methode können Roboter simuliert werden, die Aufgaben schnell ausführen. In dem Dokument wurden zwei Beschreibungen gefunden, und es ist ungewiss, ob es eine dritte gibt,
die mit der Beschreibung in der offiziellen Dokumentation übereinstimmt . Eine detaillierte Beschreibung finden Sie jedoch im offiziellen Dokument von Moveit . Sie können sich auf das offizielle Dokument von Moveit1 Noetic beziehenlaunch/fake_moveit_controller_manager.launch.xmlvia pointsfake controller
fake controller

MoveIt bietet eine Reihe virtueller Track-Controller, die in Simulationen verwendet werden können. Darunter befindet sich die Konfigurationsdatei des virtuellen Controllers config/fake_controllers.yaml.

Folgende Reglertypen können je nach Bedarf angepasst werden:

  • interpolate: Führt eine reibungslose Interpolation über wichtige Punkte durch, Standardeinstellung für die Visualisierung.
  • via points: Durchqueren Sie wichtige Punkte, ohne Punkte dazwischen zu interpolieren, und verwenden Sie sie für visuelles Debuggen.
  • last point: Springen Sie für Offline-Benchmarking direkt zum letzten Punkt der Flugbahn.

Informationen zum Typ des virtuellen Controllers können fake_controllers.yamlin der Datei konfiguriert werden. Für jeden Controller müssen Sie den Namen, den Typ und die beteiligten Gelenke angeben. wobei die Frequenz ist rate: 10, die im Interpolationscontroller verwendet werden kann. Aber bei der Steuerung des Greifers sind die Gelenke eine leere Liste [].

Beispiel:

rate: 10
controller_list:
  - name: fake_arm_controller
    type: interpolate
    joints:
      - joint_1
      - joint_2
      - joint_3
      - joint_4
      - joint_5
      - joint_6
  - name: fake_gripper_controller
    joints:
      []

Übertragung

  <!-- Transmission used for joint control: position, velocity, or effort -->
  <arg name="transmission" /> 
  # 设置用于关节控制的传输类型。这个参数用来选择传输类型,例如position、velocity或effort。
  # 默认情况下,这个参数未设置,不用理会。    

use_gui

  <!-- By default, hide joint_state_publisher's GUI in 'fake' controller_manager mode -->
  <arg name="use_gui" default="false" />

  # use_gui:指定是否显示joint_state_publisher的GUI界面。
  # 如果设为true,则会在启动期间打开一个窗口,显示机器人的关节姿态。默认值为false。

In MoveIt demo.launchist standardmäßig ein Fake-Controller-Manager-Modus eingestellt, was bedeutet, dass kein tatsächlicher Controller mit dem Roboterarm verbunden ist.

In diesem Modus joint_state_publisherwerden die veröffentlichten gemeinsamen Statusinformationen fake_controller_joint_statesüber das Thema abgerufen und die grafische Benutzeroberfläche (GUI) wird ausgeblendet, um Fehlbedienungen des Benutzers zu vermeiden. Daher kann eine standardmäßig ausgeblendete GUI joint_state_publisherdie Zuverlässigkeit des Systems erhöhen.

use_rviz

  <arg name="use_rviz" default="true" />
  # use_rviz:指定是否启用RViz。如果此参数设为true,则MoveIt将启动RViz进行可视化。默认值为true。
  <!-- Use rviz config for MoveIt tutorial -->
  <arg name="rviz_tutorial" default="false" />
  # rviz_tutorial:指定是否使用RViz配置进行MoveIt教程演示。
  # 如果设为true,则MoveIt将加载RViz演示配置。默认值为false。

Virtueller gemeinsamer statischer TF-Knoten

  <!-- If needed, broadcast static tf for robot root -->
  <node pkg="tf2_ros" type="static_transform_publisher" name="virtual_joint_broadcaster_0" args="0 0 0 0 0 0 world $(arg arm_id)_link0" />
  # 广播虚拟关节的静态变换
  # 将world坐标系映射到机器人的物理坐标系中的起点$(arg arm_id)_link0

Durch die Verwendung virtueller Gelenke und die Einführung eines virtuellen „Bezugspunkts“ zur Beschreibung der Position des Roboters in seiner Umgebung können die Gelenkzustände des Roboters für inverse Kinematikberechnungen auf Positionen und Haltungen in der physischen Welt abgebildet werden, und der Planer kann diese Informationen nutzen um Bewegungsbahnen zu planen oder Roboterposen zu generieren.

Gelenkstatus und Gesamtstatus des Roboters

  <group if="$(eval arg('moveit_controller_manager') == 'fake')">
    <!-- We do not have a real robot connected, so publish fake joint states via a joint_state_publisher
         MoveIt's fake controller's joint states are considered via the 'source_list' parameter -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" unless="$(arg use_gui)">
      <rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam>
    </node>
    <!-- If desired, a GUI version is available allowing to move the simulated robot around manually
         This corresponds to moving around the real robot without the use of MoveIt. -->
    <node name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" if="$(arg use_gui)">
      <rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam>
    </node>

    <!-- Given the published joint states, publish tf for the robot links -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="true" output="screen" />
  </group>
 # 如果moveit_controller_manager的类型是fake
 # 则启动joint_state_publisher和robot_state_publisher
 # 默认不启用joint_state_publisher_gui,以防用户在图形化窗口不小心调节了关节状态值

Roslaunch XML

Wenn Sie mit der in diesem Codeausschnitt verwendeten Sprache nicht vertraut sind ROS1 launch XML, lesen Sie bitte die Dokumentation zum ROS1-Start

Die Rolle der Gruppe

Die Funktion dieser Knotengruppe groupbesteht darin, dass fakedie Knotengruppe den gemeinsamen Status des virtuellen Roboters veröffentlicht, wenn der Controller-Manager von Moveit auf „Typ“ eingestellt ist /joint_states, und dann das Thema des virtuellen Roboters über den Roboterstatus-Herausgeber veröffentlicht, /tfum ihn zu abonnieren /tfThema in RViz Und zeigen Sie den Status des virtuellen Roboters in RViz an.

In diesem Fall wird es groupzusammen mit robot_state_publisherdem joint_state_publisherKnoten verwendet, um die Veröffentlichung gemeinsamer Statusinformationen zu simulieren. joint_state_publisherEs werden regelmäßig Thementypen veröffentlicht sensor_msgs/JointState, /joint_statesdie Statusinformationen zu jedem Gelenk des Roboters enthalten. robot_state_publisherEs abonniert diese Nachrichten, berechnet die Poseninformationen jeder Komponente des Roboters basierend auf dem URDF-Modell des Roboters, veröffentlicht /tfThemen und schließt schließlich die Aktualisierung und Freigabe des Roboterstatus ab.

Diagramm der Beziehung zwischen Knoten

Dies ist aus rqt_graphder Beziehung zwischen jedem Knoten und Thema in dieser Demo ersichtlich:

  1. /move_group/move_group/fake_controller_joint_statesThema zur Knotenveröffentlichung
  2. /joint_state_publisher/move_group/fake_controller_joint_statesThema zum Knotenabonnement
  3. /joint_state_publisher/joint_stateThema zur Knotenveröffentlichung
  4. /robot_state_publisher/joint_stateThema zum Knotenabonnement
  5. /robot_state_publisher/tfThema zur Knotenveröffentlichung
  6. /tfVeröffentlichungsthema für virtuelle gemeinsame statische TF-Knoten
  7. /move_groupAbonnieren Sie /tfThemen des Typs
  8. RViz- /tfAbonnementthemen

Fügen Sie hier eine Bildbeschreibung ein

joint_state_publisher

Joint State Publisher ist ein ROS-Paket, das zum Veröffentlichen des Gelenkstatus nicht fester Gelenke von Robotern verwendet wird /joint_states. Der Thementyp ist sensor_msgs/JointState.
Nach dem Lesen der URDF-Beschreibungsparameter des Roboters robot_descriptionidentifiziert er alle nicht fixierten Gelenke und erstellt JointStateNachrichten mit diesen nicht fixierten Gelenken, um Robotergelenkstatuswerte festzulegen und zu veröffentlichen joint state values.
Es kann robot_state_publishermit verwendet werden, um Transformationen aller Gelenkzustände zu veröffentlichen.

Eingabe von joint_state_publisher

joint_state_publisherAbonnieren Sie den Parameterserver , finden Sie alle nicht festen Gelenkerobot_description in der Roboterbeschreibung und veröffentlichen Sie Typmeldungen mit den Statuswerten dieser Gelenke.sensor_msgs/JointState

joint_state_publisherEs kann source_listals Eingabe verwendet werden. Dies ist eine Zeichenfolgenliste mit mehreren Themennamen. Sie ist standardmäßig leer. Geben Sie die Namen verschiedener Themen ein, die abonniert werden müssen. Bei diesen zu abonnierenden Themen geht es um gemeinsame Statuswerte und das Thema Typ ist auchsensor_msgs/JointState

Im GUI-Modus ist es möglich, direkte Gelenkstatuswerte (z. B. Winkel) von grafischen Fensterwerkzeugen joint_state_publisher_guizu erhalten . Dieser Statuswert wird durch Ziehen des Winkelbalkens durch den Benutzer zugewiesen.joint_state_publisher_gui

In diesem Fall von Moveit /joint_state_publisherabonniert der Knoten das Thema von /move_groupund der Inhalt des Parameters ist/move_group/fake_controller_joint_statessource_list[move_group/fake_controller_joint_states]

Ausgabe von joint_state_publisher

joint_state_publisherDer Knoten veröffentlicht Themen wie Robotergelenke name, Positionen position, Geschwindigkeits- velocityund Kraftniveaus effortusw. /joint_statesDer Thementyp ist sensor_msgs/JointState

robot_state_publisher

Robot State Publisher ist ein ROS-Paket, das für die Veröffentlichung der Statusinformationen der gesamten Kinematikkette des Roboters verantwortlich ist, einschließlich Gelenk- und Linknamen, Eltern-Kind-Beziehungen sowie der Position und Richtung jedes Links. Dieses Paket ist für die Visualisierung von Roboterposen in RViz oder anderen Visualisierungstools unerlässlich.

robot_descriptionEs verwendet das Universal Robot Description Format (URDF), das durch die Parameter im Parameterserver und die Gelenkzustandswertgruppe /joint_statesaus dem Thema, Thementyp sensor_msgs/msg/JointState, angegeben wird, um die Vorwärtskinematik des Roboters zu berechnen und /tfdas Thema zu veröffentlichen.

Eingabe in robot_state_publisher

robot_state_publisherrobot_descriptionBeim Start wird das Kinematikbaummodell URDF des Roboters vom Parameterserver geladen . robot_descriptionParameter können über die Startdatei übergeben werden, und ihre Werte sind die URDF-Beschreibungszeichenfolgen des Roboters.

Gleichzeitig robot_state_publisherist es erforderlich, das Thema zu abonnieren, joint_statesum die Statuswertinformationen jedes Gelenks zu erhalten.
Diese Gelenkstatusinformationen joint stateswerden verwendet, um das Kinematikbaummodell zu aktualisieren und dann Linkdie 3D-Positionsinformationen jedes Mitglieds des Roboters zu berechnen.Pose

Ausgabe von robot_state_publisher

Für feste Gelenke wird das Thema robot_state_publisherveröffentlicht , und der Typ lautet: Für bewegliche Gelenke wird das Thema veröffentlicht , und die Poseninformationen des festen Gelenks werden beim Start des Knotens im Thema veröffentlicht und die Informationen werden in gespeichert die Geschichte. Die Haltungsinformationen der beweglichen Gelenke werden rechtzeitig zum Thema veröffentlicht , wenn das Thema Aktualisierungen zum entsprechenden Gelenkstatus erhält./tf_statictf2_msgs/msg/TFMessage
robot_state_publisher/tftf2_msgs/msg/TFMessage
/tf_static/joint_states/tf

Spezifische Anwendungsbeispiele finden Sie in Gihub robot_state_publisher

Fügen Sie hier eine Bildbeschreibung ein
Bildquelle: ROS WIKI robot_state_publisher

Move_group laden

  <!-- Run the main MoveIt executable without trajectory execution (we do not have controllers configured by default) -->
  <include file="$(dirname)/move_group.launch" pass_all_args="true">
    <arg name="allow_trajectory_execution" value="true" />
    <arg name="info" value="true" />
  </include>
  # 启动move_group.launch来加载move_group相关内容
  # 通过pass_all_args="true" 将demo.launch文件的所有arg参数传递给move_group.launch作为参数
  # 设置 allow_trajectory_execution 为 true,
  # 可以让 move_group 在运行过程中尝试让机器人执行这些预定义的轨迹
  # 但如果该参数设置为 false,则只会规划但不会执行规划的轨迹,机器人将保持静止
  # 此功能对于测试和调试非常有用,因为它允许操纵轨迹,而无需在机器人上实际执行它们
  # 它在关注安全的情况下也很有用,因为它提供了一种防止意外执行危险轨迹的方法
  # 如果将 info 设置为 true,则 move_group 会在控制台输出调试信息

pass_all_args="true"Es handelt sich um ein Attribut, an das alle Father Launcheingehenden Parameter übergeben werden Child Launch.

In der MoveIt- demo.launchDatei pass_all_args="true"werden Father Launchalle arg-Parameter an übergeben Child Launch, was bedeutet, dass alle Parameter von ihnen Child Launchabgerufen und geerbt werden können .Father Launch

In diesem Fall demo.launchwerden alle arg-internen Parameter an übergeben move_group.launch.
Beachten Sie, dass, wenn nicht festgelegt pass_all_args="true", Child Launchnur includeParameter empfangen werden, die explizit im Tag aufgeführt sind. Wenn nur includeParameter übergeben werden, die explizit im Tag aufgeführt sind, können Sie Parameter ohne Verwirrung steuern, wenn Launch verschachtelt ist.

RViz laden

  <!-- Run Rviz and load the default config to see the state of the move_group node -->
  <include file="$(dirname)/moveit_rviz.launch" if="$(arg use_rviz)">
    <arg name="rviz_tutorial" value="$(arg rviz_tutorial)"/>
    <arg name="rviz_config" value="$(dirname)/moveit.rviz"/>
    <arg name="debug" value="$(arg debug)"/>
  </include>
  # 当use_rviz=true时运行moveit_rviz.launch文件
  # 并传递参数rviz_tutorial用于选择是否使用Moveit RViz教学模式
  # rviz_config的值用于打开同目录下的/moveit.rviz配置文件
  # debug的值用来设置是否开启RViz的debug模式

Datenbank laden

  <!-- If database loading was enabled, start mongodb as well -->
  <include file="$(dirname)/default_warehouse_db.launch" if="$(arg db)">
    <arg name="moveit_warehouse_database_path" value="$(arg db_path)"/>
  </include>
  # 当参数db=true时,运行default_warehouse_db.launch
  # 向default_warehouse_db.launch传入参数moveit_warehouse_database_path,参数值为该数据库的路径

Slice-Analyse 2: move_group.launch

Der Dateiname robot_moveit_config/launch/move_group.launchwird zum Starten des Knotens „move_group“ und zugehöriger Funktionen verwendet. Der Knoten „move_group“ ist eine Schlüsselkomponente im MoveIt-Softwarepaket. Er stellt eine Schnittstelle zum Ausführen verschiedener Funktionen von MoveIt bereit, z. B. Planung, Ausführung und Kinematikberechnungen. Warten.
Es implementiert die Planung und Ausführung von Roboterbewegungen durch Interaktion mit Bewegungssteuerungshardware und -planern.
move_group.launchDie Datei panda_moveit_config/launch/demo.launchwird als untergeordnete Startdatei in gestartet.

Das Folgende ist der vollständige Code des offiziellen Falls von Moveit panda_moveit_config/launch/move_group.launch:

<launch>

  <!-- GDB Debug Option -->
  <arg name="debug" default="false" />
  <arg unless="$(arg debug)" name="launch_prefix" value="" />
  <arg     if="$(arg debug)" name="launch_prefix"
           value="gdb -x $(dirname)/gdb_settings.gdb --ex run --args" />

  <!-- Verbose Mode Option -->
  <arg name="info" default="$(arg debug)" />
  <arg unless="$(arg info)" name="command_args" value="" />
  <arg     if="$(arg info)" name="command_args" value="--debug" />

  <!-- move_group settings -->
  <arg name="pipeline" default="ompl" />
  <arg name="allow_trajectory_execution" default="true"/>
  <arg name="moveit_controller_manager" default="simple" />
  <arg name="fake_execution_type" default="interpolate"/>
  <arg name="max_safe_path_cost" default="1"/>
  <arg name="publish_monitored_planning_scene" default="true"/>

  <arg name="capabilities" default=""/>
  <arg name="disable_capabilities" default=""/>

  <!--Other settings-->
  <arg name="load_gripper" default="true" />
  <arg name="transmission" default="effort" />
  <arg name="arm_id" default="panda" />

  <arg name="load_robot_description" default="true" />
  <!-- load URDF, SRDF and joint_limits configuration -->
  <include file="$(dirname)/planning_context.launch">
    <arg name="load_robot_description" value="$(arg load_robot_description)" />
    <arg name="load_gripper" value="$(arg load_gripper)" />
    <arg name="arm_id" value="$(arg arm_id)" />
  </include>

  <!-- Planning Pipelines -->
  <group ns="move_group/planning_pipelines">

    <!-- OMPL -->
    <include file="$(dirname)/planning_pipeline.launch.xml">
      <arg name="pipeline" value="ompl" />
      <arg name="arm_id" value="$(arg arm_id)" />
    </include>

    <!-- CHOMP -->
    <include file="$(dirname)/planning_pipeline.launch.xml">
      <arg name="pipeline" value="chomp" />
      <arg name="arm_id" value="$(arg arm_id)" />
    </include>

    <!-- Pilz Industrial Motion -->
    <include file="$(dirname)/planning_pipeline.launch.xml">
      <arg name="pipeline" value="pilz_industrial_motion_planner" />
      <arg name="arm_id" value="$(arg arm_id)" />
    </include>

    <!-- Support custom planning pipeline -->
    <include if="$(eval arg('pipeline') not in ['ompl', 'chomp', 'pilz_industrial_motion_planner'])"
             file="$(dirname)/planning_pipeline.launch.xml">
      <arg name="pipeline" value="$(arg pipeline)" />
      <arg name="arm_id" value="$(arg arm_id)" />
    </include>
  </group>

  <!-- Trajectory Execution Functionality -->
  <include ns="move_group" file="$(dirname)/trajectory_execution.launch.xml" pass_all_args="true" if="$(arg allow_trajectory_execution)">
    <arg name="moveit_manage_controllers" value="true" />
  </include>

  <!-- Sensors Functionality -->
  <include ns="move_group" file="$(dirname)/sensor_manager.launch.xml" if="$(arg allow_trajectory_execution)">
    <arg name="moveit_sensor_manager" value="panda" />
  </include>

  <!-- Start the actual move_group node/action server -->
  <node name="move_group" launch-prefix="$(arg launch_prefix)" pkg="moveit_ros_move_group" type="move_group" respawn="false" output="screen" args="$(arg command_args)">
    <!-- Set the display variable, in case OpenGL code is used internally -->
    <env name="DISPLAY" value="$(optenv DISPLAY :0)" />

    <param name="allow_trajectory_execution" value="$(arg allow_trajectory_execution)"/>
    <param name="sense_for_plan/max_safe_path_cost" value="$(arg max_safe_path_cost)"/>
    <param name="default_planning_pipeline" value="$(arg pipeline)" />
    <param name="capabilities" value="$(arg capabilities)" />
    <param name="disable_capabilities" value="$(arg disable_capabilities)" />

    <!-- Publish the planning scene of the physical robot so that rviz plugin can know actual robot -->
    <param name="planning_scene_monitor/publish_planning_scene" value="$(arg publish_monitored_planning_scene)" />
    <param name="planning_scene_monitor/publish_geometry_updates" value="$(arg publish_monitored_planning_scene)" />
    <param name="planning_scene_monitor/publish_state_updates" value="$(arg publish_monitored_planning_scene)" />
    <param name="planning_scene_monitor/publish_transforms_updates" value="$(arg publish_monitored_planning_scene)" />
  </node>

</launch>

GDB

  <!-- GDB Debug Option -->
  <arg name="debug" default="false" />
  <arg unless="$(arg debug)" name="launch_prefix" value="" />
  <arg     if="$(arg debug)" name="launch_prefix"
           value="gdb -x $(dirname)/gdb_settings.gdb --ex run --args" />
  # GDB Debug Option:用于设置是否启用GDB调试。
  # 当 GDB debug模式关闭时,launch_prefix值为空
  # 当 GDB debug模式开启时,launch_launch_prefix为GDB相关命令

Der GNU Symbolic Debugger (GDB) ist der am häufigsten verwendete Programm-Debugger auf der Linux-Plattform. Der GDB-Compiler wird normalerweise im Terminal (Shell) als gdb-Befehl verwendet.

Debugging-Tools können das debuggte Programm beim angegebenen Code anhalten und den Ausführungsstatus des aktuellen Programms anzeigen (z. B. den Wert der aktuellen Variablen, das Ausführungsergebnis der Funktion usw.), was das Debuggen von Haltepunkten darstellt .
Das Debuggen kann Ihnen helfen, die logischen Fehler zu verstehen, die in Ihrem Programm auftreten.
Ubuntu verfügt über ein eigenes GDB-Debugging-Tool:

test@ubuntu:~$ gdb -v  # Check the version of GDB
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

In diesem Codeausschnitt
gdbist : der Befehl für den GNU Debugger (GDB), der zum Debuggen eines Programms und zum Verfolgen seiner Ausführung verwendet wird.

gdb_settings.gdbEnthält eine Reihe von GDB-Befehlen und Debugging-Einstellungen zum automatischen Ausführen einiger Vorgänge während des Debuggens.
Diese Befehlsskriptdateien können Initialisierungsbefehle enthalten, die beim Starten einer GDB-Sitzung, beim Festlegen von Haltepunkten, beim Festlegen von Überwachungspunkten, beim Konfigurieren von Debugging-Optionen, beim Durchführen einer Reihe von Debugging-Vorgängen und anderen benutzerdefinierten GDB-Befehlen ausgeführt werden sollen. Durch das Schreiben von Debugging-Skripten können eine Reihe von Debugging-Vorgängen automatisch ausgeführt werden, um Zeit und Aufwand für die manuelle Eingabe von Befehlen zu sparen.
Die Datei wurde im panda_moveit_config/launch/Ordner nicht gefunden, sie wurde möglicherweise automatisch generiert oder der Entwickler von Moveit möchte nicht, dass Benutzer sie verwenden

gdb -x $(dirname)/gdb_settings.gdbin -xbewirkt gdb_settings.gdb, dass die Skriptdatei in GDB geladen wird, was dazu führt, dass GDB gdb_settings.gdbdie in der Skriptdatei definierten Befehle und Vorgänge ausführt.
--ex runDie Option weist GDB an, den Ausführungsbefehl unmittelbar nach dem Start des Debuggers auszuführen, damit das zu debuggende Programm ausgeführt wird.
--argsDen Optionen können das zu debuggende Programm und seine Parameter folgen.

In diesem Fall ist das Launch_Prefix durch Aktivieren des Debug-Modus GDB-bezogener Inhalt. Dieses Präfix wird <node name="move_group" launch-prefix="$(arg launch_prefix)" pkg="moveit_ros_move_group" type="move_group" respawn="false" output="screen" args="$(arg command_args)">verwendet, dh move_groupes wird beim Starten des Knotens übergeben launch-prefix.

Infomodus

  <!-- Verbose Mode Option -->
  <arg name="info" default="$(arg debug)" />
  <arg unless="$(arg info)" name="command_args" value="" />
  <arg     if="$(arg info)" name="command_args" value="--debug" />
  # Verbose Mode Option:用于设置是否启用详细模式。
  # 当开启详细模式时,move_group会在console输出更多信息,帮助用户了解move_group中发生的事情
  # info:用于指示是否启用详细模式的参数,默认与debug参数相同。
  # 当开启debug时,verbose详细模式也将被默认开启
  # 如果详细模式开启,则command_args参数值为--debug

In diesem Fall move_groupwird der Knoten mit command_argsdem Parameter gestartet, der als Argument an den Knoten übergeben wird move_group:
<node name="move_group" launch-prefix="$(arg launch_prefix)" pkg="moveit_ros_move_group" type="move_group" respawn="false" output="screen" args="$(arg command_args)">.

infoParameter werden demo.launchals Parameter in als Parameter pass_all_args="true"übergeben move_group.launch.

Pipeline

  <!-- move_group settings -->
  <arg name="pipeline" default="ompl" />
  # 机器人运动规划的管道。
  # MoveIt提供了几种规划算法,例如OMPL、SBPL等。此参数允许用户选择使用哪种算法进行运动规划。默认值为“ompl”。

Informationen zum OMPL(Open Motion Planning Library)Algorithmus finden Sie in der offiziellen OMPL-Dokumentation und im OMPL Primer
. In diesem Fall werden pipelinedie Parameter demo.launchals Parameter in als Parameter pass_all_args="true"übergeben move_group.launch.

Allow_trajectory_execution

  <arg name="allow_trajectory_execution" default="true"/>
  # 设置 allow_trajectory_execution 为 true,
  # 可以让 move_group 在运行过程中尝试让机器人执行这些预定义的轨迹
  # 但如果该参数设置为 false,则只会规划但不会执行规划的轨迹,机器人将保持静止
  # 此功能对于测试和调试非常有用,因为它允许操纵轨迹,而无需在机器人上实际执行它们
  # 它在关注安全的情况下也很有用,因为它提供了一种防止意外执行危险轨迹的方法

In diesem Fall werden allow_trajectory_executiondie Parameter in demo.launchals include file="$(dirname)/move_group.launch"Parameter als Parameter argübergeben move_group.launch.

moveit_controller_manager

  <arg name="moveit_controller_manager" default="simple" />
  # moveit_controller_manager:选择控制器管理器的类型,在move_group中默认值为“simple”。
  # 控制器管理器用于加载和配置机器人的控制器。
  # MoveIt提供了几种类型的控制器管理器,包括“fake”,“simple”和“ros_control”。

Zu den von MoveIt bereitgestellten Controller-Managern gehören die folgenden drei Typen:

  1. fake: Diese Art von Steuerung simuliert nur Bewegungen und kommuniziert nicht mit dem echten Roboter. Es wird häufig für schnelle Tests und Demonstrationen verwendet, und für Simulationen werden häufig gefälschte Controller verwendet, um Bewegungen zu simulieren.

  2. simple: Dieser Steuerungstyp kommuniziert mit dem Roboter, bietet jedoch nur grundlegende Steuerung wie Linear-/Bogeninterpolation usw. Es funktioniert gut für einige einfachere Roboter.

  3. ros_control: Dies ist ein flexiblerer Steuerungstyp, der eine Vielzahl von Roboter- und Steuerungshardware unterstützt. Es bietet übergeordnete Steuerungsschnittstellen, z. B. Motorsteuerungsschnittstellen und Sensorleseschnittstellen.
    Abhängig vom Anwendungsszenario und den Anforderungen des Roboters kommen unterschiedliche Arten von Controller-Managern zum Einsatz.

In diesem Fall werden moveit_controller_managerdie Parameter in als Parameter übergeben .demo.launchpass_all_args="true"move_group.launch

move_group.launchDieser Parameter ist in der Standardeinstellung auf , simpleda er ausschließlich zum Testen von Plug-Ins in RViz verwendet wird. Beim demo.launchStart durch ist der Controller-Typ .fakedemo.launchMotionPlanningdemo.launchmove_group.launchfake

fake_execution_type

<arg name="fake_execution_type" default="interpolate" />
  # fake_execution_type:设置虚拟控制器的执行模式。
  # 如果选择“fake”控制器管理器,则使用虚拟控制器进行模拟运动。
  # 此参数指定用于虚拟运动的执行模式,包括“interpolate”,“last point。默认值为“interpolate”。

interpolate: Diese Option gibt an, dass MoveIt davon ausgeht, dass der Controller zwischen jedem Zielpunkt der Flugbahn interpoliert. Diese Methode kann den kontinuierlichen Trajektorienausführungsprozess simulieren.

last point: Diese Option gibt an, dass MoveIt davon ausgeht, dass der Controller direkt zum letzten Zielpunkt der Flugbahn springt. Mit dieser Methode können Roboter simuliert werden, die Aufgaben schnell ausführen. In dem Dokument wurden zwei Beschreibungen gefunden, und es ist ungewiss, ob es eine dritte gibt,
die mit der Beschreibung in der offiziellen Dokumentation übereinstimmt . Eine detaillierte Beschreibung finden Sie jedoch im offiziellen Dokument von Moveit . Sie können sich auf das offizielle Dokument von Moveit1 Noetic beziehenlaunch/fake_moveit_controller_manager.launch.xmlvia pointsfake controller
fake controller

MoveIt bietet eine Reihe virtueller Track-Controller, die in Simulationen verwendet werden können. Darunter befindet sich die Konfigurationsdatei des virtuellen Controllers config/fake_controllers.yaml.

Folgende Reglertypen können je nach Bedarf angepasst werden:

  • interpolate: Führt eine reibungslose Interpolation über wichtige Punkte durch, Standardeinstellung für die Visualisierung.
  • via points: Durchqueren Sie wichtige Punkte, ohne Punkte dazwischen zu interpolieren, und verwenden Sie sie für visuelles Debuggen.
  • last point: Springen Sie für Offline-Benchmarking direkt zum letzten Punkt der Flugbahn.

Informationen zum Typ des virtuellen Controllers können fake_controllers.yamlin der Datei konfiguriert werden. Für jeden Controller müssen Sie den Namen, den Typ und die beteiligten Gelenke angeben. wobei die Frequenz ist rate: 10, die im Interpolationscontroller verwendet werden kann. Aber bei der Steuerung des Greifers sind die Gelenke eine leere Liste [].

Beispiel:

rate: 10
controller_list:
  - name: fake_arm_controller
    type: interpolate
    joints:
      - joint_1
      - joint_2
      - joint_3
      - joint_4
      - joint_5
      - joint_6
  - name: fake_gripper_controller
    joints:
      []

max_safe_path_cost

  <arg name="max_safe_path_cost" default="1"/>
  # max_safe_path_cost:最大安全路径成本,默认为1。
  # 作为参数sense_for_plan/max_safe_path_cost的值被传入move_group节点
  # 这个参数值将影响move_group路径规划的行为。
  # 目前没有发现该值的使用标准和方式,可以不理会。

max_safe_path_costDer Parameter wird verwendet, um den maximalen Kostenparameter für den sicheren Pfad in der Bewegungsgruppe (MoveGroup) festzulegen sense_for_plan/max_safe_path_cost. Dieser Parameter definiert die maximalen Pfadkosten, die die mobile Gruppe bei der Planung des Roboterpfads akzeptieren kann. Die Wegkosten werden anhand von Faktoren wie Hindernissen auf dem Weg und dem Kollisionsrisiko berechnet.

Bei der Pfadplanung versucht MoveIt, basierend auf den gegebenen Zieleinstellungen und Einschränkungen, einen Pfad zu finden, der den Sicherheitsanforderungen entspricht. Wenn die Gesamtkosten (Kosten) des generierten Pfads max_safe_path_costden durch den Parameter angegebenen Schwellenwert überschreiten, betrachtet MoveIt den Pfad als nicht sicher und stoppt die Suche nach weiteren Pfaden. Dies hilft, die Planung unsicherer oder kostspieliger Wege zu vermeiden.

Ein niedrigerer maximaler Kostenschwellenwert für den sicheren Weg führt dazu, dass der Planer vorsichtiger ist und die Vermeidung von Kollisionen und Hindernissen stärker in Betracht zieht, da es leicht ist, den maximalen Kostenschwellenwert für den sicheren Weg zu erreichen und unsicher zu werden.

Höhere maximale Kosten für sichere Pfade können dazu beitragen, die Fähigkeit des Planers, effektive Pfade zu generieren, zu verbessern, da für den Planer bei der Generierung von Pfaden ein toleranterer Kostenbereich für sichere Pfade zur Verfügung steht.

Durch Festlegen von max_safe_path_costParametern können Sie den Planer dazu zwingen, den sichersten Pfad für den vom Roboter generierten Pfad auszuwählen.

Publish_monitored_planning_scene

  <arg name="publish_monitored_planning_scene" default="true"/>
  # 是否发布监视的规划场景,默认为true。

In MoveIt wird es verwendet move_group.launch, <arg name="publish_monitored_planning_scene" default="true"/>um das Planungsszenario festzulegen, ob die Überwachung freigegeben werden soll.

Wenn dieser Parameter auf festgelegt ist true, ist die Veröffentlichung des überwachten Planungsszenarios aktiviert. Das aktuelle Planungsszenario wird in einem bestimmten Thema veröffentlicht. Andere Knoten oder Tools können die neuesten Informationen zum Planungsszenario erhalten, indem sie das Thema abonnieren. Das überwachte Planungsszenario enthält Real - Zeitdaten über Roboter, Hindernisse, Planungsanforderungen und andere relevante Informationen.
Wenn diese aktiviert sind, können Benutzer oder Systeme Änderungen im Planungsszenario in Echtzeit überwachen, analysieren und darauf reagieren, um entsprechend zu verarbeiten, was sehr nützlich ist Visualisierung, Debugging und andere Zwecke funktioniert es.

MoveIt- move_groupKnoten geben während des Planungsprozesses überwachte Planungsszenarien frei, einschließlich planning_scene_monitor/publish_planning_scene, planning_scene_monitor/publish_geometry_updates, planning_scene_monitor/publish_state_updates, planning_scene_monitor/publish_transforms_updates.

Fähigkeiten

  <arg name="capabilities" default=""/>
  <arg name="disable_capabilities" default=""/>
  # 用于设置运动规划组(move_group)的功能和禁用功能的选项
  # 无需理会

<arg name="capabilities">Wird verwendet, um anzugeben, welche Funktionen in der Bewegungsplanungsgruppe aktiviert sind. Zu diesen Funktionen gehört beispielsweise die Planung von Bewegungstrajektorien, die Ausführung von Bewegungstrajektorien, die Ausführung einzelner Bewegungsziele usw. Bestimmte Funktionen können <arg name="capabilities">durch Festlegen des entsprechenden Werts aktiviert werden.

<arg name="disable_capabilities">Wird verwendet, um bestimmte Funktionen in der Bewegungsplanungsgruppe zu deaktivieren. <arg name="disable_capabilities">Sie können Funktionen deaktivieren, die in einer Planungsgruppe nicht erforderlich sind, indem Sie den Wert der Funktion in festlegen . Dies ist nützlich, um die Funktionalität einer Bewegungsplanungsgruppe einzuschränken oder zu vereinfachen.

Diese Optionen ermöglichen die Flexibilität, die Funktionalität der Bewegungsplanungsgruppe von MoveIt basierend auf den Anforderungen der Anwendung zu konfigurieren und anzupassen.

last_greifer

  <!--Other settings-->
  <arg name="load_gripper" default="true" />
  # 指定是否加载机器人夹爪的控制器。此参数用于加载和配置夹爪的运动控制器。默认值为true。

In diesem Fall load_gripperüber demo.launchübergebenpass_all_args="true"move_group.launch

Übertragung

  <arg name="transmission" default="effort" />
  # 设置用于关节控制的传输类型。这个参数用来选择传输类型,例如position、velocity或effort。
  # 默认情况下,这个参数在move_group中被设置为"effort"

In MoveGroup <arg name="transmission" default="effort" />handelt es sich um einen Parameter, der zur Angabe des Übertragungstyps des Roboterarms verwendet wird. Dieser Parameter gibt die Art des Übertragungssystems an, das von der Roboterarmsteuerung (Controller) verwendet wird. Der Standardwert ist „Effort“ (Kraft-/Drehmomentübertragung).

Die Wahl des Übertragungstyps beeinflusst die Art und Weise, wie der Roboterarm in MoveGroup gesteuert wird. Zu den spezifischen Übertragungsarten gehören:

  • Kraftübertragung (Kraft-/Drehmomentübertragung): Bei diesem Übertragungstyp wird davon ausgegangen, dass der Steuereingang des Manipulators Kraft/Drehmoment ist und zur Steuerung des Drehmoments oder der Kraft des Gelenks verwendet wird. Ideal für Anwendungen, die eine bestimmte Kraft oder ein bestimmtes Drehmoment an einem Gelenk erfordern, um eine präzise Steuerung und Kraftmessung zu ermöglichen.
  • Die Geschwindigkeit wird verwendet, um den Aktuator so zu steuern, dass er sich mit einer bestimmten Geschwindigkeit bewegt. Es kann für Aufgaben verwendet werden, die eine gleichmäßige, kontinuierliche Bewegung erfordern.
  • Die Position ist nützlich, um einen Aktuator so zu steuern, dass er sich zu einer bestimmten Position oder einem bestimmten Gelenkwinkel bewegt. Es kann für Aufgaben eingesetzt werden, die eine präzise Positionskontrolle erfordern.

Wenn die Aufgabe die Anwendung einer bestimmten Kraft oder eines bestimmten Drehmoments erfordert, kann die Methode der Kraftsteuerung ausgewählt werden.
Wenn die Aufgabe eine gleichmäßige und kontinuierliche Bewegung erfordert, können Sie die Geschwindigkeitssteuerungsmethode wählen.
Wenn die Aufgabe eine präzise Positionskontrolle erfordert, können Sie die Positionskontrollmethode wählen.
Die Wahl des geeigneten Übertragungstyps hängt von der spezifischen Konfiguration und den Anforderungen des Roboterarms ab. Bei der Konfiguration von MoveGroup können Sie die entsprechenden Parameter entsprechend dem Übertragungssystem des Roboterarms einstellen, um sicherzustellen, dass das richtige Steuersignal an den Roboterarm übertragen wird.

In diesem Fall ist der von transmissionübergebene Wert leer , d. h. der Standardwert wird verwendetdemo.launchpass_all_args="true"move_group.launchdemo.launcheffort

arm_id

  <arg name="arm_id" default="panda" />
  # 机器人的标识符。这个参数指定在机器人有多个实现时使用哪一个。
  # 当多机器人协同时,标识符可以用来区分它们。默认值设置为“panda”

Load_robot_description

  <arg name="load_robot_description" default="true" />
  # 指定是否加载或覆盖机器人描述及joint_limits文件。MoveIt需要知道机器人的描述才能进行规划和控制。
  # 这个参数用于加载机器人的URDF文件或覆盖已有的机器人描述。默认值为true。

load_robot_descriptionLaden Sie die Beschreibungsdatei des Roboters (normalerweise im urdfSDF-Format) in den ROS-Parameterserver. Wenn der Parameter „load_robot_description“ wahr ist, wird die zuvor festgelegte Roboterbeschreibungsdatei geladen oder überschrieben. Wenn „false“, verwenden Sie eine zuvor geladene Roboterbeschreibungsdatei.
robot_descriptionDie Veröffentlichung robot_state_publishererfolgt über Knoten. Dieser Knoten erhält die Beschreibungsinformationen des Roboters vom Parameterserver, berechnet die Transformation jeder Verbindungskomponente des Roboters und veröffentlicht den TF-Baum und die Gelenkstatusinformationen des Roboters. Der Knoten move_group empfängt TF- und Gelenkstatusinformationen für die Bewegungsplanung und -ausführung.

In diesem Fall load_robot_descriptionüber demo.launchübergebenpass_all_args="true"move_group.launch

URDF/SRDF/joint_limits-Konfiguration

  <!-- load URDF, SRDF and joint_limits configuration -->
  <include file="$(dirname)/planning_context.launch">
    <arg name="load_robot_description" value="$(arg load_robot_description)" />
    <arg name="load_gripper" value="$(arg load_gripper)" />
    <arg name="arm_id" value="$(arg arm_id)" />
  </include>

Die verschachtelte Include-Direktive ruft planning_context.launchdie Datei auf und übergibt ihr load_robot_descriptiondie Argumente , load_gripperund .arm_id

planning_context.launch文件的作用是加载URDF(Unified Robot Description Format)SRDF(Semantic Robot Description Format)和关节限制配置joint_limits configuration等相关文件,为机器人的运动规划上下文planning context创建所需的配置和环境。

运动规划管道

 <!-- Planning Pipelines -->
  <group ns="move_group/planning_pipelines">

    <!-- OMPL -->
    <include file="$(dirname)/planning_pipeline.launch.xml">
      <arg name="pipeline" value="ompl" />
      <arg name="arm_id" value="$(arg arm_id)" />
    </include>

    <!-- CHOMP -->
    <include file="$(dirname)/planning_pipeline.launch.xml">
      <arg name="pipeline" value="chomp" />
      <arg name="arm_id" value="$(arg arm_id)" />
    </include>

    <!-- Pilz Industrial Motion -->
    <include file="$(dirname)/planning_pipeline.launch.xml">
      <arg name="pipeline" value="pilz_industrial_motion_planner" />
      <arg name="arm_id" value="$(arg arm_id)" />
    </include>

    <!-- Support custom planning pipeline -->
    <include if="$(eval arg('pipeline') not in ['ompl', 'chomp', 'pilz_industrial_motion_planner'])"
             file="$(dirname)/planning_pipeline.launch.xml">
      <arg name="pipeline" value="$(arg pipeline)" />
      <arg name="arm_id" value="$(arg arm_id)" />
    </include>
  </group>
  # 启动OMPL规划器
  # 启动CHOMP规划器
  # 启动Pilz Industrial Motion规划器
  # 当还有其他自定义的pipeline时,再启动自定义规划器
  # 自定义规划器的文件为 planning_pipeline.launch.xml
  # 启动的规划器包括预定义的规划器(OMPL、CHOMP和Pilz Industrial Motion)以及自定义规划器

同时加载多个规划器的原因

同时启动这三个规划器的目的是为了提供多种选择和灵活性,以适应不同的运动规划需求和算法偏好。每个规划器都有其独特的算法和特点,可以在不同的场景下产生较好的规划结果。

尽管这三个规划器都被加载,但在实际使用过程中,通常只会选择其中一个规划器进行规划任务

这是因为move_group节点启动时,会选择默认的规划器,这个默认的规划器即是用户传入的pipeline参数,只有与其值匹配的规划器才会真正执行规划任务。

 <param name="default_planning_pipeline" value="$(arg pipeline)" />

因此,只有其中一个规划器会被激活,不会发生冲突。通过在配置文件中选择合适的规划器,并将对应的pipeline参数设置为相应的值,可以确保只有需要的规划器被启动和使用。
这种设计让用户能够灵活选择和切换规划器,以满足其特定的需求和实际情况。

同时,对于GUI控制,通过在RVizMotionPlanning插件中的Context部分可以切换规划

轨迹执行器

  <!-- Trajectory Execution Functionality -->
  <include ns="move_group" file="$(dirname)/trajectory_execution.launch.xml" pass_all_args="true" if="$(arg allow_trajectory_execution)">
    <arg name="moveit_manage_controllers" value="true" />
  </include>
  # 当allow_trajectory_execution=true时,也就是允许轨迹执行时
  # 启动trajectory_execution.launch.xml文件
  # 这个文件负责运行MoveIt的轨迹执行功能
  # 将moveit_manage_controllers参数设置为`true`表示由MoveIt来管理控制器

文件trajectory_execution.launch.xml用于配置MoveIt的轨迹执行器trajectory_execution。而moveit_manage_controllers参数用于控制MoveIt对底层机器人控制器的管理方式。

具体来说,
moveit_manage_controllers="true"意味着MoveIt将管理整个机器人控制系统(包括底层的控制器),并负责确保控制器在需要时启动,并在不需要时关闭。这是最常用的设置,尤其是在使用单一机器人控制器的情况下。

Dies moveit_manage_controllers="false"bedeutet, dass MoveIt nicht für die Startverwaltung der zugrunde liegenden Robotersteuerung verantwortlich ist. Dies bedeutet, dass Benutzer sich selbst um die Verwaltung des zugrunde liegenden Controllers kümmern müssen. Dieses Setup eignet sich für Benutzer, die bereits über ein separates Controller-Managementsystem verfügen, oder für komplexe Robotersysteme mit mehreren unabhängigen Controllern.

Durch die Konfiguration von moveit_manage_controllersParametern können Sie wählen, ob MoveIt die Robotersteuerung verwalten soll oder ob der Benutzer sie je nach tatsächlicher Situation selbst verwalten soll.

Sensormanager

  <!-- Sensors Functionality -->
  <include ns="move_group" file="$(dirname)/sensor_manager.launch.xml" if="$(arg allow_trajectory_execution)">
    <arg name="moveit_sensor_manager" value="panda" />
  </include>
  # 用于管理各个传感器
  # 当允许轨迹控制时才启动传感器管理器
  # 参数moveit_sensor_manager的作用是指定要使用的传感器管理器的名称或标识符
  # 该参数的值用于告知MoveIt系统应该使用哪个传感器管理器来处理与传感器设备的交互

moveit_sensor_manager

Der Sensormanager moveit_sensor_managerist eine Komponente in Moveit, die für die Kommunikation und Datenverarbeitung mit Sensorgeräten verantwortlich ist. Unterschiedliche Sensorgeräte erfordern möglicherweise unterschiedliche Sensormanager, um ihre spezifischen Anforderungen wie Datenformate, Kommunikationsschnittstellen usw. zu erfüllen. Über moveit_sensor_managerkann der Sensormanager flexibel konfiguriert und an unterschiedliche Sensorgeräte oder Anforderungen angepasst werden.

Allow_trajectory_execution

allow_trajectory_executionWenn „true“, muss der Sensormanager geladen werden.
Dies liegt daran, dass die Phase der Trajektorienausführung die Verwendung von Sensordaten erfordert, um den tatsächlichen Bewegungsausführungsprozess zu überwachen und anzupassen.
Wenn keine Trajektorien ausgeführt werden oder keine Echtzeitüberwachung und Anpassungen basierend auf Sensordaten erforderlich sind, ist das Laden des Sensormanagers möglicherweise nicht erforderlich. Wenn Sie ihn also als Startbedingung verwenden, können Sie den Sensormanager nach Bedarf selektiv laden allow_trajectory_executionund verwenden .

sensor_manager.launch.xml

sensor_manager.launch.xmlDie Funktion besteht darin, die Sensoren in MoveIt zu verwalten. Sie dient der Konfiguration und dem Start von mit MoveIt verbundenen Sensorgeräten. Dazu können Geräte wie Tiefenkameras, Laserscanner oder andere Sensoren gehören. Diese Datei definiert die Parameter des Sensorgeräts, wie z. B. den Sensortyp, das Thema der Veröffentlichung und zugehörige Parametereinstellungen.

move_group.launchDer Zweck des Aufrufs besteht darin sensor_manager.launch.xml, dem MoveIt-System die Interaktion mit Sensorgeräten zu ermöglichen, um während der Bewegungsplanung und -ausführung sensorische Daten zu erhalten. Durch die Einbeziehung von Sensorstartdateien move_group.launchkönnen MoveGroup-Knoten mit Sensorknoten kommunizieren und Sensordaten verwenden, um die Bewegungsplanung und -ausführung zu verbessern oder anzupassen.

move_group-Knoten

  <!-- Start the actual move_group node/action server -->
  <node name="move_group" launch-prefix="$(arg launch_prefix)" pkg="moveit_ros_move_group" type="move_group" respawn="false" output="screen" args="$(arg command_args)">
    # 根据GDB调试器开关的参数作为launch-prefix
    # launch-prefix用于指定在启动节点时添加的前缀命令。这通常用于设置环境变量或传递特定的命令行参数
    # 运行moveit_ros_move_group包中的move_group文件
    # respawn指定节点是否在结束后重新启动。在这里设置为"false",意味着节点在结束后不会重新启动。
    # output指定输出打印到屏幕上,也就是终端窗口里
    # args="$(arg command_args)"用于传递额外的命令行参数给节点。
    # 此处的command_args参数值是--debug
    # 意味着当debug模式开启时会提供详细信息输出模式

X-Server

X-Server ( X Server) ist ein Softwaredienst zur Grafikdarstellung. Er ist eine der Grundkomponenten für die Implementierung grafischer Benutzeroberflächen (GUI) in Linuxund Systemen. UnixDer X-Server verwaltet Grafikanzeigegeräte (wie Monitore, Tastaturen, Mäuse usw.), empfängt Benutzereingaben und stellt die grafische Oberfläche auf dem Monitor dar.
In modernen LinuxSystemen sind die am häufigsten verwendeten X-Server-Implementierungen X.Org Server:

UbuntuDas System verwendetXserver - X Window System display server

X Window SystemEs besteht aus einem Client und einem Server. Der Server X Serverist für die grafische Anzeige verantwortlich, und die Client-Bibliothek sendet Anforderungen zur grafischen Anzeige X Cliententsprechend den vom System festgelegten Umgebungsvariablen DISPLAYan das entsprechende System X Server.
Sie müssen lediglich einen X-Server am Remote-Ende starten und die DISPLAY-Variable auf dem Zielcomputer entsprechend festlegen, um die Remote-Anzeige von Grafiken abzuschließen.

Gängige Anwendungsszenarien sind:

ssh -X username@ubuntu-server-ip

Bei Verwendung können Benutzer ssh -Xdurch Secure Shell(SSH)Ausführen der X11-Weiterleitung das grafische Schnittstellenprogramm auf dem Remote-Server ausführen und auf dem lokalen Computer anzeigen, ohne die grafische Schnittstellensoftware lokal installieren zu müssen.

Dies bedeutet, dass Benutzer über SSH eine Verbindung zum Roboter für die Remote-Serververwaltung herstellen und gleichzeitig das Remote-Programm für die grafische Benutzeroberfläche auf dem lokalen Computer anzeigen und bedienen können . Die grafische Benutzeroberfläche wird auf dem Hauptcomputer angezeigt, der über den SSH-Tunnel verwendet wird X11-Weiterleitung.

Anzeige

    <!-- Set the display variable, in case OpenGL code is used internally -->
    <env name="DISPLAY" value="$(optenv DISPLAY :0)" />

Bei ROS läuft die zur Steuerung des Roboters verwendete Software normalerweise auf dem High-End-Computer und nicht auf der Kante, und normalerweise werden die Bilder nicht auf der Kante angezeigt.
Wenn es um die Anzeige oder Bearbeitung auf einer grafischen Oberfläche geht (z. B. Visualisierung von Robotermodellen, Visualisierung von Ergebnissen der Bewegungsplanung usw.), OpenGLwerden Bibliotheken normalerweise für Zeichenoperationen verwendet.

Durch das Festlegen DISPLAYvon Umgebungsvariablen soll sichergestellt werden, dass der Code move_groupinnerhalb des Knotens die grafische Oberfläche korrekt anzeigenOpenGL kann . Die Umgebungsvariable gibt die Adresse an, die dem Programm mitteilt, wo die grafische Oberfläche angezeigt werden soll. Dies ist die Bezeichnung, die zum Festlegen von Umgebungsvariablen in der ROS-Startdatei verwendet wird. ist eine Funktion in der ROS-Startdatei, mit der Werte aus Systemumgebungsvariablen abgerufen und Standardwerte bereitgestellt werden .DISPLAYX Server
<env>
optenv

In Linuxeinem System (z. B. Ubuntu) DISPLAYgibt die Umgebungsvariable X Serverden Speicherort an und hat normalerweise das Format hostname:display_number.screen_number. Für „local“ X Serverwird es im Allgemeinen verwendet, :0um die standardmäßige erste Anzeige darzustellen.

$(optenv DISPLAY :0)Stellt den aus der Systemumgebungsvariablen erhaltenen Wert dar DISPLAYoder verwendet den Standardwert, wenn er nicht gefunden wird :0.
In diesem Code DISPLAYwird die Umgebungsvariable über das Label gesetzt $(optenv DISPLAY :0).

Wenn der Knoten move_group die Ergebnisse auf der grafischen Oberfläche anzeigen muss, verwendet er auf diese Weise die festgelegte Umgebungsvariable DISPLAY, um mit dem X-Server zu kommunizieren und sicherzustellen, dass der OpenGL-Code die grafische Oberfläche korrekt rendern und anzeigen kann. Auf diese Weise können Benutzer die Bewegungsplanungsergebnisse des Roboters über eine grafische Oberfläche anzeigen und bedienen.

Andere Parameter von move_group

    <param name="allow_trajectory_execution" value="$(arg allow_trajectory_execution)"/>
    <param name="sense_for_plan/max_safe_path_cost" value="$(arg max_safe_path_cost)"/>
    <param name="default_planning_pipeline" value="$(arg pipeline)" />
    <param name="capabilities" value="$(arg capabilities)" />
    <param name="disable_capabilities" value="$(arg disable_capabilities)" />
    # 以下为传入move_group节点的参数,他们在此前被介绍过
    # allow_trajectory_execution 允许轨迹执行
    # sense_for_plan/max_safe_path_cost 最大安全路径代价值
    # default_planning_pipeline 默认的规划流水线
    # capabilities 功能 无需理会
    # disable_capabilities 禁止功能 无需理会

move_group veröffentlicht die Parameter des tatsächlichen Roboterplanungsszenarios

    <!-- Publish the planning scene of the physical robot so that rviz plugin can know actual robot -->
    <param name="planning_scene_monitor/publish_planning_scene" value="$(arg publish_monitored_planning_scene)" />
    <param name="planning_scene_monitor/publish_geometry_updates" value="$(arg publish_monitored_planning_scene)" />
    <param name="planning_scene_monitor/publish_state_updates" value="$(arg publish_monitored_planning_scene)" />
    <param name="planning_scene_monitor/publish_transforms_updates" value="$(arg publish_monitored_planning_scene)" />
  </node>

move_groupDer Knoten ermöglicht es RViz, das Planungsszenario des tatsächlichen Roboters zu verstehen, indem es das Planungsszenario des tatsächlichen Roboters veröffentlicht. Zu den move_groupParametern, die an den Knoten übergeben werden müssen, gehören die folgenden. Diese Parameter steuern die Veröffentlichung des entsprechenden Themas:
planning_scene_monitor/publish_planning_sceneParameter sind dient der Veröffentlichung von Informationen zum aktuellen Planungsszenario. Es veröffentlicht das aktuelle Planungsszenario in Form einer Nachricht, sodass andere Knoten (z. B. Visualisierungstools oder Bewegungsplaner) die aktuellen Planungsszenarioinformationen abonnieren und abrufen können. Dadurch können die aktuellsten Szeneninformationen in Echtzeit an andere Knoten weitergegeben werden, damit diese entsprechende Entscheidungen treffen können.

planning_scene_monitor/publish_geometry_updatesParameter, die zum Veröffentlichen von Aktualisierungen der Objektgeometrieinformationen verwendet werden . Wenn sich die Geometrie eines Objekts ändert (z. B. wenn ein Objekt hinzugefügt oder entfernt wird oder sich seine Form ändert) , werden in diesem Thema die aktualisierten geometrischen Informationen veröffentlicht. Auf diese Weise können andere Knoten die Planungsszene basierend auf Geometrieaktualisierungen anpassen, um sie auf dem neuesten Stand zu halten.

planning_scene_monitor/publish_state_updatesParameter, die zum Veröffentlichen von Aktualisierungen des Bewegungsstatus verwendet werden . Wenn sich der Status des Roboters ändert (z. B. Änderung der Gelenkposition, Aktualisierung des Verbindungsstatus) , werden in diesem Thema die Statusinformationen des Roboters veröffentlicht . Andere Knoten können dieses Thema abonnieren, um die neuesten Informationen zum Roboterstatus zu erhalten und entsprechende Entscheidungen zu treffen.

planning_scene_monitor/publish_transforms_updatesParameter, der zum Veröffentlichen von Aktualisierungen für Koordinatentransformationen verwendet wird . Wenn sich die Koordinatentransformation im Zusammenhang mit dem Roboter ändert, werden in diesem Thema die aktualisierten Informationen der Transformation veröffentlicht. Andere Knoten können dieses Thema abonnieren, um die neuesten Informationen zur Koordinatentransformation zu erhalten, sodass bei der Planung und Ausführung die richtige Koordinatentransformation verwendet werden kann.

Durch die Verwendung dieser Parameter, die offenen und geschlossenen Themen entsprechen, können Szenenaktualisierungen und Statusrückmeldungen in Echtzeit erreicht werden, sodass verschiedene Knoten Planungsszeneninformationen austauschen und koordinieren können, wodurch effektivere Bewegungsplanungs- und Ausführungsfunktionen bereitgestellt werden.

Slice-Analyse 4: Planning_context.launch

planning_context.launchDie Funktion der Datei besteht darin, Roboterbeschreibungen URDF(Unified Robot Description Format), semantische Beschreibungen SRDF(Semantic Robot Description Format), Gelenkgrenzenkonfigurationen joint_limits, kartesische Grenzen cartesian_limits, kinematische Einstellungen und andere zugehörige Dateien zu laden und die erforderliche Konfiguration und Umgebung für die Bewegungsplanung des Roboters einzurichten.

planning_context.launchDie Datei move_group.launchwird als verschachtelte Startdatei in aufgerufen und die Parameter werden move_group.launchdaraus load_robot_description, load_gripperund arm_id.
Der vollständige Code lautet wie folgt:

<launch>
  <!-- By default we do not overwrite the URDF. Change the following to true to change the default behavior -->
  <arg name="load_gripper" default="true" />
  <arg name="load_robot_description" default="false"/>
  <arg name="arm_id" default="panda" />

  <!-- The name of the parameter under which the URDF is loaded -->
  <arg name="robot_description" default="robot_description"/>

  <!-- Load universal robot description format (URDF) -->
  <param name="$(arg robot_description)" command="xacro '$(find franka_description)/robots/panda/panda.urdf.xacro' hand:=$(arg load_gripper) arm_id:=$(arg arm_id)" if="$(arg load_robot_description)" />

  <!-- The semantic description that corresponds to the URDF -->
  <param name="$(arg robot_description)_semantic" command="xacro '$(find panda_moveit_config)/config/panda.srdf.xacro' hand:=$(arg load_gripper) arm_id:=$(arg arm_id)" />

  <!-- Load updated joint limits (override information from URDF) -->
  <group ns="$(arg robot_description)_planning">
    <rosparam command="load" file="$(find panda_moveit_config)/config/joint_limits.yaml" subst_value="true" />
    <rosparam command="load" file="$(find panda_moveit_config)/config/cartesian_limits.yaml" subst_value="true"/>
  </group>

  <!-- Load default settings for kinematics; these settings are overridden by settings in a node's namespace -->
  <group ns="$(arg robot_description)_kinematics">
    <rosparam command="load" file="$(find panda_moveit_config)/config/kinematics.yaml" subst_value="true"/>
  </group>

</launch>

Übergeben Sie Parameter

  <!-- By default we do not overwrite the URDF. Change the following to true to change the default behavior -->
  <arg name="load_gripper" default="true" />
  <arg name="load_robot_description" default="false"/>
  <arg name="arm_id" default="panda" />
  # 是否加载夹爪
  # 是否加载URDF模型
  # 机械臂的id,用作识别机器人的标识

Modell laden

    <!-- The name of the parameter under which the URDF is loaded -->
    <arg name="robot_description" default="robot_description"/>
    # robot_description参数用于存储加载的机器人的URDF描述对应的参数名,无需理会
  <!-- Load universal robot description format (URDF) -->
    <param name="$(arg robot_description)" command="xacro '$(find franka_description)/robots/panda/panda.urdf.xacro' hand:=$(arg load_gripper) arm_id:=$(arg arm_id)" if="$(arg load_robot_description)" />
# 将URDF文件加载为ROS参数
# 这个URDF文件是由xacro命令从panda.urdf.xacro文件来生成的
# 之前引入的hand和arm_id被传给xacro命令作为参数

Wenn es mit dem One-Click-Installationskonfigurationsskript installiert wird franka_description, ist es /opt/ros/noetic/share/franka_description/robots/pandaim Verzeichnis zu findenpanda.urdf.xacro

xacro ist eine XML-Makrosprache. In diesem Fall wird xacro zur Verarbeitung von URDF-Dateien (Unified Robot Description Format) verwendet, wodurch URDF-Dateien modularer und einfacher zu verwalten sind.

hand:=$(arg load_gripper)und arm_id:=$(arg arm_id)werden in die angegebene xacro-Datei übergeben. Diese Parameter werden in der xacro-Datei verwendet, um spezifische URDF-Konfigurationen entsprechend den Anforderungen zu generieren.

panda.urdf.xacro

<?xml version='1.0' encoding='utf-8'?>
# XML的版本和编码声明。所有的XML文件都会以这个声明开始
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="panda">
# 定义一个名为“panda”的机器人。xmlns:xacro指定了xacro命名空间的URL
  <xacro:include filename="$(find franka_description)/robots/common/franka_robot.xacro"/>
# 引入另一个xacro文件,路径是通过find指令找到的
# 这是一种模块化设计,允许将机器人模型分割为更小、更易于管理的部分
  <xacro:arg name="arm_id" default="panda" />
# 定义参数名为"arm_id",并设置其默认值为"panda",如果有外部值传入,则为外部传入的值

  <xacro:franka_robot arm_id="$(arg arm_id)"
                 joint_limits="${xacro.load_yaml('$(find franka_description)/robots/panda/joint_limits.yaml')}">
# 调用franka_robot.xacro宏,并将参数arm_id和joint_limits传入
  </xacro:franka_robot>

</robot>

franka_robot.xacro

Im panda.urdf.xacrobeigefügten Urteil franka_robot.xacrolautet das Urteil für den Handruf wie folgt:

    <xacro:if value="$(arg hand)">
      <xacro:include filename="$(find franka_description)/robots/common/franka_hand.xacro"/>
      <xacro:franka_hand
          arm_id="$(arg arm_id)"
          rpy="0 0 ${-pi/4}"
          tcp_xyz="$(arg tcp_xyz)"
          tcp_rpy="$(arg tcp_rpy)"
          connected_to="$(arg arm_id)_link8"
          safety_distance="0.03"
          gazebo="$(arg gazebo)"
       />
    </xacro:if>

Daher wird hand:=$(arg load_gripper)und an die angegebene xacro-Datei übergeben, um zu bestimmen, ob der Greifer geladen und die arm_id festgelegt werden muss.arm_id:=$(arg arm_id)

SRDF laden

    <!-- The semantic description that corresponds to the URDF -->
    <param name="$(arg robot_description)_semantic" command="xacro '$(find panda_moveit_config)/config/panda.srdf.xacro' hand:=$(arg load_gripper) arm_id:=$(arg arm_id)" />
# 加载SRDF (Semantic Robot Description Format) 文件到ROS参数服务器

SRDF-Dateien enthalten normalerweise allgemeine Informationen über den Roboter. Im Fall von Moveit werden sie von SetupAssistant generiert, einschließlich Dinge wie Gruppen, Ketten usw. SRDF-Dateien werden mit dem Befehl xacro auch aus Xacro-Makros konvertiert.

Gemeinsame Grenzen und kartesische Grenzen

Wird verwendet, um die relevanten Grenzwertinformationen in URDF zu überschreiben

    <!-- Load updated joint limits (override information from URDF) -->
    <group ns="$(arg robot_description)_planning">
      <rosparam command="load" file="$(find panda_moveit_config)/config/joint_limits.yaml" subst_value="true" />
      <rosparam command="load" file="$(find panda_moveit_config)/config/cartesian_limits.yaml" subst_value="true"/>
    </group>
# 加载限位数据到ROS参数服务器的robot_description_planning参数

Kinematikbezogene Einstellungen

    <!-- Load default settings for kinematics; these settings are overridden by settings in a node's namespace -->
    <group ns="$(arg robot_description)_kinematics">
      <rosparam command="load" file="$(find panda_moveit_config)/config/kinematics.yaml" subst_value="true"/>
    </group>
# 加载运动学相关参数到ROS参数服务器的robot_description_kinematics参数    

Slice-Analyse 5: Planning_pipeline.launch.xml

这个文件在move_group.launch中关于pipeline的部分被调用,它用于调用对应的<pipeline_name>_pipeline.launch.xml,例如ompl_planning_pipeline.launch.xml
move_group.launch,它调用了四个pipeline,包括omplchomppilz_industrial_motion_planner自定义pipeline、可以将它视作各种pipeline调用的统一的接口,以下是这个文件的内容:

<launch>

  <!-- This file makes it easy to include different planning pipelines;
       It is assumed that all planning pipelines are named XXX_planning_pipeline.launch  -->

  <arg name="pipeline" default="ompl" />
  <arg name="arm_id" default="panda" />

  <include ns="$(arg pipeline)" file="$(dirname)/$(arg pipeline)_planning_pipeline.launch.xml" pass_all_args="true"/>

</launch>

例如,当传入的pipeline参数为ompl时,启动对应的ompl_planning_pipeline.launch.xml文件,这使得不同规划库的planning_pipeline.launch.xml易于管理,通过planning_pipeline.launch.xml来专门进行调用。
Fügen Sie hier eine Bildbeschreibung ein

切片解析6: ompl_planning_pipeline.launch.xml

<launch>

    <!-- The request adapters (plugins) used when planning with OMPL. ORDER MATTERS! -->
    <arg name="planning_adapters"
         default="default_planner_request_adapters/AddTimeParameterization
                  default_planner_request_adapters/ResolveConstraintFrames
                  default_planner_request_adapters/FixWorkspaceBounds
                  default_planner_request_adapters/FixStartStateBounds
                  default_planner_request_adapters/FixStartStateCollision
                  default_planner_request_adapters/FixStartStatePathConstraints"
                  />
  
    <arg name="start_state_max_bounds_error" default="0.1" />
    <arg name="jiggle_fraction" default="0.05" />
    <arg name="arm_id" default="panda" />
  
    <param name="planning_plugin" value="ompl_interface/OMPLPlanner" />
    <param name="request_adapters" value="$(arg planning_adapters)" />
    <param name="start_state_max_bounds_error" value="$(arg start_state_max_bounds_error)" />
    <param name="jiggle_fraction" value="$(arg jiggle_fraction)" />
  
    <!-- Add MoveGroup capabilities specific to this pipeline -->
    <!-- <param name="capabilities" value="" /> -->
  
    <rosparam command="load" file="$(find panda_moveit_config)/config/ompl_planning.yaml" subst_value="true"/>
  
  </launch>

规划适配器插件

    <!-- The request adapters (plugins) used when planning with OMPL. ORDER MATTERS! -->
    <arg name="planning_adapters"
         default="default_planner_request_adapters/AddTimeParameterization
                  default_planner_request_adapters/ResolveConstraintFrames
                  default_planner_request_adapters/FixWorkspaceBounds
                  default_planner_request_adapters/FixStartStateBounds
                  default_planner_request_adapters/FixStartStateCollision
                  default_planner_request_adapters/FixStartStatePathConstraints"
                  />

定义了一个名为planning_adapters的参数,并为其设置了默认值。此默认值是一个列表。

在MoveIt中,规划适配器(planning adapters) 是指一种特定的插件,用于在规划请求发送到规划器之前规划器生成路径后修改规划请求规划响应

在上述代码中,planning_adapters参数包含了六个默认的适配器,它们分别负责处理不同类型的问题。例如,AddTimeParameterization用于给规划的轨迹添加时间参数,这是因为大多数规划器只关心空间,而不关心时间。
其他适配器例如FixWorkspaceBoundsFixStartStateBoundsFixStartStateCollisionFixStartStatePathConstraintsResolveConstraintFrames等,分别用于修正工作空间边界,修正开始状态边界,修正开始状态碰撞,修正开始状态路径约束以及解决约束帧问题。

其他参数

<arg name="start_state_max_bounds_error" default="0.1" />
# 机器人开始状态的最大边界错误
# 默认值被设置为0.1

Während des Bewegungsplanungsprozesses ist der aktuelle Zustand des Roboters sein Ausgangszustand.
Aufgrund von Sensorfehlern und anderen Unsicherheiten kann es zu Abweichungen zwischen diesem Ausgangszustand und dem tatsächlichen Zustand des Roboters kommen. Dieser Parameter wird verwendet, um diese Lücke zu begrenzen. Wenn er diesen Wert überschreitet, versucht MoveIt, den Ausgangszustand so zu reparieren, dass er diese Grenzfehleranforderung erfüllt.

<arg name="jiggle_fraction" default="0.05" />
# 开始状态调整时所允许的最大变化幅度
# 默认值被设置为0.05

Dieser Parameter ist bei der Reparatur des Ausgangszustandes sehr wichtig.
Wenn der Startzustand des Roboters aus irgendeinem Grund nicht den Anforderungen der Bewegungsplanung entspricht (z. B. wenn sich der Startzustand des Roboters in einem Kollisionszustand befindet), versucht MoveIt, die Gelenke des Roboters so zu justieren („zu wackeln“), dass die Bewegungen des Roboters nicht möglich sind Der Startzustand erfüllt die geplanten Bewegungsanforderungen. Erforderlich.
Dieser Parameter gibt die maximal zulässige Änderung für jedes Gelenk während dieses Feinabstimmungsprozesses an, ausgedrückt als Prozentsatz des Bewegungsbereichs des Gelenks.
Wenn der Wert beispielsweise auf 0,01 eingestellt ist, kann sich der Winkel jedes Gelenks während der Feinabstimmung nur innerhalb von 1 % seines Bewegungsbereichs ändern.

<arg name="arm_id" default="panda" />
# 机械臂id,用于指定运动规划所涉及的机器臂

In den ROS-Parameterserver geladene Parameter

<param name="planning_plugin" value="ompl_interface/OMPLPlanner" />
# 设置ROS参数planning_plugin的值为ompl_interface/OMPLPlanner
# 这表示运动规划将使用OMPL库进行
<param name="request_adapters" value="$(arg planning_adapters)" />
<param name="start_state_max_bounds_error" value="$(arg start_state_max_bounds_error)" />
<param name="jiggle_fraction" value="$(arg jiggle_fraction)" />
# 将之前设置的arg参数值作为值填入这几个ROS参数服务器的参数
<rosparam command="load" file="$(find panda_moveit_config)/config/ompl_planning.yaml" subst_value="true"/>
# 加载ompl_planning.yaml文件
# 该文件包含了用于OMPL运动规划库的具体参数配置

Slice-Analyse 7: trajectory_execution.launch.xml

trajectory_execution.launch.xmlKonfigurieren Sie einige Parameter für die Ausführung der Bewegungstrajektorie

<launch>
    <!-- This file summarizes all settings required for trajectory execution  -->
  
    <!-- Define moveit controller manager plugin: fake, simple, or ros_control -->
    <arg name="moveit_controller_manager" />
    <arg name="fake_execution_type" default="interpolate" />
  
    <!-- Flag indicating whether MoveIt is allowed to load/unload  or switch controllers -->
    <arg name="moveit_manage_controllers" default="true"/>
    <param name="moveit_manage_controllers" value="$(arg moveit_manage_controllers)"/>
  
    <!-- When determining the expected duration of a trajectory, this multiplicative factor is applied to get the allowed duration of execution -->
    <param name="trajectory_execution/allowed_execution_duration_scaling" value="1.2"/> <!-- default 1.2 -->
    <!-- Allow more than the expected execution time before triggering a trajectory cancel (applied after scaling) -->
    <param name="trajectory_execution/allowed_goal_duration_margin" value="0.5"/> <!-- default 0.5 -->
    <!-- Allowed joint-value tolerance for validation that trajectory's first point matches current robot state -->
    <param name="trajectory_execution/allowed_start_tolerance" value="0.01"/> <!-- default 0.01 -->
  
    <!-- We use pass_all_args=true here to pass fake_execution_type, which is required by fake controllers, but not by real-robot controllers.
         As real-robot controller_manager.launch files shouldn't be required to define this argument, we use the trick of passing all args. -->
    <include file="$(dirname)/$(arg moveit_controller_manager)_moveit_controller_manager.launch.xml" pass_all_args="true" />
  
  </launch>

Controller-Manager

    <!-- Define moveit controller manager plugin: fake, simple, or ros_control -->
<arg name="moveit_controller_manager" />
# moveit_controller_manager参数用于指定MoveIt!控制器管理器插件的名称
# 可选的值为:fake, simple, or ros_control

Zu den von MoveIt bereitgestellten Controller-Managern gehören die folgenden drei Typen:

  1. fake: Diese Art von Steuerung simuliert nur Bewegungen und kommuniziert nicht mit dem echten Roboter. Es wird häufig für schnelle Tests und Demonstrationen verwendet, und für Simulationen werden häufig gefälschte Controller verwendet, um Bewegungen zu simulieren.

  2. simple: Dieser Steuerungstyp kommuniziert mit dem Roboter, bietet jedoch nur grundlegende Steuerung wie Linear-/Bogeninterpolation usw. Es funktioniert gut für einige einfachere Roboter.

  3. ros_control: Dies ist ein flexiblerer Steuerungstyp, der eine Vielzahl von Roboter- und Steuerungshardware unterstützt. Es bietet übergeordnete Steuerungsschnittstellen, z. B. Motorsteuerungsschnittstellen und Sensorleseschnittstellen.
    Abhängig vom Anwendungsszenario und den Anforderungen des Roboters kommen unterschiedliche Arten von Controller-Managern zum Einsatz.
    ros_control ist eine leistungsstarke Steuerung für Roboter. Weitere Informationen finden Sie im WIKI-Dokument ros_control und im Quellcode von ros_control.

Ausführungsmodus des virtuellen Controllers

<arg name="fake_execution_type" default="interpolate" />
  # fake_execution_type:设置虚拟控制器的执行模式。
  # 如果选择“fake”控制器管理器,则使用虚拟控制器进行模拟运动。
  # 此参数指定用于虚拟运动的执行模式,包括“interpolate”,“last point。默认值为“interpolate”。

interpolate: Diese Option gibt an, dass MoveIt davon ausgeht, dass der Controller zwischen jedem Zielpunkt der Flugbahn interpoliert. Diese Methode kann den kontinuierlichen Trajektorienausführungsprozess simulieren.

last point: Diese Option gibt an, dass MoveIt davon ausgeht, dass der Controller direkt zum letzten Zielpunkt der Flugbahn springt. Mit dieser Methode können Roboter simuliert werden, die Aufgaben schnell ausführen. In dem Dokument wurden zwei Beschreibungen gefunden, und es ist ungewiss, ob es eine dritte gibt,
die mit der Beschreibung in der offiziellen Dokumentation übereinstimmt . Eine detaillierte Beschreibung finden Sie jedoch im offiziellen Dokument von Moveit . Sie können sich auf das offizielle Dokument von Moveit1 Noetic beziehenlaunch/fake_moveit_controller_manager.launch.xmlvia pointsfake controller
fake controller

MoveIt bietet eine Reihe virtueller Track-Controller, die in Simulationen verwendet werden können. Darunter befindet sich die Konfigurationsdatei des virtuellen Controllers config/fake_controllers.yaml.

Folgende Reglertypen können je nach Bedarf angepasst werden:

  • interpolate: Führt eine reibungslose Interpolation über wichtige Punkte durch, Standardeinstellung für die Visualisierung.
  • via points: Durchqueren Sie wichtige Punkte, ohne Punkte dazwischen zu interpolieren, und verwenden Sie sie für visuelles Debuggen.
  • last point: Springen Sie für Offline-Benchmarking direkt zum letzten Punkt der Flugbahn.

Informationen zum Typ des virtuellen Controllers können fake_controllers.yamlin der Datei konfiguriert werden. Für jeden Controller müssen Sie den Namen, den Typ und die beteiligten Gelenke angeben. wobei die Frequenz ist rate: 10, die im Interpolationscontroller verwendet werden kann. Aber bei der Steuerung des Greifers sind die Gelenke eine leere Liste [].

Beispiel:

rate: 10
controller_list:
  - name: fake_arm_controller
    type: interpolate
    joints:
      - joint_1
      - joint_2
      - joint_3
      - joint_4
      - joint_5
      - joint_6
  - name: fake_gripper_controller
    joints:
      []

Verwaltungsrechte der Verantwortlichen

    <!-- Flag indicating whether MoveIt is allowed to load/unload  or switch controllers -->
    <arg name="moveit_manage_controllers" default="true"/>
    <param name="moveit_manage_controllers" value="$(arg moveit_manage_controllers)"/>

move_gruop.launchDer Parameter in ist moveit_manage_controllersauf gesetzt true, was bedeutet, dass MoveIt den Controller verwaltet.
Dieser Parameter wird dann an übergeben trajectory_execution.launch.xml, definiert einen Parameter und legt ihn als ROS-Parameter fest. Der Parametername lautet moveit_manage_controllers und der Standardwert ist „true“.
Wenn dieser Parameter „true“ ist, hat MoveIt die Berechtigung, Controller zu laden/entladen oder zu wechseln .
Unterschiedliche Aufgaben oder unterschiedliche Phasen einer Aufgabe erfordern möglicherweise die Verwendung unterschiedlicher Controller. Beispielsweise könnte ein Controller für die präzise Positionssteuerung verwendet werden, während ein anderer für die Kraftsteuerung verwendet werden könnte. Durch den dynamischen Controllerwechsel kann sich MoveIt! besser an unterschiedliche Aufgabenanforderungen anpassen.
Daher ist diese Option normalerweise erforderlich, wenn ros_control auf einem echten Roboter oder einem Emulator ausgeführt wird.

Begrenzende Parameter für die Trajektorienausführung

<!-- When determining the expected duration of a trajectory, this multiplicative factor is applied to get the allowed duration of execution -->
<param name="trajectory_execution/allowed_execution_duration_scaling" value="1.2"/> <!-- default 1.2 -->

allowed_execution_duration_scalingDer Parameter ist der Skalierungsfaktor der zulässigen Ausführungszeit der Bewegungstrajektorie und der Standardwert ist 1,2. Dieser Parameter wird verwendet, um den Skalierungsfaktor bei der Berechnung der erwarteten Zeit der Bewegungstrajektorie zu multiplizieren, um die zulässige Ausführungszeit zu erhalten.

<!-- Allow more than the expected execution time before triggering a trajectory cancel (applied after scaling) -->
<param name="trajectory_execution/allowed_goal_duration_margin" value="0.5"/> <!-- default 0.5 -->

allowed_goal_duration_marginDer Parameter ist der Toleranzbereich der zulässigen Ausführungszeit der Bewegungstrajektorie. Der Standardwert beträgt 0,5 Sekunden. Wenn die Ausführungszeit der Trajektorie die erwartete Zeit zuzüglich dieses Toleranzbereichs überschreitet, wird der Vorgang zum Aufheben der Trajektorie ausgelöst.

<!-- Allowed joint-value tolerance for validation that trajectory's first point matches current robot state -->
<param name="trajectory_execution/allowed_start_tolerance" value="0.01"/> <!-- default 0.01 -->

allowed_start_toleranceDer Parameter ist der Toleranzbereich der zulässigen Gelenkwerte für den Startpunkt der Bewegungstrajektorie. Der Standardwert ist 0,1. MoveIt! prüft, ob der Startpunkt der Trajektorie mit dem aktuellen Status des Roboters übereinstimmt. Wenn die Differenz diesen Toleranzbereich überschreitet, wird die Trajektorie als illegal betrachtet.

Aufruf der Startdatei des Controller-Managers

    <!-- We use pass_all_args=true here to pass fake_execution_type, which is required by fake controllers, but not by real-robot controllers.
         As real-robot controller_manager.launch files shouldn't be required to define this argument, we use the trick of passing all args. -->
    <include file="$(dirname)/$(arg moveit_controller_manager)_moveit_controller_manager.launch.xml" pass_all_args="true" />

moveit_controller_managerdemo.launchWird in angegeben und an fakeübergeben , überschreibt der Standardparameterwert in und wird dann an übergeben und dient zur Auswahl des durch den Parameter angegebenen Controllertyps.pass_all_args="true"move_group.launchmove_group.launchmoveit_controller_managersimplemove_group.launchpass_all_args="true"trajectory_execution.launch.xmltrajectory_execution.launch.xml

moveit_controller_managerWenn der Parameter beispielsweise lautet fake, wird die Datei aufgerufen fake_moveit_controller_manager.launch.xml.
Fügen Sie hier eine Bildbeschreibung ein

Slice-Analyse 8: fake_moveit_controller_manager.launch.xml

fake_moveit_controller_manager.launch.xmlEs wird aufgerufen, trajectory_execution.launch.xmlweil moveit_controller_managerder Parameter lautet fake, und fake_moveit_controller_manager.launch.xmlwird daher unter den drei Controller-Managern (fake, simple, ros_control) ausgewählt.

Es dient zum Starten eines Simulationscontrollers.

<launch>

    <!-- execute the trajectory in 'interpolate' mode or jump to goal position in 'last point' mode -->
    <arg name="fake_execution_type" default="interpolate" />
  
    <!-- Set the param that trajectory_execution_manager needs to find the controller plugin -->
    <param name="moveit_controller_manager" value="moveit_fake_controller_manager/MoveItFakeControllerManager"/>
  
    <!-- The rest of the params are specific to this plugin -->
    <rosparam subst_value="true" file="$(find panda_moveit_config)/config/fake_controllers.yaml"/>
  
  </launch>

subst_value="true"Die Funktion besteht darin, den Pfad in der Startdatei zu ersetzen. Wenn subst_valueauf eingestellt ist , ersetzt die Startdatei den truePfad in ihrem Pfad durch den tatsächlichen ROS-Paketpfad, bevor die Parameterdatei geladen wird . Wenn das Attribut nicht bereitgestellt wird, führt das Rosparam-Element standardmäßig die Aktion aus$(find panda_moveit_config)
commandcommand="load"

Ausführungsmodus des virtuellen Controllers

    <!-- execute the trajectory in 'interpolate' mode or jump to goal position in 'last point' mode -->
    <arg name="fake_execution_type" default="interpolate" />
# fake_execution_type参数的值决定了执行轨迹的方式
# "interpolate"表示在模拟环境中,机器人会执行完整的轨迹
# 如果值设置为"last point",那么机器人将直接跳到目标位置。

Controller-Manager-Parameter für den ROS-Parameterserver

    <!-- Set the param that trajectory_execution_manager needs to find the controller plugin -->
    <param name="moveit_controller_manager" value="moveit_fake_controller_manager/MoveItFakeControllerManager"/>
# 设置ROS参数moveit_controller_manager
# 值为moveit_fake_controller_manager/MoveItFakeControllerManager
# 这个参数是用于指定控制器管理器的插件名称,这里使用的是MoveIt提供的虚拟控制器

Laden Sie fake_controllers.yaml auf den Parameterserver

    <!-- The rest of the params are specific to this plugin -->
    <rosparam subst_value="true" file="$(find panda_moveit_config)/config/fake_controllers.yaml"/>
# 加载了/config/fake_controllers.yaml配置文件
# 这个YAML文件包含了模拟控制器的配置信息

subst_value="true"Die Funktion besteht darin, den Pfad in der Startdatei zu ersetzen. Wenn subst_valueauf eingestellt ist , ersetzt die Startdatei den truePfad in ihrem Pfad durch den tatsächlichen ROS-Paketpfad, bevor die Parameterdatei geladen wird . Wenn das Attribut nicht bereitgestellt wird, führt das Rosparam-Element standardmäßig die Aktion aus$(find panda_moveit_config)
commandcommand="load"

config/fake_controllers.yaml

controller_list:
  - name: fake_$(arg arm_id)_arm_controller
    type: $(arg fake_execution_type)
    joints:
      - $(arg arm_id)_joint1
      - $(arg arm_id)_joint2
      - $(arg arm_id)_joint3
      - $(arg arm_id)_joint4
      - $(arg arm_id)_joint5
      - $(arg arm_id)_joint6
      - $(arg arm_id)_joint7

  - name: fake_$(arg arm_id)_hand_controller
    type: $(arg fake_execution_type)
    joints:
      - $(arg arm_id)_finger_joint1

initial:  # Define initial robot poses per group
  - group: $(arg arm_id)_arm
    pose: ready
  - group: $(arg arm_id)_hand
    pose: open

fake_controllers.yamlDie Datei definiert einige virtuelle Controller und anfängliche Roboterposen für die Bewegungsplanung und -steuerung in ROS MoveIt.

  1. controller_list: Dies ist eine Controller-Liste mit zwei definierten virtuellen Controllern, nämlich fake_$(arg arm_id)_arm_controllerund fake_$(arg arm_id)_hand_controller. Mit diesen Controllern wird die Bewegungssteuerung von Robotern simuliert.

    • name: Der Name des Controllers, der $(arg arm_id)Parameterersetzungen enthält, d. h. unterschiedliche Controller-Namen werden dynamisch basierend auf den tatsächlichen Parameterwerten generiert.
    • type$(arg fake_execution_type): Der Controller-Typ, der Parameterersetzung beinhaltet , d. h. die dynamische Einstellung verschiedener Controller-Typen basierend auf tatsächlichen Parameterwerten.
    • joints: Eine Liste der vom Controller gesteuerten Gelenke, die $(arg arm_id)Parameterersetzungen enthält, dh unterschiedliche Gelenknamen werden dynamisch basierend auf den tatsächlichen Parameterwerten generiert.
  2. initial: Dies ist eine Liste der anfänglichen Roboterposen, die den Ausgangszustand des Roboters definieren. In diesem Beispiel werden zwei Anfangsposen definiert, nämlich $(arg arm_id)_armund $(arg arm_id)_hand.

    • group: Die Robotergruppe, zu der die Haltung gehört, enthält $(arg arm_id)Parameterersetzungen, d. h. unterschiedliche Robotergruppennamen werden dynamisch basierend auf den tatsächlichen Parameterwerten generiert.
    • pose: Der Name der Haltung, der den Status des Roboters angibt. In diesem Beispiel sind readybzw. open.

Der spezifische Inhalt dieser Datei wird dynamisch basierend auf den tatsächlichen Parameterwerten generiert, und die Parameterwerte hängen von der Laufzeitkonfiguration ab. Mithilfe dieser virtuellen Controller und Ausgangspositionen können Roboter mit unterschiedlichen Gelenken und Gruppen in ROS MoveIt simuliert und gesteuert werden.

Slice-Analyse 9: sensor_manager.launch.xml

Diese Startdatei ist für die Initialisierung des Sensormanagers verantwortlich, einschließlich des Ladens von Sensortypen, des Festlegens von Octomap-Parametern, des Festlegens der maximalen Erkennungsentfernung des Sensors und enthält die Startdatei des Sensormanagers für einen bestimmten Roboter (Panda).

<launch>

    <!-- This file makes it easy to include the settings for sensor managers -->
  
    <!-- Params for 3D sensors config: '' | pointcloud | depthmap -->
    <arg name="sensor_type" default="" />
    <rosparam if="$(eval arg('sensor_type')  != '')" command="load" file="$(find panda_moveit_config)/config/sensors_kinect_$(arg sensor_type).yaml" />
  
    <!-- Params for the octomap monitor -->
    <!--  <param name="octomap_frame" type="string" value="some frame in which the robot moves" /> -->
    <param name="octomap_frame" type="string" value="camera_rgb_optical_frame" />
    <param name="octomap_resolution" type="double" value="0.025" />
    <param name="max_range" type="double" value="5.0" />
  
    <!-- Load the robot specific sensor manager; this sets the moveit_sensor_manager ROS parameter -->
    <arg name="moveit_sensor_manager" default="panda" />
    <include file="$(dirname)/$(arg moveit_sensor_manager)_moveit_sensor_manager.launch.xml" />
  
  </launch>

Sensoren auf den ROS-Parameterserver laden

    <!-- Params for 3D sensors config: '' | pointcloud | depthmap -->
    <arg name="sensor_type" default="" />
    <rosparam if="$(eval arg('sensor_type')  != '')" command="load" file="$(find panda_moveit_config)/config/sensors_kinect_$(arg sensor_type).yaml" />
# 通过设置"sensor_type"的参数来设定使用的传感器类型
# 支持的传感器类型为depthmap、空和pointcloud
# 其默认值为空
# 如果默认值不为空将载入对应的sensors_kinect_$(arg sensor_type).yaml到ROS参数服务器

Fügen Sie hier eine Bildbeschreibung ein

config/sensors_kinect_ Depthmap.yaml

Nehmen Sie den Anruf sensors_kinect_depthmap.yamlals Beispiel

sensors:
  - sensor_plugin: occupancy_map_monitor/DepthImageOctomapUpdater
    image_topic: /camera/depth_registered/image_raw
    queue_size: 5
    near_clipping_plane_distance: 0.3
    far_clipping_plane_distance: 5.0
    shadow_threshold: 0.2
    padding_scale: 4.0
    padding_offset: 0.03
    max_update_rate: 1.0
    filtered_cloud_topic: filtered_cloud
    ns: kinect

YAMLEs handelt sich um ein Datenserialisierungsformat, das gut lesbar ist und sich für Szenarien wie Konfigurationsdateien, Datenaustausch, Definition von Sprachen oder Serialisierung von Objekten eignet. Die Syntax ist so konzipiert, dass sie leicht zu lesen und zu schreiben ist.
In YAML müssen Leerzeichen zum Einrücken verwendet werden, keine Tabulatoren. Elemente auf derselben Ebene müssen denselben Einzug haben.

  • -Symbol: Zeigt den Anfang eines Listenelements an. In dieser Datei - sensor_plugin: occupancy_map_monitor/DepthImageOctomapUpdaterist der dem Schlüssel „Sensoren“ entsprechende Wert eine Liste, die mit einem Element der Liste beginnt. Der Inhalt danach -stellt den Inhalt dieses Listenelements dar.

Diese YAML-Datei wird zum Konfigurieren des Tiefenbildsensors Kinect verwendet, der vom Panda-Roboterarm in ROS MoveIt verwendet wird.

  1. sensor_plugin: occupancy_map_monitor/DepthImageOctomapUpdater

    这一行指定了处理传感器数据的插件。在这里使用occupancy_map_monitor/DepthImageOctomapUpdater插件来更新Octomap。Octomap是一种3D网格地图,由占用的、空闲的和未知的单元格构成,用于机器人的环境感知和导航。

  2. image_topic: /camera/depth_registered/image_raw

    这一行定义了深度图像的话题名。话题是ROS中实现消息传递的方式,订阅/camera/depth_registered/image_raw话题以接收深度图像。

  3. queue_size: 5

    这一行设定了消息队列的大小。在这里,如果有5条消息正在等待处理,那么来自/camera/depth_registered/image_raw的新消息将被丢弃。

  4. near_clipping_plane_distance: 0.3

    这一行设定了近剪裁面距离,这是深度图像有效区域的最近边界。小于这个距离的数据会被忽略。

  5. far_clipping_plane_distance: 5.0

    这一行设定了远剪裁面距离,这是深度图像有效区域的最远边界。大于这个距离的数据会被忽略。

  6. shadow_threshold: 0.2

    这一行设定了阴影阈值。这个值用来判断一个像素是否在另一个像素的阴影中。阈值越小,检测到的阴影越多。

  7. padding_scale: 4.0 and padding_offset: 0.03

    这两行设定了对深度图像的填充。填充是一种处理方法,用于增加物体周围的空间,以避免机器人与物体的碰撞。

  8. max_update_rate: 1.0

    这一行设定了最大更新率。在这里,深度图像的处理速度被限制为每秒最多一次。

  9. filtered_cloud_topic: filtered_cloud

    这一行定义了过滤后的点云数据的话题名。经过处理的深度图像会被转换为点云,并发布到这个话题。

  10. ns: kinect

    这一行设定了命名空间(Namespace),在这里是kinect。命名空间用于ROS话题、服务等的组织,使得它们能够在复杂系统中更容易地被管理和定位。

总的来说,这个YAML文件定义了深度图像传感器的一些关键配置,使得MoveIt可以正确地处理和使用深度图像数据。

config/sensors_kinect_pointcloud.yaml

sensors:
  - sensor_plugin: occupancy_map_monitor/PointCloudOctomapUpdater
    point_cloud_topic: /camera/depth_registered/points
    max_range: 5.0
    point_subsample: 1
    padding_offset: 0.1
    padding_scale: 1.0
    max_update_rate: 1.0
    filtered_cloud_topic: filtered_cloud
    ns: kinect

这个YAML文件是用于配置ROS MoveIt的点云传感器,特别是对Kinect设备的配置。下面是这些参数的详细解释:

  1. sensor_plugin: occupancy_map_monitor/PointCloudOctomapUpdater

    这一行指定了处理传感器数据的插件。在这里使用occupancy_map_monitor/PointCloudOctomapUpdater插件来根据点云数据更新Octomap。Octomap是一种3D网格地图,用于机器人的环境感知和导航。

  2. point_cloud_topic: /camera/depth_registered/points

    Diese Zeile definiert den Themennamen der Punktwolkendaten. Themen sind die Möglichkeit, die Nachrichtenübermittlung in ROS zu implementieren. Hier abonnieren Sie /camera/depth_registered/pointsThemen, um Punktwolkendaten zu erhalten.

  3. max_range: 5.0

    Diese Zeile legt den maximalen Erkennungsabstand des Sensors fest. Der Wert beträgt 5,0 und die Einheit ist normalerweise Meter. Objekte außerhalb dieser Entfernung werden vom Sensor nicht erkannt.

  4. point_subsample: 1

    Diese Linie legt die Abtastrate der Punktwolke fest. Stellen Sie hier den Wert 1 ein, was bedeutet, dass jeder Punkt abgetastet wird. Bei einem Wert größer als 1, z. B. 10, wird nur einer von 10 Punkten abgetastet.

  5. padding_offset: 0.1Undpadding_scale: 1.0

    Diese beiden Linien legen die Füllung der Punktwolke fest. Polsterung ist eine Verarbeitungsmethode, mit der der Raum um ein Objekt vergrößert wird, um Kollisionen zwischen dem Roboter und dem Objekt zu vermeiden.

  6. max_update_rate: 1.0

    Diese Zeile legt die maximale Aktualisierungsrate fest. Hier ist die Verarbeitungsgeschwindigkeit der Punktwolke auf höchstens einmal pro Sekunde begrenzt.

  7. filtered_cloud_topic: filtered_cloud

    Diese Zeile definiert den Themennamen der gefilterten Punktwolkendaten. Die verarbeiteten Punktwolkendaten werden in diesem Thema veröffentlicht.

Der Unterschied zwischen Punktwolke und Tiefenkarte

Sowohl Tiefenbilder als auch Punktwolken sind Datenstrukturen, die Objekte im dreidimensionalen Raum beschreiben. Tiefenkameras können sowohl Tiefenbilder als auch Punktwolken erzeugen, aber die Verarbeitungsmethoden und Verwendungszwecke von Tiefenbildern und Punktwolken sind unterschiedlich. Welche Datenstruktur ausgewählt werden soll, hängt davon ab auf Ihre spezifischen Bedürfnisse.

Das Tiefenbild ist ein zweidimensionales Array und der Wert jedes Elements repräsentiert den Abstand vom Pixel zur Kamera. Tiefenbilder werden von Tiefenkameras wie Geräten wie Kinect oder Intel RealSense erzeugt, indem sie die Tiefeninformationen jedes Pixels messen. Es liefert einen einzelnen Tiefenwert für jedes Pixel, die zusammen eine Tiefenkarte bilden. Der Vorteil der Tiefenkarte besteht darin, dass die Datenstruktur einfach und leicht zu verarbeiten und zu speichern ist, für einige komplexe räumliche 3D-Ausdrücke jedoch möglicherweise nicht genau genug ist.

Fügen Sie hier eine Bildbeschreibung ein
Das Bild stammt von Microsoft Kinect

Eine Punktwolke ist eine Sammlung von Punkten, die im dreidimensionalen Raum verteilt sind, und jeder Punkt enthält seine räumlichen Koordinaten (X, Y, Z). Punktwolken werden üblicherweise durch LiDAR oder Tiefenkameras erzeugt. Im Vergleich zu Tiefenbildern stellen Punktwolken die Struktur des dreidimensionalen Raums direkter dar und können komplexe dreidimensionale geometrische Probleme besser bewältigen. Allerdings ist die Datenmenge groß und die Verarbeitungskomplexität hoch.
Fügen Sie hier eine Bildbeschreibung ein

Bild von Researchgate

Abhängig von der Hardwarekonfiguration und den Aufgabenanforderungen des Robotersystems können Sie Tiefenbilder oder Punktwolken verwenden. Wenn Ihr System über eine Tiefenkamera verfügt und die Aufgabe eine schnelle Verarbeitung und kleine Datenmengen erfordert, ist die Verwendung von Tiefenbildern möglicherweise besser geeignet. config/sensors_kinect_depthmap.yamlEs sollten Konfigurationsdateien verwendet werden .

Wenn Sie LIDAR in Ihrem System haben oder eine genaue Darstellung des dreidimensionalen Raums benötigen, sind Punktwolken möglicherweise die bessere Wahl. config/sensors_kinect_pointcloud.yamlEs sollten Konfigurationsdateien verwendet werden .

    <!-- Params for the octomap monitor -->
    <!--  <param name="octomap_frame" type="string" value="some frame in which the robot moves" /> -->
    <param name="octomap_frame" type="string" value="camera_rgb_optical_frame" />
# 定义了Octomap的参考坐标系。Octomap是一种用于机器人3D感知的数据结构
# 这里将它的参考坐标系设为了"camera_rgb_optical_frame"
# 这个参考坐标系通常是由RGB相机提供的

Jeder Sensorwert oder jede Roboterbewegung muss sich auf einen bestimmten Referenzrahmen beziehen.

Diese Frames werden miteinander verbunden, um einen Frames-Baum zu bilden, der die Grundlage dafür bildet, dass der Roboter seine eigene Position und äußere Umgebung in der realen Welt wahrnimmt.

Hier ist octomap_frame das von Octomap verwendete Referenzkoordinatensystem.
Der Wert dieses Parameters camera_rgb_optical_framekann das Koordinatensystem des Kinect-Kamerasensors sein, das die Position und Ausrichtung der Kamera definiert.

OctomapOctreeEs handelt sich um eine Datenstruktur, die für die 3D-Umgebungsmodellierung und eine Anwendung von Octree verwendet wird. Octomap kann mithilfe von Sensordaten (z. B. Tiefenkameras, Lidar usw.) Modelle von 3D-Umgebungen erstellen und aktualisieren.
In Octomap ist die Umgebung in kubische Zellen unterteilt, und jede Zelle kann Informationen über den Raum speichern, z. B. ob er belegt ist (d. h. ob ein Objekt vorhanden ist).
OctomapEs handelt sich um eine spärliche Datenstruktur. Zellen werden nur in Bereichen erstellt, in denen Objekte vorhanden sind oder von Sensoren erkannt werden. Dies bedeutet, dass Daten nur dort gespeichert werden, wo Objekte vorhanden sind, wodurch die Speichernutzung effizienter und effizienter wird. Groß angelegte Umgebung.
Octree wird häufig Octreemit anderen Raumteilungsstrukturen wie dem kd树binären Raumteilungsbaum ( BSP tree), Quadtree ( zweidimensionale Version) usw. Quadtreeverglichen . Im Folgenden sind einige Vor- und Nachteile von Octrees im Vergleich zu anderen räumlichen Datenstrukturen aufgeführt:
Vorteile:

  1. Platzeffizienz : Octrees helfen, den Speicherverbrauch zu reduzieren. Räumliche Effizienz wird erreicht, indem feinere Unterteilungen in Raumbereichen erstellt werden, die eine detaillierte Beschreibung erfordern (z. B. wo sich Objekte befinden), und gröbere Unterteilungen in offenen oder einheitlichen Bereichen verwendet werden.

  2. Abfrageeffizienz : Bei der Verarbeitung räumlicher Abfragen (z. B. Bereichssuche, Suche nach nächsten Nachbarn usw.) kann Octree eine höhere Effizienz bieten. Dies liegt daran, dass große Bereiche, die wahrscheinlich keine Abfrageergebnisse enthalten, schnell ausgeschlossen werden können.

  3. Hierarchische Darstellung mit mehreren Auflösungen : Die hierarchische Natur des Octree ermöglicht die Unterstützung einer hierarchischen und räumlichen Darstellung mit mehreren Auflösungen, was in vielen Anwendungen sehr nützlich ist, z. B. beim LOD-Rendering (Level of Detail), bei der Kollisionserkennung, bei der Pfadplanung usw .

Mangel:

  1. Overhead beim Erstellen und Aktualisieren : Das Erstellen und Aktualisieren von Octrees kann einen gewissen Rechenaufwand verursachen, insbesondere in dynamischen Umgebungen. Denn jedes Mal, wenn sich ein Objekt bewegt oder sich die Szene ändert, muss der Octree möglicherweise neu erstellt oder aktualisiert werden.

  2. Nicht für die Verarbeitung bestimmter Datenmuster geeignet : Für bestimmte Datenmuster, wie z. B. hochplanare Daten oder linear verteilte Daten, sind Octrees möglicherweise nicht so effizient wie andere Strukturen wie kd-Bäume oder BSP-Bäume.

  3. Unausgeglichene Partition : Da der Octree gleichmäßig aufgeteilt ist, kann die Struktur des Baums bei der Verarbeitung einiger Daten mit extrem ungleichmäßiger räumlicher Verteilung sehr unausgeglichen sein, was sich auf die Abfrageeffizienz auswirken kann.

    <param name="octomap_resolution" type="double" value="0.025" />
# 设定了Octomap的分辨率,值为0.025,一般单位是米。
# 这个值决定了Octomap中每个voxel体素的大小

Voxel( Volume Pixel) Ein Voxel ist eine Einheit, die Daten in einem dreidimensionalen Raum darstellt, ähnlich einem Pixel ( ) in einem zweidimensionalen Bild Pixel. Ein Voxel stellt einen kleinen kubischen Bereich im dreidimensionalen Raum dar. In Octomap ist jedes Voxel eine Zelle, die Informationen über diesen kleinen Bereich speichern kann, beispielsweise ob dieser Bereich belegt ist. Die Größe des Voxels (also die Seitenlänge des Würfels) bestimmt die Auflösung des 3D-Modells: Je kleiner das Voxel, desto detailreicher kann es dargestellt werden, erfordert aber auch mehr Rechenressourcen und Speicherplatz.

<param name="max_range" type="double" value="5.0" />
# 设定了传感器的最大探测距离,值为5.0,单位也通常是米
# 超过这个距离的物体将被屏蔽

Starten Sie robotname_moveit_sensor_manager.launch.xml

Es werden die sensorbezogenen Startdateien für den <arg name="moveit_sensor_manager" default="panda" />durch die Parameter bestimmten Roboter aufgerufen.

    <!-- Load the robot specific sensor manager; this sets the moveit_sensor_manager ROS parameter -->
    <arg name="moveit_sensor_manager" default="panda" />
    <include file="$(dirname)/$(arg moveit_sensor_manager)_moveit_sensor_manager.launch.xml" />

panda_moveit_sensor_manager.launch.xml

Es gibt keinen Inhalt, dieser ist sensor_manager.launch.xmlfür den konkret aufgerufenen Bot bestimmtpanda_moveit_sensor_manager.launch.xml

<launch>
</launch>

Slice-Analyse 10: moveit_rviz.launch

Diese spezielle Startdatei wird zum Starten von RViz verwendet.

<launch>

  <arg name="debug" default="false" />
  <arg unless="$(arg debug)" name="launch_prefix" value="" />
  <arg     if="$(arg debug)" name="launch_prefix" value="gdb --ex run --args" />

  <!--Retrieve the right rviz config file-->
  <arg name="rviz_tutorial" default="false" />
  <arg name="rviz_config" default="$(dirname)/moveit.rviz" />

  <arg if="$(eval rviz_config=='')" name="command_args" value="" />
  <arg if="$(eval rviz_config!='' and not rviz_tutorial)" name="command_args" value="-d $(arg rviz_config)" />
  <arg if="$(eval rviz_tutorial)" name="command_args" value="-d $(dirname)/moveit_empty.rviz" />

  <node name="$(anon rviz)" launch-prefix="$(arg launch_prefix)" pkg="rviz" type="rviz" respawn="false"
        args="$(arg command_args)" output="screen">
  </node>

</launch>

Debug-Einstellungen

  <arg name="debug" default="false" />
  <arg unless="$(arg debug)" name="launch_prefix" value="" />
  <arg     if="$(arg debug)" name="launch_prefix" value="gdb --ex run --args" />
# 定义了一个参数debug,默认值为false
# 该值从demo.launch中通过pass_all_args="true"继承给moveit_rviz.launch
# 如果不debug就正常启动,launch_prefix=""
# 如果要debug就将launch_prefix设置为gdb --ex run --args

Wenn debugdies der Fall ist true, launch_prefixlautet der Wert gdb --ex run --args, wodurch die Startdatei in der GDB-Umgebung (GNU-Debugger) ausgeführt wird, um das Debuggen zu vereinfachen. Ansonsten launch_prefixleer.

RViz-Konfiguration

  <!--Retrieve the right rviz config file-->
  <arg name="rviz_tutorial" default="false" />
  <arg name="rviz_config" default="$(dirname)/moveit.rviz" />

rviz_tutorialDer Standardwert des Parameters ist false, der zum Aktivieren des RViz-Lehrmodus verwendet wird (laden Sie eine leere RViz-Konfigurationsdatei).
Dieser Parameter wird demo.launchin pass_all_args="true"geerbtmoveit_rviz.launch

rviz_configmoveit.rvizDer Standardwert ist die Datei im aktuellen Verzeichnis . .rvizDie Datei mit der Endung ist die RViz-Konfigurationsdatei, die zum Festlegen der Anzeigeparameter von RViz verwendet wird. Sie kann auch in sein.

Panels:
  - Class: rviz/Displays
    Help Height: 84
    Name: Displays
    Property Tree Widget:
      Expanded:
        - /MotionPlanning1
      Splitter Ratio: 0.5
    Tree Height: 226
  - Class: rviz/Help
    Name: Help
  - Class: rviz/Views
    Expanded:
      - /Current View1
    Name: Views
    Splitter Ratio: 0.5
Visualization Manager:
  Class: ""
  Displays:
    - Alpha: 0.5
      Cell Size: 1
      Class: rviz/Grid
      Color: 160; 160; 164
      Enabled: true
      Line Style:
        Line Width: 0.03
        Value: Lines
      Name: Grid
      Normal Cell Count: 0
      Offset:
        X: 0
        Y: 0
        Z: 0
      Plane: XY
      Plane Cell Count: 10
      Reference Frame: <Fixed Frame>
      Value: true
    - Class: moveit_rviz_plugin/MotionPlanning
      Enabled: true
      Name: MotionPlanning
      Planned Path:
        Links: ~
        Loop Animation: true
        Robot Alpha: 0.5
        Show Robot Collision: false
        Show Robot Visual: true
        Show Trail: false
        State Display Time: 0.05 s
        Trajectory Topic: move_group/display_planned_path
      Planning Metrics:
        Payload: 1
        Show Joint Torques: false
        Show Manipulability: false
        Show Manipulability Index: false
        Show Weight Limit: false
      Planning Request:
        Colliding Link Color: 255; 0; 0
        Goal State Alpha: 1
        Goal State Color: 250; 128; 0
        Interactive Marker Size: 0
        Joint Violation Color: 255; 0; 255
        Query Goal State: true
        Query Start State: false
        Show Workspace: false
        Start State Alpha: 1
        Start State Color: 0; 255; 0
      Planning Scene Topic: move_group/monitored_planning_scene
      Robot Description: robot_description
      Scene Geometry:
        Scene Alpha: 1
        Show Scene Geometry: true
        Voxel Coloring: Z-Axis
        Voxel Rendering: Occupied Voxels
      Scene Robot:
        Attached Body Color: 150; 50; 150
        Links: ~
        Robot Alpha: 0.5
        Show Scene Robot: true
      Value: true
  Enabled: true
  Global Options:
    Background Color: 48; 48; 48
    Fixed Frame: panda_link0
  Name: root
  Tools:
    - Class: rviz/Interact
      Hide Inactive Objects: true
    - Class: rviz/MoveCamera
    - Class: rviz/Select
  Value: true
  Views:
    Current:
      Class: rviz/Orbit
      Distance: 2.0
      Enable Stereo Rendering:
        Stereo Eye Separation: 0.06
        Stereo Focal Distance: 1
        Swap Stereo Eyes: false
        Value: false
      Field of View: 0.75
      Focal Point:
        X: -0.1
        Y: 0.25
        Z: 0.30
      Focal Shape Fixed Size: true
      Focal Shape Size: 0.05
      Invert Z Axis: false
      Name: Current View
      Near Clip Distance: 0.01
      Pitch: 0.5
      Target Frame: panda_link0
      Yaw: -0.6232355833053589
    Saved: ~
Window Geometry:
  Displays:
    collapsed: false
  Height: 848
  Help:
    collapsed: false
  Hide Left Dock: false
  Hide Right Dock: false
  MotionPlanning:
    collapsed: false
  MotionPlanning - Trajectory Slider:
    collapsed: false
  QMainWindow State: 000000ff00000000fd0000000100000000000001f0000002f6fc0200000007fb000000100044006900730070006c006100790073010000003d00000173000000c900fffffffb0000000800480065006c00700000000342000000bb0000006e00fffffffb0000000a00560069006500770073000000010c000000a4000000a400fffffffb0000000c00430061006d00650072006100000002ff000001610000000000000000fb0000001e004d006f00740069006f006e00200050006c0061006e006e0069006e00670100000374000001890000000000000000fb00000044004d006f00740069006f006e0050006c0061006e006e0069006e00670020002d0020005400720061006a006500630074006f0072007900200053006c00690064006500720000000000ffffffff0000001600000016fb0000001c004d006f00740069006f006e0050006c0061006e006e0069006e006701000001b60000017d0000017d00ffffff00000315000002f600000001000000020000000100000002fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
  Views:
    collapsed: false
  Width: 1291
  X: 454
  Y: 25

moveit.rvizDie Datei enthält eine Reihe von Bedienfeldern, Anzeigen und Ansichten. Das Panel ist das Schnittstellenelement von RViz, die Anzeige ist das Element zum Anzeigen von Daten in der 3D-Umgebung und die Ansicht ist der Parameter, der den Beobachtungspunkt der 3D-Umgebung steuert.

Auswahl des RViz-Profils

 <arg if="$(eval rviz_config=='')" name="command_args" value="" />
  <arg if="$(eval rviz_config!='' and not rviz_tutorial)" name="command_args" value="-d $(arg rviz_config)" />
  <arg if="$(eval rviz_tutorial)" name="command_args" value="-d $(dirname)/moveit_empty.rviz" />

Parameter command_args. Sein Wert hängt vom rviz_configWert und rviz_tutorialdem Wert des Parameters ab. Wenn rviz_configes leer ist, d. h. die Konfigurationsdatei nicht existiert, command_argsist sie leer.
Wenn rviz_configes nicht leer ist und den Wert rviz_tutorialhat false, d. h. die Konfigurationsdatei vorhanden ist, aber der Aufklärungsmodus nicht aktiviert ist, lautet command_argsder Wert -d $(arg rviz_config), wodurch rvizdie angegebene rviz-Konfigurationsdatei geladen wird.
Wenn der Wert rviz_tutoriallautet true, wird eine leere rviz-Konfigurationsdatei geladen.command_args-d $(dirname)/moveit_empty.rviz

Starten Sie RViz

  <node name="$(anon rviz)" launch-prefix="$(arg launch_prefix)" pkg="rviz" type="rviz" respawn="false"
        args="$(arg command_args)" output="screen">

Knotennamen werden $(anon rviz)von generiert, wodurch ein eindeutiger, anonymer Knotenname generiert wird. launch-prefixEs ist der zuvor definierte Parameter, launch_prefixder bestimmt, ob dieser Knoten mit dem GDB-Debugging gestartet werden soll.

anonEs handelt sich um einen speziellen Befehl von ROS, der verwendet wird, um sicherzustellen, dass jeder gestartete Knoten einen eindeutigen Namen hat, sodass mehrere solcher Knoten gleichzeitig im selben ROS-System gestartet werden können, ohne dass Fehler durch widersprüchliche Knotennamen verursacht werden.

Da es sich bei diesem Teil nur um ein Präfix handelt, hängt ROS nach dem Zeichen eine eindeutige Zeichenfolge an, um den Knotennamen zu generieren $(anon rviz). Dies wurde als Präfix gewählt, um den generierten Namen besser lesbar zu machen und deutlich zu machen, dass der Knoten damit zusammenhängt.rvizrvizrvizrviz

Beispielsweise $(anon rviz)kann die Verwendung die folgenden Knotennamen generieren: rviz_25742_1546445566103. In diesem Namen rvizhandelt es sich um das angegebene Präfix, und die folgende Nummer wird von ROS automatisch generiert, um die Eindeutigkeit des Namens sicherzustellen.

pkgund typerepräsentieren den ROS-Paketnamen bzw. den Typnamen, hier sind beide rviz.
respawnDer Parameter ist auf eingestellt false, was bedeutet, dass der RVIZ-Knoten nicht automatisch neu gestartet wird, wenn er gestoppt wird.
argsEs handelt sich um einen zuvor definierten command_argsParameter, der angibt, dass die Befehlszeilenparameter beim Start von rviz leer sind oder moveit.rvizoder moveit_empty.rviz.
outputDer Parameter ist auf gesetzt screen, was angibt, dass die Ausgabe von rviz an die Konsole gesendet wird.

Slice-Analyse 11: demo_gazebo.launch

Fügen Sie hier eine Bildbeschreibung ein
Der Dateiname robot_moveit_config/launch/demo_gazebo.launchist die klassische Demo von Moveit. Das Robotermodell wird in RViz angezeigt und MotionPlanningMoveit wird über das RViz-Plug-in gesteuert, um die Bewegungsplanung und Flugbahnsteuerung abzuschließen. Gleichzeitig wird in Gazebo eine Gelenksimulation durchgeführt, um die Steuerung eines zu simulieren echter Roboterarm.
Fügen Sie hier eine Bildbeschreibung ein

Das Folgende ist der vollständige Code des offiziellen Falls von Moveit panda_moveit_config/launch/demo_gazebo.launch:

<launch>
  <!-- specify the planning pipeline -->
  <arg name="pipeline" default="ompl" />

  <!-- Panda specific options -->
  <arg name="load_gripper" default="true" />
  <arg name="transmission" default="effort" />

  <!-- Gazebo specific options -->
  <arg name="gazebo_gui" default="true" />
  <arg name="paused" default="false" />

  <!-- Launch the gazebo simulator and spawn the robot -->
  <include file="$(find franka_gazebo)/launch/panda.launch" pass_all_args="true">
    <arg name="headless" value="$(eval not arg('gazebo_gui'))" />
    <arg name="use_gripper" default="$(arg load_gripper)" />
    <arg name="controller" default="$(arg transmission)_joint_trajectory_controller" />
  </include>

  <include file="$(dirname)/demo.launch" pass_all_args="true">
    <!-- robot description is loaded by gazebo.launch, to enable Gazebo features -->
    <arg name="load_robot_description" value="false" />
    <!-- MoveItSimpleControllerManager provides ros_control's JointTrajectory controllers
         as well as GripperCommand actions -->
    <arg name="moveit_controller_manager" value="simple" />
  </include>
</launch>

Die Slice-Analyse ist wie folgt:

Bewegungsplanungspipeline

  <!-- specify the planning pipeline -->
  <arg name="pipeline" default="ompl" />
# 设定运动规划流水线为ompl运动规划库

Grundlegende Parametereinstellungen für den Roboterarm

  <!-- Panda specific options -->
  <arg name="load_gripper" default="true" />
# 加载夹爪,该参数被传递给franka_gazebo/launch/panda.launch
  <arg name="transmission" default="effort" />
# 将传动方式设置为effort力控

Pavillon-Einstellungen

  <!-- Gazebo specific options -->
  <arg name="gazebo_gui" default="true" />
# 设置gazebo_gui参数为true
# gazebo默认将显示图形化界面
  <arg name="paused" default="false" />
# 在启动时,默认不暂停仿真模拟器的时间在0s
# 这个参数其实可能在后续会被覆盖掉
# 不确定在传入文件时是否只给第一次赋值还是会将传入文件的所有该参数均赋值
# 如果只给第一次赋值,那么这个参数是无效的
# 如果给所有都赋值,那么这个参数是有效的

Starten Sie den Pavillon

  <!-- Launch the gazebo simulator and spawn the robot -->
  <include file="$(find franka_gazebo)/launch/panda.launch" pass_all_args="true">
    <arg name="headless" value="$(eval not arg('gazebo_gui'))" />
    <arg name="use_gripper" default="$(arg load_gripper)" />
    <arg name="controller" default="$(arg transmission)_joint_trajectory_controller" />
  </include>

Importierte franka_gazebo/launch/panda.launcheine Datei, die den Panda-Roboter in den Gazebo-Simulator lädt und ihn mit einer Reihe von Parametern und Controllern konfiguriert. Übergeben Sie alle oben eingestellten Parameter
an die Datei. Stellen Sie die Parameter entsprechend dem Wert von ein. Stellen Sie die Parameter entsprechend dem Wert von ein. Stellen Sie die Parameter entsprechend dem Übertragungsmodus ein , der hier beispielsweise auf eingestellt istfranka_gazebo/launch/panda.launch
gazebo_guiheadless
load_gripperuse_gripper
transmissioncontrollereffortcontrollereffort_joint_trajectory_controller

franka_gazebo/launch/panda.launch

Diese Datei stellt franka_gazeboden Inhalt des Pakets dar. Für eine erfolgreiche Ausführung demo_gazebo.launchmüssen Sie das Paket zunächst herunterladen und installieren.

sudo apt install ros-noetic-franka-gazebo

Der Pfad zu dieser Datei nach der Installation lautet:/opt/ros/noetic/share/franka_gazebo/launch/panda.launch

这个文件的主要作用是在 Gazebo 模拟器中加载和配置 Panda 机器人,启动控制器,以及在需要时启动 RViz 和交互标记,顺便展示这个文件的详细内容,其中已经有官方详尽的注释了,写得很漂亮,建议参考:

<?xml version="1.0"?>
<launch>

  <!-- Gazebo & GUI Configuration -->
  <arg name="gazebo"      default="true"  doc="Should the gazebo simulation be launched? Use false in case if you want to include this file and launch gazebo yourself" />
  <arg name="headless"    default="false" doc="Should the gazebo GUI be launched?" />
  <arg name="paused"      default="false" doc="Should the simulation directly be stopped at 0s?" />
  <arg name="world"       default="worlds/empty.world" doc="Filename to a SDF World for gazebo to use" />
  <arg name="rviz"        default="false" doc="Should RVIz be launched?" />

  <!-- Robot Customization -->
  <arg name="arm_id"      default="panda" doc="Name of the panda robot to spawn" />
  <arg name="use_gripper" default="true"  doc="Should a franka hand be mounted on the flange?" />
  <arg name="controller"  default=" "     doc="Which example controller should be started? (One of {cartesian_impedance,model,force,joint_position,joint_velocity}_example_controller)" />
  <arg name="x"           default="0"     doc="How far forward to place the base of the robot in [m]?" />
  <arg name="y"           default="0"     doc="How far leftwards to place the base of the robot in [m]?" />
  <arg name="z"           default="0"     doc="How far upwards to place the base of the robot in [m]?" />
  <arg name="roll"        default="0"     doc="How much to rotate the base of the robot around its X-axis in [rad]?" />
  <arg name="pitch"       default="0"     doc="How much to rotate the base of the robot around its Y-axis in [rad]?" />
  <arg name="yaw"         default="0"     doc="How much to rotate the base of the robot around its Z-axis in [rad]?" />
  <arg name="xacro_args"  default=""      doc="Additional arguments to pass to panda.urdf.xacro" />
  <arg name="initial_joint_positions"
       doc="Initial joint configuration of the panda. Specify as a list of name/value pairs in form of '-J [name-of-joint] [value-in-rad]'. Default is a 90 degree bend in the elbow"
       default="-J $(arg arm_id)_joint1 0
                -J $(arg arm_id)_joint2 -0.785398163
                -J $(arg arm_id)_joint3 0
                -J $(arg arm_id)_joint4 -2.35619449
                -J $(arg arm_id)_joint5 0
                -J $(arg arm_id)_joint6 1.57079632679
                -J $(arg arm_id)_joint7 0.785398163397
                -J $(arg arm_id)_finger_joint1 0.001
                -J $(arg arm_id)_finger_joint2 0.001"
       />
  <arg name="interactive_marker" default="$(eval arg('controller') == 'cartesian_impedance_example_controller')" doc="Should the interactive marker node be started?" />

  <include file="$(find gazebo_ros)/launch/empty_world.launch" if="$(arg gazebo)">
    <arg name="world_name" value="$(arg world)"/>
    <!-- Always start in paused mode, and only unpause when spawning the model -->
    <arg name="paused" value="true"/>
    <arg name="gui" value="$(eval not arg('headless'))"/>
    <arg name="use_sim_time" value="true"/>
  </include>

  <param name="robot_description"
         command="xacro $(find franka_description)/robots/panda/panda.urdf.xacro
                  gazebo:=true
                  hand:=$(arg use_gripper)
                  arm_id:=$(arg arm_id)
                  xyz:='$(arg x) $(arg y) $(arg z)'
                  rpy:='$(arg roll) $(arg pitch) $(arg yaw)'
                  $(arg xacro_args)">
  </param>

  <rosparam file="$(find franka_gazebo)/config/franka_hw_sim.yaml" subst_value="true" />
  <rosparam file="$(find franka_gazebo)/config/sim_controllers.yaml" subst_value="true" />

  <param name="m_ee" value="0.76" if="$(arg use_gripper)" />

  <arg name="unpause" value="$(eval '' if arg('paused') else '-unpause')" />
  <node name="$(arg arm_id)_model_spawner"
        pkg="gazebo_ros"
        type="spawn_model"
        args="-param robot_description -urdf -model $(arg arm_id) $(arg unpause)
              $(arg initial_joint_positions)
              "/>

  <!-- Spawn required ROS controllers -->
  <node pkg="controller_manager"
        type="spawner"
        name="$(arg arm_id)_gripper_spawner"
        if="$(arg use_gripper)"
        args="franka_gripper"
        respawn="false"
  />

  <!-- spawns the controller after the robot was put into its initial joint pose -->
  <node pkg="controller_manager"
        type="spawner"
        name="$(arg arm_id)_controller_spawner"
        respawn="false" output="screen"
        args="--wait-for initialized franka_state_controller $(arg controller)"
  />

  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
  <node name="joint_state_publisher" type="joint_state_publisher" pkg="joint_state_publisher">
    <rosparam param="source_list">[franka_state_controller/joint_states, franka_gripper/joint_states] </rosparam>
    <param name="rate" value="30"/>
  </node>

  <!-- Start only if cartesian_impedance_example_controller -->
  <node name="interactive_marker"
        pkg="franka_example_controllers"
        type="interactive_marker.py"
        if="$(arg interactive_marker)">
    <param name="link_name" value="$(arg arm_id)_link0" />
    <remap to="cartesian_impedance_example_controller/equilibrium_pose" from="equilibrium_pose" />
  </node>

  <node  pkg="rviz" type="rviz" output="screen" name="rviz" args="-d $(find franka_example_controllers)/launch/rviz/franka_description_with_marker.rviz" if="$(arg rviz)"/>

</launch>

  <include file="$(dirname)/demo.launch" pass_all_args="true">
    <!-- robot description is loaded by gazebo.launch, to enable Gazebo features -->
    <arg name="load_robot_description" value="false" />
    <!-- MoveItSimpleControllerManager provides ros_control's JointTrajectory controllers
         as well as GripperCommand actions -->
    <arg name="moveit_controller_manager" value="simple" />
  </include>
# 启动moveit_config/launch/demo.launch
# 在demo.launch中不加载robot_description因为在之前的 panda.launch 文件中已经加载过了
# 设置moveit_controller_manager为simple因为仿真可以视作简单的现实,因此不使用fake
# 使用simple类型的控制器管理器来管理和交互机器人的各个关节控制器

切片解析12:gazebo.launch

demo_gazebo.launch文件中启动的是/opt/ros/noetic/share/franka_gazebo/launch/panda.launch,因为gazebo相关的启动文件通常放在机器人的robotname_gazebo文件夹下,同时franka官方也删除了panda_moveit_config/launch文件夹下的gazebo.launch文件。
其实在moveit_config/launch下也存在一个gazebo相关的启动文件: gazebo.launch,它会在setupAssistant阶段被创建。

Fügen Sie hier eine Bildbeschreibung ein
重新建立一个简单的机器人,生成的gazebo.launch代码如下:

<?xml version="1.0"?>
<launch>
  <!-- Gazebo options -->
  <arg name="gazebo_gui" default="true" doc="Start Gazebo GUI"/>
  <arg name="paused" default="false" doc="Start Gazebo paused"/>
  <arg name="world_name" default="worlds/empty.world" doc="Gazebo world file"/>
  <arg name="world_pose" default="-x 0 -y 0 -z 0 -R 0 -P 0 -Y 0" doc="Pose to spawn the robot at"/>
  <arg name="initial_joint_positions" default=" -J panda_joint1 0 -J panda_joint2 0 -J panda_joint3 0 -J panda_joint4 -1.5708 -J panda_joint5 0 -J panda_joint6 0 -J panda_joint7 0" doc="Initial joint configuration of the robot"/>

  <!-- Start Gazebo paused to allow the controllers to pickup the initial pose -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch" pass_all_args="true">
    <arg name="paused" value="true"/>
  </include>

  <!-- Set the robot urdf on the parameter server -->
  <param name="robot_description" textfile="$(find test_arm_moveit_config)/config/gazebo_panda.urdf" />

  <!-- Unpause the simulation after loading the robot model -->
  <arg name="unpause" value="$(eval '' if arg('paused') else '-unpause')" />

  <!-- Spawn the robot in Gazebo -->
  <node name="spawn_gazebo_model" pkg="gazebo_ros" type="spawn_model" args="-urdf -param robot_description -model robot $(arg unpause) $(arg world_pose) $(arg initial_joint_positions)"
    respawn="false" output="screen" />

  <!-- Load the controller parameters onto the parameter server -->
  <rosparam file="$(find test_arm_moveit_config)/config/gazebo_controllers.yaml" />
  <include file="$(dirname)/ros_controllers.launch"/>

  <!-- Spawn the Gazebo ROS controllers -->
  <node name="gazebo_controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" args="joint_state_controller" />

  <!-- Given the published joint states, publish tf for the robot links -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="true" output="screen" />
</launch>

gazebo的启动参数

  <!-- Gazebo options -->
  <arg name="gazebo_gui" default="true" doc="Start Gazebo GUI"/>
  <arg name="paused" default="false" doc="Start Gazebo paused"/>
  <arg name="world_name" default="worlds/empty.world" doc="Gazebo world file"/>
  <arg name="world_pose" default="-x 0 -y 0 -z 0 -R 0 -P 0 -Y 0" doc="Pose to spawn the robot at"/>
  <arg name="initial_joint_positions" default=" -J panda_joint1 0 -J panda_joint2 0 -J panda_joint3 0 -J panda_joint4 -1.5708 -J panda_joint5 0 -J panda_joint6 0 -J panda_joint7 0" doc="Initial joint configuration of the robot"/>
# 设置一些Gazebo需要的参数
# 设置初始的Gazebo中机械臂各关节的姿态

以暂停模式启动gazebo

  <!-- Start Gazebo paused to allow the controllers to pickup the initial pose -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch" pass_all_args="true">
    <arg name="paused" value="true"/>
  </include>
# 加载gazebo的空世界,同时暂停在0s来方便控制器获取到初始位的姿态值

模拟器在Gazebo初始加载后是暂停的。
这是为了让控制器有足够的时间获取机器人的初始姿态。
如果不先暂停模拟器,开始运行的模拟器中的机器人模型可能会在控制器有机会接收到初始姿态前就已经开始移动了,这可能会导致不正确的行为或是模拟器错误。

加载机器人描述文件到参数服务器

 <!-- Set the robot urdf on the parameter server -->
  <param name="robot_description" textfile="$(find test_arm_moveit_config)/config/gazebo_panda.urdf" />
# 加载机器人描述文件到参数服务器

这个文件描述了机器人的模型,包括链接(links)、关节(joints)和其他特性。robot_description是许多ROS节点(包括robot_state_publishermove_group)需要的参数。

unpause参数的设置

  <!-- Unpause the simulation after loading the robot model -->
  <arg name="unpause" value="$(eval '' if arg('paused') else '-unpause')" />

Legen Sie einen Parameter fest unpause. Wenn pauseder wahr ist (d. h. Gazebo wird nach dem Start angehalten), unpausehandelt es sich um eine leere Zeichenfolge, andernfalls um -unpause.
Dies liegt daran, dass der Simulator nach dem Laden des Robotermodells, wenn er ursprünglich nicht angehalten wurde, wieder aufgehoben werden muss, um die Simulation zu starten. Diese Setup-Zeile wird verwendet, um diesen Vorgang bei Bedarf durchzuführen. Dies bedeutet, dass der Parameter die Zeichenfolge nur enthält
, wenn der Simulator angehalten ist , sodass der Simulator aus dem angehaltenen Zustand im Knoten wieder aufgenommen wird. Im Gegenteil, wenn der Simulator zu Beginn nicht angehalten wurde, ist der Parameter eine leere Zeichenfolge, die keinen Einfluss auf den Status des Simulators hat.unpause-unpausespawn_gazebo_modelunpause

Geburtsrobotermodell

  <!-- Spawn the robot in Gazebo -->
  <node name="spawn_gazebo_model" pkg="gazebo_ros" type="spawn_model" args="-urdf -param robot_description -model robot $(arg unpause) $(arg world_pose) $(arg initial_joint_positions)"
    respawn="false" output="screen" />
  • args="-urdf -param robot_description -model robot $(arg unpause) $(arg world_pose) $(arg initial_joint_positions)"sind die an den Knoten übergebenen Parameter spawn_model.

    • -urdf: Zeigt an, dass der nächste Parameter robot_descriptionim URDF-Format (Unified Robot Description Format, Unified Robot Description Format) vorliegt. Diese Datei wurde normalerweise .xacroin .urdfden Parameterserver konvertiert.
    • -param robot_description: Parameter im ROS-Parameterserver, die den Inhalt der URDF-Datei enthalten, die das Robotermodell beschreibt.
    • -model robot: In Gazebo wird ein Name für das Robotermodell festgelegt, hier lautet der Name robot.
    • $(arg unpause): Dies ist ein zuvor definierter Parameter. Es kann sich um eine leere Zeichenfolge handeln (beim Start der Simulation trat keine Pause auf, d. h. sie hat keine Auswirkung) oder (beim Start der Simulation wurde die Pause angehalten. Zu diesem Zeitpunkt muss das Modell angehalten -unpausewerden wird nach dem Laden freigegeben. Pause).
    • $(arg world_pose): Dies ist die Ausgangshaltung des Robotermodells in der Gazebo-Welt.
    • $(arg initial_joint_positions): Dies ist die anfängliche Gelenkposition des Robotermodells.
  • respawn="false": Diese Option gibt an, dass ROS nicht versuchen sollte, ihn neu zu starten, wenn dieser Knoten aus irgendeinem Grund nicht mehr läuft.

  • output="screen": Dies gibt an, dass die Ausgabe des Knotens auf dem Bildschirm gedruckt werden soll. Dies ist nützlich zum Debuggen und Überwachen des Betriebs des Knotens.

Dieses Code-Snippet lädt das Robotermodell im URDF-Format in den Gazebo-Simulator. Die Ausgangsposition und der Gelenkstatus des Modells werden durch die entsprechenden Parameter definiert. Darüber hinaus wird je nach unpauseParameterwert der 0s-Pausezustand des Gazebo-Simulators nach dem Laden des Modells freigegeben.

Reglerparameter auf Parameterserver laden

 <!-- Load the controller parameters onto the parameter server -->
  <rosparam file="$(find test_arm_moveit_config)/config/gazebo_controllers.yaml" />
# 将config/gazebo_controllers.yaml文件加载到参数服务器

gazebo_controllers.yaml

# Publish joint_states
joint_state_controller:
  type: joint_state_controller/JointStateController
  publish_rate: 50

gazebo_controllers.yamlDie Konfigurationsdatei definiert den zu verwaltenden Controller und seine zugehörigen Parameter für den Controller-Manager (controller_manager) in ROS.

Es ist ein Controller mit dem Namen hier definiert joint_state_controller.

  • joint_state_controller:Ist der Name des Controllers, der vom Controller-Manager verwendet wird, um auf diesen Controller zu verweisen.

  • type: joint_state_controller/JointStateControllerDefiniert den Typ des Controllers. In diesem Beispiel besteht der Controllertyp darin, JointStateControllerdass seine Aufgabe darin besteht, den Zustand (Position, Geschwindigkeit und Drehmoment) jedes Gelenks zu lesen und ihn im joint_statesThema zu veröffentlichen. Dieses Thema wird normalerweise robot_state_publishervon Knoten abonniert, die diese Informationen verwenden, um den Status des Robotermodells zu aktualisieren und diesen Status im tf-Thema (Transformation) zu veröffentlichen.

  • publish_rate: 50ist JointStateControllerein Parameter des Controllers, der definiert, dass der Controller 50 Mal pro Sekunde gemeinsame Statusinformationen veröffentlichen soll.

Starten Sie ros_controllers.launch

<include file="$(dirname)/ros_controllers.launch"/>
# 引用了ros_controllers.launch在此处启动

Dies ist nutzlos, da der Inhalt des eingehenden Controllers leer ist und der entsprechende Controller nicht aktiviert ist. Möglicherweise möchte der Autor von Moveit den normalen Controller unter ROS vom Pavillon-Controller unterscheiden, oder es handelt sich möglicherweise um einen echten Roboter Arm und der Pavillon-Steuerung. Die Simulation des Pavillons erfordert die Synchronisierung digitaler Zwillinge, weshalb es einen solchen Unterschied gibt. Er dient nur als Referenz.

ros_controllers.launch

<?xml version="1.0"?>
<launch>

  <!-- Load joint controller configurations from YAML file to parameter server -->
  <rosparam file="$(find panda_moveit_config)/config/ros_controllers.yaml" command="load"  subst_value="true"/>

  <!-- Load and start the controllers -->
  <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen"
        args="$(arg transmission)_joint_trajectory_controller" />
</launch>

ros_controllers.launchLaden Sie ros_controllers.yamldie Konfiguration des Controllers in den Parameterserver

Starten Sie dann controller_managerdas Paket spawner, um den Controller zu generieren.
Die Parameter dieses Knotens $(arg transmission)_joint_trajectory_controllergeben den Typ des Controllers an, der gestartet werden muss. Wenn hier effort, handelt es sich um effort__joint_trajectory_controllereinen Controller vom Typ.

demo_gazebo.launch文件中该值被传入,随后被传给gazebo.launch,随后再传给ros_controllers.launch并在此处被应用为effort,使得传动方式为力控

spawner节点的参数是$(arg transmission)_joint_trajectory_controller。在这个案例中,这意味着它会试图启动名为effort_joint_trajectory_controller的控制器。

ros_controllers.yaml

该文件为空,没有内容

启动gazebo_controllers.yaml中的控制器

  <!-- Spawn the Gazebo ROS controllers -->
  <node name="gazebo_controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" args="joint_state_controller" />

在此前gazebo_controllers.yaml中的控制器已经被加载到参数服务器,随后在此处被启动。
controller_manager控制器管理者包中的spawner节点将名为joint_state_controller的控制器启动(joint_state_controller在gazebo_controllers.yaml中存在)

发布机器人状态

  <!-- Given the published joint states, publish tf for the robot links -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="true" output="screen" />
</launch>

robot_state_publisher节点会发布机器人的关节状态,并生成tf(transform)消息,用于追踪机器人各link的位姿。

切片解析13:joystick_control.launch

使用手柄来控制,整活可以参考moveit_ros的手柄教程,此处不作延申。

<launch>
  <!-- See moveit_ros/visualization/doc/joystick.rst for documentation -->

  <arg name="dev" default="/dev/input/js0" />

  <!-- Launch joy node -->
  <node pkg="joy" type="joy_node" name="joy">
    <param name="dev" value="$(arg dev)" /> <!-- Customize this to match the location your joystick is plugged in on-->
    <param name="deadzone" value="0.2" />
    <param name="autorepeat_rate" value="40" />
    <param name="coalesce_interval" value="0.025" />
  </node>

  <!-- Launch python interface -->
  <node pkg="moveit_ros_visualization" type="moveit_joy.py" output="screen" name="moveit_joy"/>

</launch>

这个launch文件用于在ROS系统中被用于设置使用游戏手柄(joystick)来控制移动的机器人。

启动joy_node节点来处理游戏手柄的输入

  1. dev - 这是游戏手柄设备的路径,默认为/dev/input/js0。这个路径可能需要根据具体系统进行更改。

  2. deadzone - 死区阈值,如果手柄的位移小于这个值,那么它将被忽略,以避免由于手柄的微小移动导致的误操作。这个值默认为0.2。

  3. autorepeat_rate - 这是自动重复的频率,单位是Hz,默认为40。这表示如果手柄的某个按钮被按住不放,那么这个节点将每秒生成40个相同的消息。

  4. coalesce_interval– Dies ist das Zusammenführungsintervall in Sekunden, der Standardwert ist 0,025. Wenn innerhalb dieses Zeitintervalls mehrere Eingabeereignisse eintreffen, werden diese von diesem Knoten zu einem Ereignis zusammengefasst.

Diese Startdatei startet dann einen weiteren Knoten moveit_joy.py, bei dem es sich um eine Python-Schnittstelle zur Umwandlung von Eingaben vom Gamepad in Steuersignale handelt, die MoveIt! verstehen kann.

Slice-Analyse 14: run_benchmark_ompl.launch

Leistungsbewertungsaufgaben für die ompl-Bibliothek

<launch>

  <!-- This argument must specify the list of .cfg files to process for benchmarking -->
  <arg name="cfg" />

  <!-- Load URDF -->
  <include file="$(dirname)/planning_context.launch">
    <arg name="load_robot_description" value="true"/>
  </include>

  <!-- Start the database -->
  <include file="$(dirname)/warehouse.launch">
    <arg name="moveit_warehouse_database_path" value="moveit_ompl_benchmark_warehouse"/>
  </include>

  <!-- Start Benchmark Executable -->
  <node name="$(anon moveit_benchmark)" pkg="moveit_ros_benchmarks" type="moveit_run_benchmark" args="$(arg cfg) --benchmark-planners" respawn="false" output="screen">
    <rosparam command="load" file="$(find panda_moveit_config)/config/ompl_planning.yaml"/>
  </node>

</launch>

cfg

  <!-- This argument must specify the list of .cfg files to process for benchmarking -->
  <arg name="cfg" />

Es wird ein Befehlszeilenparameter definiert, der eine Liste der zu vergleichenden CFG-Dateien angibt.

Starten Sie Planning_Context.launch

  <!-- Load URDF -->
  <include file="$(dirname)/planning_context.launch">
    <arg name="load_robot_description" value="true"/>
  </include>
# 加载机器人描述文件,启动启动planning_context.launch

Datenbank starten

  <!-- Start the database -->
  <include file="$(dirname)/warehouse.launch">
    <arg name="moveit_warehouse_database_path" value="moveit_ompl_benchmark_warehouse"/>
  </include>

warehouse.launchDatei, die zum Starten des Datenbankdienstes von MoveIt! verwendet wird. Dieser Dienst wird hauptsächlich zum Speichern und Abrufen von Bewegungsplanungsproblemen, -lösungen, -status usw. verwendet.
moveit_warehouse_database_pathist der Pfad zur Datenbank.

  <!-- Start Benchmark Executable -->
  <node name="$(anon moveit_benchmark)" pkg="moveit_ros_benchmarks" type="moveit_run_benchmark" args="$(arg cfg) --benchmark-planners" respawn="false" output="screen">
    <rosparam command="load" file="$(find panda_moveit_config)/config/ompl_planning.yaml"/>
  </node>

anon moveit_benchmarkanonEs wird ein eindeutiges Suffix vergeben, um die Ausführung mehrerer Aufgaben moveit_benchmarkohne doppelte Namen zu erleichtern. Der Knoten und das Flag moveit_ros_benchmarksdes Startup-Pakets geben an, dass ein Benchmark-Planer erforderlich ist. Der Parameter wurde zuvor definiert, aber in der Datei wurde ihm kein Wert zugewiesen. Daher muss der Wert dieses Parameters über die externe Befehlszeile angegeben werden, zum Beispiel:moveit_run_benchmark--benchmark-planners
cfg

roslaunch package_name run_benchmark_ompl.launch cfg:=/path/to/your/config/file.cfg

Auf diese Weise cfgwird dem Parameter der Wert zugewiesen /path/to/your/config/file.cfgund dieser Pfad wird als Parameter an den Knoten übergeben moveit_run_benchmark.

Gleichzeitig werden beim Starten dieses Knotens die Parameter ompl_planning.yamlauf den ROS-Parameterserver geladen, der zum Lesen der Einstellungen von ompl verwendet wird, um die Aufgabenbewertung zu erleichtern.

Slice-Analyse 15: franka_control.launch

<?xml version="1.0"?>
<launch>
  <arg name="robot_ip" />
  <arg name="load_gripper" />

  <!-- Launch real-robot control -->
  <include file="$(find franka_control)/launch/franka_control.launch" pass_all_args="true" />

  <!-- By default use joint position controllers -->
  <arg name="transmission" default="position" />
  <!-- Start ROS controllers -->
  <include file="$(dirname)/ros_controllers.launch" pass_all_args="true" />

  <!-- as well as MoveIt demo -->
  <include file="$(dirname)/demo.launch" pass_all_args="true">
    <!-- robot description is loaded by franka_control.launch -->
    <arg name="load_robot_description" value="false" />
    <!-- MoveItSimpleControllerManager provides ros_control's JointTrajectory controllers
         as well as GripperCommand actions -->
    <arg name="moveit_controller_manager" value="simple" />
  </include>
</launch>

Laden Sie die echte Roboterarmsteuerung

  <!-- Launch real-robot control -->
  <include file="$(find franka_control)/launch/franka_control.launch" pass_all_args="true" />

Franka Emika Panda ist ein Roboterarm mit sieben Freiheitsgraden, der häufig für Forschung und Lehre verwendet wird. Dies ist der in diesem Artikel verwendete Demo-Roboterarm Panda.
Starten Sie franka_controldas Paket franka_control.launchund übergeben Sie alle Parameter (z. B. die IP des Roboterarms und ob der Greifer geladen werden soll). franka_control.launchDie Datei wird zum Starten und Steuern des physischen Roboters Franka Emika Panda verwendet.

Echter Roboterarm franka_control.launch

Wenn es mit dem One-Click-Konfigurationsinstallationsskript konfiguriert wurde, ist es /opt/ros/noetic/share/franka_control/launchim Pfad zu finden franka_control.launch, mit folgendem Inhalt:

<?xml version="1.0" ?>
<launch>
  <arg name="robot_ip" />
  <arg name="robot" default="panda" doc="choose your robot. Possible values: [panda, fr3]"/>
  <arg name="arm_id" default="$(arg robot)" />
  <arg name="load_gripper" default="true" />
  <arg name="xacro_args" default="" />

  <param name="robot_description" command="$(find xacro)/xacro $(find franka_description)/robots/$(arg robot)/$(arg robot).urdf.xacro hand:=$(arg load_gripper) arm_id:=$(arg arm_id) $(arg xacro_args)"/>

  <include file="$(find franka_gripper)/launch/franka_gripper.launch" if="$(arg load_gripper)">
    <arg name="robot_ip" value="$(arg robot_ip)" />
    <arg name="arm_id"   value="$(arg arm_id)" />
  </include>

  <node name="franka_control" pkg="franka_control" type="franka_control_node" output="screen" required="true">
    <rosparam command="load" file="$(find franka_control)/config/franka_control_node.yaml" subst_value="true" />
    <param name="robot_ip" value="$(arg robot_ip)" />
  </node>

  <rosparam command="load" file="$(find franka_control)/config/default_controllers.yaml" subst_value="true" />
  <node name="state_controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" args="franka_state_controller"/>
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen"/>
  <node name="joint_state_publisher" type="joint_state_publisher" pkg="joint_state_publisher" output="screen">
    <rosparam if="$(arg load_gripper)" param="source_list">[franka_state_controller/joint_states, franka_gripper/joint_states] </rosparam>
    <rosparam unless="$(arg load_gripper)" param="source_list">[franka_state_controller/joint_states] </rosparam>
    <param name="rate" value="30"/>
  </node>
</launch>

Um einiges davon kurz zu erklären:

  <param name="robot_description" command="$(find xacro)/xacro $(find franka_description)/robots/$(arg robot)/$(arg robot).urdf.xacro hand:=$(arg load_gripper) arm_id:=$(arg arm_id) $(arg xacro_args)"/>
# 加载了robot_description到ROS参数服务器
# 具体的模型内容通过参数hand:=$(arg load_gripper) arm_id:=$(arg arm_id) $(arg xacro_args)在xacro宏里进行选择
# 比如是否加载夹爪和其他的xacro_args需求
  <include file="$(find franka_gripper)/launch/franka_gripper.launch" if="$(arg load_gripper)">
    <arg name="robot_ip" value="$(arg robot_ip)" />
    <arg name="arm_id"   value="$(arg arm_id)" />
  </include>
# 加载夹爪节点
# 不再拓展讲,有兴趣的自己看
  <node name="franka_control" pkg="franka_control" type="franka_control_node" output="screen" required="true">
    <rosparam command="load" file="$(find franka_control)/config/franka_control_node.yaml" subst_value="true" />
    <param name="robot_ip" value="$(arg robot_ip)" />
  </node>
# 启动franka_control_node控制节点
# 载入相关配置参数franka_control_node.yaml
 <rosparam command="load" file="$(find franka_control)/config/default_controllers.yaml" subst_value="true" />
  <node name="state_controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" args="franka_state_controller"/>
# 载入控制器参数default_controllers.yaml到ROS参数服务器
# 使用控制器管理者的spawner来启动franka_state_controller
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen"/>
  <node name="joint_state_publisher" type="joint_state_publisher" pkg="joint_state_publisher" output="screen">
    <rosparam if="$(arg load_gripper)" param="source_list">[franka_state_controller/joint_states, franka_gripper/joint_states] </rosparam>
    <rosparam unless="$(arg load_gripper)" param="source_list">[franka_state_controller/joint_states] </rosparam>
    <param name="rate" value="30"/>
  </node>
# 加载机器人状态发布器robot_state_publisher节点
# 加载机器人关节状态发布器joint_state_publisher节点

Aktivieren Sie Controller vom Typ Standortsteuerung

 <!-- By default use joint position controllers -->
  <arg name="transmission" default="position" />
  <!-- Start ROS controllers -->
  <include file="$(dirname)/ros_controllers.launch" pass_all_args="true" />

Aktivieren Sie Controller vom Typ Positionssteuerung, also position_joint_trajectory_controllereinen Controller mit dem Namen: Es ist derzeit nicht bekannt, welcher Controller in den ROS-Parameterserver geladen wird, aber er simple_moveit_controllers.yamlkann in gefunden werden. Wenn Sie simpleeinen Controller-Manager vom Typ verwenden, wird der $(arg transmission)_joint_trajectory_controllerController-Parameter mit dem Namen „Will“ angezeigt in den ROS-Parameterserver geladen werden, was bedeutet, dass simpleder Controller korrekt geladen wird, wenn er zu diesem Zeitpunkt verfügbar ist .

simple_moveit_controllers.yaml

controller_list:
  - name: $(arg transmission)_joint_trajectory_controller
    action_ns: follow_joint_trajectory
    type: FollowJointTrajectory
    default: True
    joints:
      - $(arg arm_id)_joint1
      - $(arg arm_id)_joint2
      - $(arg arm_id)_joint3
      - $(arg arm_id)_joint4
      - $(arg arm_id)_joint5
      - $(arg arm_id)_joint6
      - $(arg arm_id)_joint7
  - name: franka_gripper
    action_ns: gripper_action
    type: GripperCommand
    default: True
    joints:
      - $(arg arm_id)_finger_joint1

Starten Sie das RViz-Fenster

  <!-- as well as MoveIt demo -->
  <include file="$(dirname)/demo.launch" pass_all_args="true">
    <!-- robot description is loaded by franka_control.launch -->
    <arg name="load_robot_description" value="false" />
    <!-- MoveItSimpleControllerManager provides ros_control's JointTrajectory controllers
         as well as GripperCommand actions -->
    <arg name="moveit_controller_manager" value="simple" />
  </include>

Starten Sie den Klassiker. demo.launchIch schätze, er wird zum Ziehen und Ablegen des Motion_planning-Plug-Ins in RViz verwendet, um den physischen Manipulator zu steuern.

Slice-Analyse 16: setup_assistant.launch

<!-- Re-launch the MoveIt Setup Assistant with this configuration package already loaded -->
<launch>

  <!-- Debug Info -->
  <arg name="debug" default="false" />
  <arg unless="$(arg debug)" name="launch_prefix" value="" />
  <arg     if="$(arg debug)" name="launch_prefix" value="gdb --ex run --args" />

  <!-- Run -->
  <node pkg="moveit_setup_assistant" type="moveit_setup_assistant" name="moveit_setup_assistant"
        args="--config_pkg=panda_moveit_config"
        launch-prefix="$(arg launch_prefix)"
        required="true"
        output="screen" />

</launch>

Durch die Übergabe von --config_pkg=panda_moveit_configParametern kann der Inhalt Moveit SetupAssistantdieses Pakets direkt geladen werden moveit_config, was normalerweise zur Neukonfiguration des Pakets verwendet wird. Das Gleiche gilt natürlich auch für das
direkte Öffnen der manuellen Beladung, je nachdem, was bequemer ist.Moveit SetupAssistant

Andere Scheiben

pandu_moveit_configDas Paket enthält auch einige andere einzigartige Dateien, die in normalen moveit_configPaketen nicht zu finden sind, aber nützlicher sind.
Beispielsweise sind CHOMP, LERP und STOMP unterschiedliche Algorithmen, die für die Roboterbahnplanung verwendet werden. In diesem Fall werden demo_chomp.launchdie Dateien , demo_lerp.launchund demo_stomp.launchverwendet, um diese verschiedenen Pfadplanungsalgorithmen zu starten und zu demonstrieren.

  1. demo_chomp.launch : CHOMP (Collision-Heuristic Optimization for Motion Planning) ist ein Roboterpfadplanungsalgorithmus, der Pfade basierend auf heuristischer Optimierung plant, um Kollisionen mit Objekten in der Umgebung zu vermeiden. Diese Demodatei startet ein Beispiel für die Pfadplanung mit dem CHOMP-Algorithmus.

  2. demo_lerp.launch : LERP (Linear Interpolation) ist einer der einfachsten Pfadplanungsalgorithmen. Er generiert einfach eine gerade Linie zwischen der aktuellen Position des Roboters und der Zielposition. Da Hindernisse in der Umgebung jedoch nicht berücksichtigt werden, ist dieser Algorithmus möglicherweise nicht für alle Situationen geeignet. Diese Demodatei startet ein Beispiel für die Pfadplanung mit dem LERP-Algorithmus.

  3. demo_stomp.launch : STOMP (Stochastic Trajectory Optimization for Motion Planning) ist ein weiterer Roboterpfadplanungsalgorithmus, der stochastische Optimierungsmethoden zum Planen von Pfaden verwendet. Im Gegensatz zu CHOMP berücksichtigt STOMP die dynamische Natur des Roboters sowie das Rauschen und die Unsicherheit bei der Pfadplanung. Diese Demodatei startet ein Beispiel für die Pfadplanung mit dem STOMP-Algorithmus.

Diese drei .launch-Dateien werden verwendet, um zu demonstrieren, wie man mit MoveIt und ROS verschiedene Pfadplanungsalgorithmen verwendet. Welchen Algorithmus Sie wählen, hängt von Ihren spezifischen Bedürfnissen und den Eigenschaften Ihres Roboters ab.

Quellcode-Analyse von Moveit

Bei der Dateianalyse des Konfigurationspakets config werden viele Parameter in den ROS-Parameterserver importiert, aber die spezifische Implementierung und der Aufrufprozess sind für Benutzer undurchsichtig. Wenn Sie das verstehen möchten, müssen Sie tief in den Quellcode von moveit eintauchen. In Anbetracht dieses Artikels ist die Länge des Artikels zu lang, daher wird die Moveit-Quellcode-Analyse in einem anderen Artikel platziert und hier ein Link
TODO: Moveit-Quellcode-Analyse-Link angehängt.

Je suppose que tu aimes

Origine blog.csdn.net/m0_56661101/article/details/131415296
conseillé
Classement