Beiträge in der Reihe:
8. Wir steuern von der Telefon-ROS-Steuerung, GPS-Knoten7. Roboterlokalisierung: Gmapping, AMCL, Referenzpunkte auf der Raumkarte6. Kilometerzähler mit Radgebern, Raumkarte, Lidar5. 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 fixieren2. Software1. EisenBeim letzten Mal wurden folgende Ziele erreicht:
- Visualisieren Sie den Roboter, indem Sie eine XACRO-Datei erstellen, die die Urdf-Beschreibung des Roboters enthält.
- Erstellen Sie zwei Startdateien, von denen eine es Ihnen ermöglicht, den Roboter im Editor-Simulator-Pavillon zu platzieren.
- Steuern Sie den Roboter im Pavillon-Simulator über die Tastatur.
In diesem Beitrag werden wir das Projekt in Form von xacro-Modulen anordnen, damit es besser lesbar wird (aus Gründen der Übersichtlichkeit haben wir die gesamte Beschreibung früher in eine xacro-Datei verschoben). Fügen Sie eine virtuelle Videokamera und imu hinzu. Mal sehen, wie man Fremdkörpern in der Welt um uns herum einen Pavillon hinzufügt.
Überprüfen Sie zunächst mit den Befehlen roscd, ob das Terminal durch das ROS-System navigiert:
roscd rosbots_description/launch
Wenn es nicht funktioniert, gehen Sie mit catkin_ws in den Ordner und führen Sie den folgenden Befehl aus:
source devel/setup.bash
Gehen wir nun zu dem Ordner mit der Beschreibung des Roboters:
roscd rosbots_description/launch
In der zuvor erstellten Datei spawn.launch wurde Folgendes angegeben:
<param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" />
Der Befehl
cat wurde verwendet, um den Inhalt von rosbots.xacro in den Parameter robot_description zu laden.
Um das xacro-Befehlsformat voll ausnutzen zu können, muss der Code leicht korrigiert werden. Ersetzen Sie die obige Zeile durch Folgendes:
<param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'" />
Jetzt verwendet das System xacro.py, um rosbots.xacro auszuführen.
Die gleichen Änderungen sind für die zweite Startdatei erforderlich - rviz.launch.
Ändern
<param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" />
auf
<param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'"/>
Überprüfen Sie, ob alles mit der neuen Syntax funktioniert.
Schauen Sie sich zunächst das Modell im rviz-Editor an:
roslaunch rosbots_description rviz.launch
Dann schließen Sie rviz und checken den Pavillon ein.
1. Terminal:
roslaunch gazebo_ros empty_world.launch
2. Platz:
roslaunch rosbots_description spawn.launch
* Sie können die Nachrichten sehen
gelbe Farbe xacro: Traditional processing is deprecated. Switch to --inorder processing! To check for compatibility of your document, use option --check-order. For more infos, see http://wiki.ros.org/xacro#Processing_Order xacro.py is deprecated; please use xacro instead
Sie geben nicht das Wetter, so dass Sie nicht aufpassen können.
Also funktioniert alles wie bisher, nur jetzt wird das xacro-Format verwendet.
Was gibt er? Mit diesem Format können Sie den Code neu organisieren. Wenn das Projekt wächst, wird es möglich sein, in Zukunft besser zu navigieren.
Arbeiten mit xacro
Jetzt ist es Zeit, rosbots.xacro in seine Bestandteile aufzuteilen und xacro zu nutzen.
Verschieben Sie alles über den Pavillon-Editor (Pavillon-Tags) von rosbots.xacro in eine neue Datei.
Erstellen Sie die Datei rosbots.gazebo.xacro im Ordner urdf:
nano rosbots.gazebo.xacro
Und geben Sie den Code dort ein:
rosbots.gazebo.xacro <?xml version="1.0"?> <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="rosbots" > <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> </robot>
Der gleiche Code innerhalb des Tags
<gazebo> </gazebo>
aus der Datei rosbots.xacro löschen.
Jetzt werden wir die neu erstellte Datei an rosbots.xacro anhängen. Von irgendwoher sollten die gleichen Informationen über die Pavillonkomponente von rosbots.xacro erhalten werden!
Fügen Sie dementsprechend zu rosbots.xacro hinzu:
<xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" />
Fügen Sie diese Zeile nach der Zeile mit dem Tag ein
<robot>
. Nun sieht der Anfang der Datei folgendermaßen aus:
<robot name="rosbots" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" />
Überprüfen Sie erneut, ob alles im neuen Format funktioniert:
1. Terminal:
roslaunch gazebo_ros empty_world.launch
2. Platz:
roslaunch rosbots_description spawn.launch
Für den Benutzer bleibt also alles an seinem Platz, was das Starten des Modells in der Simulation betrifft. Die Befehle sind dieselben.
Fügen Sie neue Sensoren hinzu
Nachdem das Projekt mehr oder weniger strukturiert aussieht, werden wir zusätzliche Sensoren anbringen.
Um den Roboter nicht mit „Body Kits“ zu überladen, fügen wir nur zwei Sensoren hinzu: eine Kamera und ein IMU (Trägheitsmessmodul oder Gyroskop).
Zu diesem Zweck müssen Sie die Dateien rosbots.xacro und rosbots.gazebo.xacro reparieren.
Beginnen wir mit der Kamera und der Datei rosbots.xacro. Damit alles funktioniert, müssen Sie für den Sensor Folgendes hinzufügen:
- Kommunikation (Link). Es wird durch eine dae-Datei dargestellt.
- Gelenk, mit dem die Kamera am Körper des Roboters befestigt wird.
In einer anderen Datei - rosbots.gazebo.xacro - werden wir hinzufügen:
- Ein Plugin, das den oben erstellten Link als Sensor erkennt.
Wir platzieren es in rosbots.xacro innerhalb des Tags (der Einfachheit halber können Sie es am Ende hinzufügen):
rosbots.xacro <joint name="camera_joint" type="fixed"> <origin xyz="0.49 -0.03 0.75" rpy="0 0.21 0" /> <parent link="base_link"/> <child link="camera_link" /> </joint> <link name="camera_link"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/camera.dae" scale="4.0 4.0 4.0"/> </geometry> <origin xyz="0.0 0 0" rpy="0 0 0"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/camera.dae" scale="4.0 4.0 4.0"/> </geometry> <origin xyz="0.0 0 0" rpy="0 0 0"/> </collision> </link>
Der obige Code fügt unserer Kamera einen Link und eine Verbindung hinzu, sodass sie visualisiert werden kann.
Überprüfen Sie dies heraus.
1. Terminal:
roslaunch gazebo_ros empty_world.launch
2. Platz:
roslaunch rosbots_description spawn.launch
Wenn alles korrekt ist, können Sie die hinzugefügte Kamera am Roboter sehen (weiß):

Es scheint, dass alles einfach ist. Es muss jedoch verstanden werden, dass nur eine Kameravisualisierung hinzugefügt wurde. Wie sich diese Kamera in der Welt der physischen Dinge verhält, ist noch nicht klar. Ihr Verhalten ist undefiniert. Die Kamera kann noch keine Fotos oder Videos aufnehmen.
Es ist an der Zeit, die Datei mit dem Pavillon zu bearbeiten.
Hinzufügen zu
rosbots.gazebo.xacroinnerhalb von Tags
<robot> </robot>
hinzufügen:
<gazebo reference="camera_link"> <sensor type="camera" name="camera1"> <update_rate>30.0</update_rate> <camera name="head"> <horizontal_fov>1.04</horizontal_fov> <image> <width>320</width> <height>240</height> <format>R8G8B8</format> </image> <clip> <near>0.1</near> <far>50</far> </clip> </camera> <plugin name="camera_controller" filename="libgazebo_ros_camera.so"> <alwaysOn>true</alwaysOn> <updateRate>0</updateRate> <cameraName>camera1</cameraName> <imageTopicName>image_raw</imageTopicName> <cameraInfoTopicName>camera_info</cameraInfoTopicName> <frameName>camera</frameName> <hackBaseline>0.07</hackBaseline> <distortionK1>0.0</distortionK1> <distortionK2>0.0</distortionK2> <distortionK3>0.0</distortionK3> <distortionT1>0.0</distortionT1> <distortionT2>0.0</distortionT2> </plugin> </sensor> </gazebo>
Da der Code leicht zu erraten ist, haben wir die Kameraparameter ermittelt:
- update_rate: Wie oft werden die Daten eintreffen?
- Breite / Höhe: Auflösung der Bilder. In diesem Fall 320x240.
- Format: Videoformat (R8G8B8).
- imageTopicName: Der Name des Themas, an das die Daten gesendet werden
- frameName: Link-Link, an den die Kamera angeschlossen wird.
Jetzt ist alles bereit, um sowohl die Kamera als auch ihre Simulation zu visualisieren.
Wenn Sie jetzt die Simulation neu starten und die Themenliste anzeigen, können Sie sehen, dass unter diesen die von der Kamera generierten Themen hinzugefügt wurden:
rostopic list
/rosbots/camera1/camera_info /rosbots/camera1/image_raw /rosbots/camera1/image_raw/compressed /rosbots/camera1/image_raw/compressed/parameter_descriptions /rosbots/camera1/image_raw/compressed/parameter_updates /rosbots/camera1/image_raw/compressedDepth /rosbots/camera1/image_raw/compressedDepth/parameter_descriptions /rosbots/camera1/image_raw/compressedDepth/parameter_updates /rosbots/camera1/image_raw/theora /rosbots/camera1/image_raw/theora/parameter_descriptions /rosbots/camera1/image_raw/theora/parameter_updates /rosbots/camera1/parameter_descriptions /rosbots/camera1/parameter_updates
Es gibt ein ganzes Arsenal an Themen! Aber in der Regel werden nicht alle außer den ersten drei so oft verwendet.
Bild in rviz vom Pavillonsimulator
* Hier muss reserviert werden, dass in der aktuellen Konfiguration des Images für VMWare Workstation der Pavillon abstürzt, wenn Sie versuchen, die Übertragung von einer virtuellen Videokamera an rviz zu starten. Eine mögliche Lösung ist am Ende des Beitrags im Fehlerabschnitt angegeben.Führen Sie aus Gründen der Übersichtlichkeit bei der Arbeit mit der Kamera in der Simulation rviz aus und platzieren Sie ein Objekt vor dem Roboter.
Dazu benötigen Sie zunächst das Objekt selbst, das dem Pavillon hinzugefügt wird.
Laden Sie die Datei
object.urdf herunter und legen Sie sie in ~ / catkin_ws / src / ab
Lass es uns laufen.
1. Terminal:
roslaunch gazebo_ros empty_world.launch
2. (Platzieren Sie die Modelle):
rosrun gazebo_ros spawn_model -file /home/pi/catkin_ws/src/object.urdf -urdf -x 1 -y 0 -z 1 -model my_object
roslaunch rosbots_description spawn.launch
In der Simulation erhalten wir folgendes Bild:

Ein Robotermodell und ein Beitrag, der ebenfalls als Modell hinzugefügt wurde.
Elemente können auf einfachere Weise über die Registerkarte im Einfüge-Editor zum Pavillon-Editor hinzugefügt werden:

Nun wollen wir sehen, was der Roboter sieht.
Führen Sie rviz mit der Beschreibung des Roboters aus, ohne die beiden vorherigen Terminals zu schließen:
roslaunch rosbots_description rviz.launch
Und fügen Sie ein neues Display mit dem Namen "Bild" hinzu:

Eine neue Anzeige mit einem Kamerabild wird angezeigt und ... der Pavillon-Editor wird ausgeflogen.
Wenn Sie an einer virtuellen Maschine mit einem VMWare-Image arbeiten, führt das Hinzufügen einer Übertragung von einer virtuellen Kamera leider zu einem Fehler.
Wenn die Arbeit nicht auf einer virtuellen Maschine, sondern auf einer realen Maschine ausgeführt wird, erhalten wir ein Bild von einer virtuellen Kamera im Pavillon mit einem Bild einer Spaltenfigur:

Fügen wir nun dem Modell IMU hinzu.
IMU (Gyroskop)
Das Hinzufügen von imu ähnelt dem Hinzufügen einer Kamera.
Öffnen Sie zuerst rosbots.gazebo.xacro und machen Sie
Code <gazebo> <plugin name="gazebo_ros_imu_controller" filename="libgazebo_ros_imu.so"> <topicName>imu/data</topicName> <serviceName>imu/service</serviceName> <bodyName>base_link</bodyName> <gaussianNoise>0</gaussianNoise> <rpyOffsets>0 0 0</rpyOffsets> <updateRate>30.0</updateRate> <alwaysOn>true</alwaysOn> <gaussianNoise>0</gaussianNoise> </plugin> </gazebo>
Wir werden diesen Code sowie den Code für die hinzugefügte Kamera innerhalb des Tags hinzufügen
<robot></robot>
Da es nicht schwierig ist, den Code zu erraten, werden die Daten im Thema / imu / data veröffentlicht.
Wenn Sie nun das Robotermodell in den Pavillon verschieben und den Befehl:
rostopic list
im benachbarten Terminal ausführen, können Sie das Thema unter anderem mit imu-Daten anzeigen:

Sie können sich auch ansehen, was er veröffentlicht, indem Sie den folgenden Befehl ausführen:
rostopic echo /imu/data -n1

Kurz gesagt, imu veröffentlicht die folgenden Informationen:
- Ausrichtung: Die Ausrichtung des Roboters entlang der x-, y-, z- und w-Achse.
- angle_velocity: Winkelgeschwindigkeit des Roboters.
- lineare_Beschleunigung: lineare Beschleunigung.
Es gab eine kleine Berührung
.
Zu rosbots.gazebo.xacro hinzufügen ist alles auch innerhalb des Tags
Code <gazebo reference="wheel_left_link"> <mu1>1.0</mu1> <mu2>1.0</mu2> <kp>1000000.0</kp> <kd>100.0</kd> <minDepth>0.001</minDepth> <maxVel>1.0</maxVel> </gazebo> <gazebo reference="wheel_right_link"> <mu1>1.0</mu1> <mu2>1.0</mu2> <kp>1000000.0</kp> <kd>100.0</kd> <minDepth>0.001</minDepth> <maxVel>1.0</maxVel> </gazebo> <gazebo reference="base_link"> <material>Gazebo/Blue</material> <mu1>0.3</mu1> <mu2>0.3</mu2> <sensor type="contact" name="bumpers"> <always_on>1</always_on> <update_rate>50.0</update_rate> <visualize>true</visualize> <contact> <collision>base_footprint_collision_base_link</collision> </contact> </sensor> </gazebo> <gazebo reference="camera_link"> <mu1>0.2</mu1> <mu2>0.2</mu2> </gazebo>
Dieser Code bestimmt zusätzliche Parameter des Roboters: Reibungskoeffizienten für Räder, Farben im Pavillon, Kontaktsensor. Der Kontaktsensor wird sofort ausgelöst, nachdem der Roboterstoßfänger das Hindernis berührt.
Starten Sie nun den Pavillon neu, platzieren Sie das Modell und fügen Sie in rviz imu display wie zuvor hinzu und fügen Sie die Anzeige mit einer Kamera hinzu:

Wenn alles gut gegangen ist, werden wir sehen, dass imu im Thema postet.
Abschließend werden wir den Roboter in der Simulation steuern und sehen, wie sich die Daten mit imu ändern:
1. Terminal:
roslaunch gazebo_ros empty_world.launch
2. Platz:
roslaunch rosbots_description spawn.launch
roslaunch rosbots_description rviz.launch
3. Platz:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel
Mögliche Fehler während des Betriebs :
1. Das Robotermodell wird nicht im Pavillon angezeigt (Paket [rosbots_description] hat keinen Pfad) - Pavillon schließen, Quellentwicklungs- / Setup.Bash im Terminal ausführen, Pavillon neu starten.
2.
gzserver: /build/ogre-1.9-mqY1wq/ogre-1.9-1.9.0+dfsg1/OgreMain/src/OgreRenderSystem.cpp:546: virtual void Ogre::RenderSystem::setDepthBufferFor(Ogre::RenderTarget*): Assertion `bAttached && "A new DepthBuffer for a RenderTarget was created, but after creation" "it says it's incompatible with that RT"' failed. Aborted (core dumped)
Mögliche Lösung (nicht getestet):
https://bitbucket.org/osrf/gazebo/issues/1837/vmware-rendering-z-ordering-appears-random