ROS LKW Wagen. Teil 4. Erstellen einer Robotersimulation mit den Editoren rviz und pavillon

Beiträge in der Reihe:
8. Wir steuern von der Telefon-ROS-Steuerung, GPS-Knoten
7. Roboterlokalisierung: Gmapping, AMCL, Referenzpunkte auf der Raumkarte
6. Kilometerzähler mit Radgebern, Raumkarte, Lidar
5. Wir arbeiten in Rviz und Pavillon: Xacro, neue Sensoren.
4. Erstellen Sie eine Robotersimulation mit den Editoren rviz und pavillon.
3. Beschleunigen, Kamera wechseln, Gang fixieren
2. Software
1. Eisen

Fortsetzung einer Reihe von Artikeln über die Erstellung eines kleinen Roboters. Dieses Mal werden wir über das Erstellen einer Kopie des Roboters in der Simulation sprechen, die von den visuellen ROS-Umgebungen rviz und pavillon (im Folgenden als „Editoren“ bezeichnet) angeboten wird. Die Arbeit in Editoren wird auf einer virtuellen Maschine ausgeführt, deren Image zuvor zum Herunterladen des Images bereitgestellt wurde. Da es sich um Simulation und Modellbildung handelt, wird der Roboterwagen selbst nicht benötigt.



Vorherige Beiträge in der Reihe:

1. Teil 3
2. Teil 2
3. Teil 1

Erstellen grundlegender Urdf-Dateien

Im Allgemeinen besteht der Prozess der vereinfachten Erstellung eines Roboters in der Regel aus den folgenden Schritten:

1. Erstellen eines Robotermodells.
2. Testen des Modells in einer Simulation.
3. Erstellen eines echten Robotermodells.
4. Testen eines realen Modells.

Bei der Arbeit mit ROS-Editoren, die sowohl für Gebäudemodelle als auch für ihre Tests in der virtuellen Welt hervorragende Möglichkeiten bieten, müssen wir zugeben, dass sich reale Robotermodelle nicht immer wie ihre unkörperlichen Brüder verhalten. Und hier wird die Zeit für die Arbeit mit Modellen in der virtuellen Welt zu der Zeit hinzugefügt, die für die Fertigstellung des realen Modells erforderlich ist.
Ein solches Zeitgeschenk kann sich, wie eine berühmte Person sagte, nicht nur alles leisten.

In diesem Zusammenhang wurde in früheren Beiträgen die Abfolge der Robotik gestört: Zunächst wurde ein reales Modell des Roboters erstellt. Jetzt werden wir sozusagen über die Virtualisierung sprechen.

Urdf erstellen


Um die Simulation in Gazebo vollständig genießen und den Roboter testen zu können, müssen Sie zuerst eine URDF-Datei für den Roboter erstellen.

Die URDF-Datei ist eine Art Skelettskelett im Bereich der Visualisierung.
Einfach ausgedrückt ist eine URDF-Datei eine Datei, die einen Roboter beschreibt.

Wie bereits erwähnt, werden die Arbeiten mit dem VMWARE Workstation-Image ausgeführt, auf dem ROS (Ubuntu 16.04, ROS-Kinetic) und visuelle Editoren bereits installiert sind. Daher sind alle Aktionen in diesem System reproduzierbar.

Erstellen Sie ein ROS-Paket mit dem Namen rosbots_description.

Dazu müssen Sie den Ordner mit catkin_ws / src eingeben und den Befehl ausführen, um das Paket in ROS zu erstellen:

roscd; cd ..; cd src; catkin_create_pkg rosbots_description rospy 

* Wenn bei der Ausführung des Befehls roscd; cd ..; cd src; Wenn Sie nicht in catkin_ws einsteigen, haben Sie möglicherweise mehrere Umgebungen dieses Typs. Um den erforderlichen zu aktivieren, gehen Sie zum Ordner catkin_ws und führen Sie den folgenden Befehl aus: source devel / setup.bash. Um nicht verloren zu gehen, können Sie, wenn Sie mit einem Bild arbeiten, aus dem Stammverzeichnis in diesen Ordner gelangen: cd ~; cd catkin_ws.

Wenn alles gut gegangen ist, wird der Ordner rosbots_description erstellt.

Warum ist es so schwierig und nicht einfacher, einen Ordner in catkin_ws / src manuell zu erstellen? Und was ist das für ein Rospy?

Sie können einen Ordner manuell erstellen, müssen aber auch zwei weitere Dateien manuell schreiben, mit denen ROS zusammenarbeitet: CMakeLists.txt und package.xml.

Sie befinden sich nach der Erstellung im Ordner:



Ihre ROS erstellt von selbst. Wir werden uns zwar nicht mit ihrem Inhalt befassen.
rospy am Ende des Befehls bedeutet, Abhängigkeiten zu erstellen und Python zu unterstützen.

Weitermachen.

Erstellen Sie im neu erstellten Paket rosbots_description den Ordner urdf und darin die Datei rosbots.xacro.

 roscd rosbots_description mkdir urdf; cd urdf; touch rosbots.xacro chmod +x rosbots.xacro 

Das Schöne am ROS-System ist, dass Sie in dem Ordner des Systems, in dem Sie sich nicht befinden würden, sofort zum Ziel gelangen können, indem Sie einfach seinen Namen mit dem Befehl roscd am Anfang der Zeile eingeben.

Fügen Sie nun den folgenden Code in die neu erstellte Datei ein:

rosbots.xacro
 <?xml version="1.0" encoding="utf-8"?> <robot name="rosbots" xmlns:xacro="http://www.ros.org/wiki/xacro"> <link name="base_footprint"/> <joint name="base_joint" type="fixed"> <origin xyz="0 0 0.05" rpy="0 0 0" /> <parent link="base_footprint"/> <child link="base_link" /> </joint> <link name="base_link"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/base.dae"/> </geometry> <origin xyz="-0.52 -0.4 0.43" rpy="0 0 0"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/base.dae"/> </geometry> <origin xyz="-0.52 -0.4 0.43" rpy="0 0 0"/> </collision> <inertial> <origin xyz="0.0 0 0."/> <mass value="0.5"/> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.03" /> </inertial> </link> <joint name="second_level_joint" type="fixed"> <origin xyz="0 0 0.68" rpy="0 0 0" /> <parent link="base_link"/> <child link="base_second_link" /> </joint> <link name="base_second_link"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/base.dae"/> </geometry> <origin xyz="-0.52 -0.4 0.0" rpy="0 0 0"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/base.dae"/> </geometry> <origin xyz="-0.52 -0.4 0.0" rpy="0 0 0"/> </collision> <!--inertial> <origin xyz="0.01 0 0.7"/> <mass value="1.0"/> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.03" /> </inertial--> </link> <joint name="mcu_joint" type="fixed"> <origin xyz="0.02 0.12 0.73" rpy="0 0 0" /> <parent link="base_link"/> <child link="mcu_link" /> </joint> <link name="mcu_link"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/rasp.dae" scale="0.14 0.14 0.14"/> </geometry> <origin xyz="0.9 -1.25 0" rpy="0 0 1.57"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/rasp.dae" scale="0.14 0.14 0.14"/> </geometry> <origin xyz="0.9 -1.25 0" rpy="0 0 1.57"/> </collision> <!-- inertial> <origin xyz="0.01 0 0"/> <mass value="1.0"/> <inertia ixx="0.019995" ixy="0.0" ixz="0.0" iyy="0.019995" iyz="0.0" izz="0.03675" /> </inertial--> </link> <joint name="mcu_joint_1" type="fixed"> <origin xyz="0.02 0.12 0.83" rpy="0 0 0" /> <parent link="base_link"/> <child link="mcu_link_1" /> </joint> <link name="mcu_link_1"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/rasp.dae" scale="0.14 0.14 0.14"/> </geometry> <origin xyz="0.9 -1.25 0" rpy="0 0 1.57"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/rasp.dae" scale="0.14 0.14 0.14"/> </geometry> <origin xyz="0.9 -1.25 0" rpy="0 0 1.57"/> </collision> <!-- inertial> <origin xyz="0.01 0 0"/> <mass value="1.0"/> <inertia ixx="0.019995" ixy="0.0" ixz="0.0" iyy="0.019995" iyz="0.0" izz="0.03675" /> </inertial--> </link> <joint name="stand_mcu1_joint" type="fixed"> <origin xyz="0.02 0.25 0.78" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_mcu1_link" /> </joint> <link name="stand_mcu1_link"> <visual> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> </link> <joint name="stand_mcu2_joint" type="fixed"> <origin xyz="0.02 -0.1125 0.78" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_mcu2_link" /> </joint> <link name="stand_mcu2_link"> <visual> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> </link> <joint name="stand_mcu3_joint" type="fixed"> <origin xyz="0.25 0.25 0.78" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_mcu3_link" /> </joint> <link name="stand_mcu3_link"> <visual> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> </link> <joint name="stand_mcu4_joint" type="fixed"> <origin xyz="0.25 -0.1125 0.78" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_mcu4_link" /> </joint> <link name="stand_mcu4_link"> <visual> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> </link> <joint name="batery_joint" type="fixed"> <origin xyz="1.2 0.2 0.43" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="batery_link" /> </joint> <link name="batery_link"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/battery.dae" scale="13.0 6.0 6.0"/> </geometry> <origin xyz="0 4.5 0.05" rpy="1.57 0 1.57"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/battery.dae" scale="13.0 6.0 6.0"/> </geometry> <origin xyz="0 4.5 0.05" rpy="1.57 0 1.57"/> </collision> <!-- inertial> <origin xyz="0.01 0 0"/> <mass value="1.0"/> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.03" /> </inertial--> </link> <joint name="stand_1_joint" type="fixed"> <origin xyz="0.5 0.4125 0.58" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_1_link" /> </joint> <link name="stand_1_link"> <visual> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> <!--inertial> <origin xyz="0.0 0 0"/> <mass value="1.0"/> <inertia ixx="0.019995" ixy="0.0" ixz="0.0" iyy="0.019995" iyz="0.0" izz="0.03675" /> </inertial--> </link> <joint name="stand_2_joint" type="fixed"> <origin xyz="0.5 -0.2625 0.58" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_2_link" /> </joint> <link name="stand_2_link"> <visual> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> <!--inertial> <origin xyz="0.0 0 0"/> <mass value="1.0"/> <inertia ixx="0.019995" ixy="0.0" ixz="0.0" iyy="0.019995" iyz="0.0" izz="0.03675" /> </inertial--> </link> <joint name="wheel_left_joint" type="continuous"> <parent link="base_link"/> <child link="wheel_left_link"/> <origin xyz="0.15 0.4125 0.30" rpy="-1.57 0 0"/> <axis xyz="0 0 1"/> </joint> <link name="wheel_left_link"> <collision> <geometry> <cylinder length="0.20" radius="0.23"/> </geometry> <origin rpy="0.0 0.0 0" xyz="0 0 0.1"/> </collision> <visual name="visual"> <geometry> <!-- cylinder length="0.0206" radius="0.0550"/--> <!--cylinder length="0.20" radius="0.26"/--> <mesh filename="package://rosbots_description/meshes/wheel.dae" scale="8.0 8.0 8.0"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0"/> </visual> <inertial> <mass value="0.4" /> <origin xyz="0 0 0" /> <inertia ixx="0.001" ixy="0.0" ixz="0.0" iyy="0.001" iyz="0.0" izz="0.001" /> </inertial> </link> <joint name="wheel_right_joint" type="continuous"> <parent link="base_link"/> <child link="wheel_right_link"/> <origin xyz="0.15 -0.5625 0.30" rpy="-1.57 0 0"/> <axis xyz="0 0 1"/> </joint> <link name="wheel_right_link"> <collision> <geometry> <cylinder length="0.20" radius="0.23"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.195"/> </collision> <visual name="visual"> <geometry> <!--cylinder length="0.20" radius="0.26"/--> <mesh filename="package://rosbots_description/meshes/wheel.dae" scale="8.0 8.0 8.0"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0"/> </visual> <inertial> <mass value="0.4" /> <origin xyz="0 0.0 0.3" /> <inertia ixx="0.001" ixy="0.0" ixz="0.0" iyy="0.001" iyz="0.0" izz="0.001" /> </inertial> </link> <joint name="caster_back_joint" type="fixed"> <parent link="base_link"/> <child link="caster_back_link"/> <origin xyz="-0.4 0.1 0.26" rpy="0 0 0"/> </joint> <link name="caster_back_link"> <collision> <geometry> <!-- cylinder length="0.05" radius="0.19"/--> <sphere radius="0.19"/> </geometry> <origin rpy="0 0 0" xyz="0 0 0"/> </collision> <visual> <geometry> <!--cylinder length="0.05" radius="0.19"/--> <sphere radius="0.19"/> </geometry> <origin rpy="0 0 0" xyz="0 0 0"/> </visual> <inertial> <mass value="0.1" /> <origin xyz="0 0 0" /> <inertia ixx="0.001023539" ixy="0.0" ixz="0.0" iyy="0.001023539" iyz="0.0" izz="0.001023539" /> </inertial> </link> <joint name="stand_3_joint" type="fixed"> <origin xyz="-0.4 0.4125 0.58" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_3_link" /> </joint> <link name="stand_3_link"> <visual> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> </link> <joint name="stand_4_joint" type="fixed"> <origin xyz="-0.4 -0.2625 0.58" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_4_link" /> </joint> <link name="stand_4_link"> <visual> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> </link> </robot> 


Wenn der Code nicht angezeigt wird, können alle Dateien am Ende des Beitrags heruntergeladen werden.

Für den obigen Code benötigen wir auch Zellen (Mechs), die beim Start des Pakets geladen werden.

Meches können hier genommen werden
und lege den entpackten meches-Ordner in rosbots_description.

Wenn Sie sich den Code im Detail ansehen, können Sie feststellen, dass dies eine Standard-XML-Datei ist, die aus Blöcken besteht:
- visuell
- Kollision
- Trägheit

Jeder Block beschreibt seinen Teil: Visuell ist das Aussehen des Roboters, nicht mehr, Kollision und Trägheit ist die Physik des Roboters, wie alles mit der Außenwelt interagiert - Kollisionen, Trägheit.
Gelenke - Elemente, die helfen, die Bewegung zwischen Teilen des Roboters zu bestimmen (Verbindungen). Zum Beispiel wirkt sich die Bewegung des Rades (Rad) auf den gesamten Rahmen aus (Chasis).

Ursprung xyz ist die anfängliche Position des Objekts entlang der x-, y- und z-Achse.

Eltern-Link und Kind-Link sind die Eltern- bzw. Kind-Links, die aus dem Wachsen entstehen.
Das Vorhandensein von Typen ist ebenfalls bemerkenswert: Typ = "kontinuierlich", Typ = "fest". Dies ist eine Definition dessen, was sich drehen kann und was nicht. Die Räder sind also durchgehend. Und zum Beispiel ist batery_joint behoben.
Einrückungen im Code sind genauso aussagekräftig wie in Python, wo Sie Tabulatoren und Leerzeichen nicht stören können, nicht tragen. Aber für das Paradies und die Sichtbarkeit eines Perfektionisten ist es besser, sie zu haben.

Der obige Code ist im Wesentlichen ein Robotermodell.

Arbeit bei rviz


Mal sehen, was passiert ist.

Erstellen Sie dazu eine Startdatei, in der das ROS-Paket ausgeführt wird.

Hierzu werden in ROS die sogenannten Launch-Dateien verwendet. Die Startdatei besteht im Wesentlichen darin, den Start eines Knotens, Befehls oder mehrerer Knoten mit einem kurzen Befehl zu ermöglichen, ohne dass alle und andere Argumente angegeben werden müssen.

Erstellen Sie einen Startordner in der rosbots_description mit der Datei rviz.launch:

 roscd rosbots_description mkdir launch; cd launch; touch rviz.launch 

* In diesem und den folgenden Fällen muss kein ROS-Paket mehr wie zuvor erstellt werden. Jetzt "sieht" das System selbst die Dateien im Paket. Deshalb erstellen wir einfach ein Verzeichnis.

Füllen Sie die Datei mit Inhalten -
rviz.launch
  <?xml version="1.0"?> <launch> <param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'"/> <!-- send fake joint values --> <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"> <param name="use_gui" value="False"/> </node> <!-- Combine joint values --> <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher"/> <!-- Show in Rviz --> <node name="rviz" pkg="rviz" type="rviz" /> </launch> 


Hier können Sie sehen, dass das System beim Start in rosbots.xacro nach einer Beschreibung des Modells sucht.

Als Nächstes werden 3 Knoten gestartet: Joint_State_Publisher aus dem Joint_State_Publisher-Paket, Robot_State_Publisher aus Robot_State_Publisher, Rviz aus Rviz. Typ ist der Knotentyp, entspricht normalerweise der gleichnamigen Python- oder C-Datei, wird jedoch ohne Erweiterung angegeben.

Ausführen:

Führen Sie im 1. Terminal den ROS-Master aus:

 roscore 

Im 2 .:

 roslaunch rosbots_description rviz.launch 

* Wenn ein Fehler aufgetreten ist
ROS_MASTER_URI [http: //192.168.1 ....: 11311] Host ist für diesen Computer nicht festgelegt
, dann müssen Sie bashrc überprüfen - auf welcher IP-ROS läuft:

 nano ~/.bashrc 

Geben Sie die IP-Adresse der virtuellen Maschine in der bashrc-Datei selbst an (z. B. diese):

 export ROS_MASTER_URI=http://192.168.1.114:11311 

Lesen Sie bashrc weiter:

source ~/.bashrc oder Neustart.
** **.
Wenn der Roslaunch immer noch nicht gestartet wird, können Sie versuchen, in den Ordner catkin_ws zu wechseln und Folgendes auszuführen: source devel / setup.bash

Eintauchen in Rviz


Nachdem der Befehl ausgeführt wurde, wird der Rviz-Editor gestartet und die grafische Shell geöffnet.
Die visuelle Darstellung kann variieren, aber im Allgemeinen ist die Ansicht ungefähr wie folgt:



Links in der Spalte Anzeigen können Sie die Anzeigeoptionen für verschiedene Elemente beobachten, die mit ROS-Knoten interagieren. In der Mitte - das Bild des Roboters, rechts - eine Spalte mit einer Kameraansicht des Roboters. Ich muss gleich sagen, dass es besser ist, mit einer 3-Rad-Maus mit rviz zu arbeiten, da hier alle Maustasten beteiligt sind. Wenn Sie die linke Maustaste gedrückt halten, können Sie den Raum im Fenster drehen, während der Roboter angezeigt wird. Halten Sie die rechte Maustaste gedrückt - vergrößern / verkleinern, beide Tasten gedrückt halten - und verschieben Sie den Raum relativ zum Roboter.

Die meisten Arbeiten im Editor werden in den ersten beiden Spalten ausgeführt: Anzeigen und die visuelle Darstellung des Roboters.

Lassen Sie uns mit dem Aussehen eines Roboters arbeiten


Wählen wir in der Zeile "Fixed Frame" - "Base Link" aus:



Und fügen Sie die Roboterbeschreibung zu den Anzeigen hinzu:

Klicken Sie auf "Hinzufügen" und wählen Sie "RobotModel" in der Liste aus:

""

Jetzt können Sie im Simulationsfenster den Roboter beobachten, der aus dem Modell rviz.xacro reproduziert wurde:

""

Großartig. Mit einer visuellen Darstellung ist alles klar. Jetzt müssen Sie verstehen, wie die Simulation ausgeführt wird, da rviz nur eine Visualisierung der Simulation ist, nicht jedoch die Simulation selbst.
Das heißt, die Physik funktioniert hier nicht.

Die Simulation selbst befindet sich in einem Editor namens Gazebo.

Pavillon


Um das erstellte Modell in Gazebo zu platzieren, erstellen Sie eine weitere Startdatei - spawn.launch im Startordner des Projekts. Jetzt haben wir 2 Startdateien!

spawn.launch
 <?xml version="1.0" encoding="UTF-8"?> <launch> <param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" /> <arg name="x" default="0"/> <arg name="y" default="0"/> <arg name="z" default="0.5"/> <node name="mybot_spawn" pkg="gazebo_ros" type="spawn_model" output="screen" args="-urdf -param robot_description -model rosbots -x $(arg x) -y $(arg y) -z $(arg z)" /> </launch> 


Hier lesen wir auch das Modell und übergeben dann mit Argumenten seine Position im Raum entlang der x-, y- und z-Achse. Führen Sie als Nächstes nur einen Knoten aus - mybot_spawn aus dem Paket pavbo_ros.
* Die oben genannten Pakete müssen nicht neu installiert werden. Falls gewünscht, können Sie diese Pakete mit demselben Befehl anzeigen: roscd. Zum Beispiel roscd pavillon_ros.

Stoppen Sie nun den Ros-Master in Terminal 1:

 CTRL+C 

Führen Sie den Gazebo-Editor aus:

 roslaunch gazebo_ros empty_world.launch 

Führen Sie in Terminal 2 die neu erstellte Datei aus:

 roslaunch rosbots_description spawn.launch 

Jetzt sehen wir unseren Roboter in der Simulation des Gazebo-Editors:



* Wenn Sie einen Fehler haben: Waiting for service /gazebo/spawn_urdf_model
Dies bedeutet, dass Sie das Modell gestartet haben, ohne Gazebo zuerst zu starten, was gegen die Startreihenfolge verstößt.

Gehen wir zur Pavillonsimulation.


Fügen Sie nun vor dem schließenden Tag den folgenden Code zu rosbots.xacro hinzu:

Code
 <gazebo> <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so"> <legacyMode>false</legacyMode> <alwaysOn>true</alwaysOn> <publishWheelTF>true</publishWheelTF> <publishTf>1</publishTf> <publishWheelJointState>true</publishWheelJointState> <updateRate>100.0</updateRate> <leftJoint>wheel_left_joint</leftJoint> <rightJoint>wheel_right_joint</rightJoint> <wheelSeparation>1.1</wheelSeparation> <wheelDiameter>0.52</wheelDiameter> <wheelAcceleration>1.0</wheelAcceleration> <torque>20</torque> <commandTopic>/part2_cmr/cmd_vel</commandTopic> <odometryTopic>odom</odometryTopic> <odometryFrame>odom</odometryFrame> <robotBaseFrame>base_link</robotBaseFrame> </plugin> </gazebo> 


Simulator Gazebo kann beim Bearbeiten nicht geschlossen werden.

Löschen Sie nun das Modell aus dem Gazebo-Editor:

 rosservice call /gazebo/delete_model "model_name: 'rosbots'" 

Oder starten Sie einfach den Editor neu.

* Gazebo ist in einer virtuellen Maschine launisch, so dass selbst nach dem Schließen manchmal STRG + C zusätzlich im Terminal vergeben wird.

Ersetzen Sie das Modell nach der Bearbeitung in Gazebo:

 roslaunch rosbots_description spawn.launch 

Wenn Sie sich jetzt die Liste der ROS-Themen ansehen, können Sie sehen, dass es unter ihnen gibt

 /part2_cmr/cmd_vel 



Versuchen wir nun, den Roboter in der Simulation zu steuern, indem wir die Steuerung in einem separaten Terminal ausführen:

 rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel 

Wenn Sie sich bei laufender Steuerung im Fenster befinden und die Tasten „i“, „l“, „j“, „k“, „,“ im Terminalfenster drücken, können Sie die Bewegung des Roboters in der Simulation des Gazebo-Editors beobachten:



Code - herunterladen .

Fortsetzung folgt.

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


All Articles