Messages dans la série:
8. Nous contrôlons à partir du téléphone-ROS Control, GPS-node7. Localisation du robot: gmapping, AMCL, points de référence sur le plan de la salle6. Odométrie avec encodeurs de roue, plan de salle, lidar5. Nous travaillons en rviz et gazebo: xacro, nouveaux capteurs.4. Créez une simulation de robot à l'aide des éditeurs rviz et gazebo.3. Accélérez, changez la caméra, corrigez la démarche2. Logiciel1. FerLa dernière fois, les objectifs suivants ont été atteints:
- visualiser le robot en créant un fichier xacro contenant la description urdf du robot;
- créer deux fichiers de lancement, dont l'un vous permet de placer le robot dans le Gazebo de l'éditeur-simulateur;
- contrôler le robot dans le simulateur Gazebo à partir du clavier.
Dans cet article, nous organiserons le projet sous forme de modules xacro afin qu'il devienne plus lisible (plus tôt, pour plus de clarté, nous avons poussé la description entière dans un fichier xacro). Ajoutez une caméra vidéo virtuelle et imu. Voyons comment ajouter un gazebo à des objets étrangers dans le monde qui nous entoure.
Tout d'abord, vérifiez si le terminal navigue dans le système ROS à l'aide des commandes roscd:
roscd rosbots_description/launch
Si cela ne fonctionne pas, allez dans le dossier avec catkin_ws et exécutez la commande:
source devel/setup.bash
Maintenant, allons dans le dossier avec la description du robot:
roscd rosbots_description/launch
Dans le fichier spawn.launch créé précédemment, les informations suivantes étaient indiquées:
<param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" />
La commande
cat a été utilisée pour charger le contenu de rosbots.xacro dans le paramètre robot_description.
Pour tirer pleinement parti du format de la commande xacro, le code doit être légèrement corrigé. Remplacez la ligne ci-dessus par ce qui suit:
<param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'" />
Maintenant, le système utilisera xacro.py pour exécuter rosbots.xacro.
Les mêmes modifications seront nécessaires pour le deuxième fichier de lancement - rviz.launch.
Changer
<param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" />
sur
<param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'"/>
Vérifiez que tout fonctionne avec la nouvelle syntaxe.
Tout d'abord, regardez le modèle dans l'éditeur rviz:
roslaunch rosbots_description rviz.launch
Ensuite, en fermant rviz, vérifiez dans le gazebo.
1er terminal:
roslaunch gazebo_ros empty_world.launch
2e:
roslaunch rosbots_description spawn.launch
* Vous pouvez voir les messages
couleur jaune 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
Ils ne donnent pas la météo, vous ne pouvez donc pas faire attention.
Donc, tout fonctionne comme avant, seulement maintenant le format xacro est utilisé.
Que donne-t-il? Ce format vous permet de réorganiser le code. Au fur et à mesure que le projet se développe, cela permettra de mieux naviguer à l'avenir.
Travailler avec xacro
Il est maintenant temps de diviser rosbots.xacro en ses composants et de profiter de xacro.
Déplacez tout sur l'éditeur de gazebo (balises de gazebo) de rosbots.xacro vers un nouveau fichier.
Créez le fichier rosbots.gazebo.xacro dans le dossier urdf:
nano rosbots.gazebo.xacro
Et mettez le code là:
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>
Le même code dans la balise
<gazebo> </gazebo>
supprimer du fichier rosbots.xacro.
Nous allons maintenant attacher le fichier nouvellement créé à rosbots.xacro. De quelque part, les mêmes informations sur le composant gazebo de rosbots.xacro devraient être reçues!
En conséquence, ajoutez à rosbots.xacro:
<xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" />
Insérez cette ligne après la ligne avec la balise
<robot>
. Maintenant, le début du fichier ressemble à ceci:
<robot name="rosbots" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" />
Vérifiez à nouveau que tout fonctionne dans le nouveau format:
1er terminal:
roslaunch gazebo_ros empty_world.launch
2e:
roslaunch rosbots_description spawn.launch
Ainsi, pour l'utilisateur, tout reste en place en termes de lancement du modèle dans la simulation, les commandes sont les mêmes.
Ajouter de nouveaux capteurs
Maintenant que le projet a pris un aspect plus ou moins structuré, nous allons attacher des capteurs supplémentaires.
Afin de ne pas encombrer fortement le robot avec des «kits corps», nous ajoutons seulement deux capteurs: une caméra et un imu (module de mesure inertielle ou gyroscope).
À ces fins, vous devrez corriger les fichiers rosbots.xacro et rosbots.gazebo.xacro.
Commençons par la caméra et le fichier rosbots.xacro. Pour que tout fonctionne, pour le capteur, vous devez ajouter:
- communication (lien). Il sera représenté par un fichier dae.
- commune, qui attachera la caméra au corps du robot.
Dans un autre fichier - rosbots.gazebo.xacro - nous ajouterons:
- un plugin qui détectera le lien créé ci-dessus en tant que capteur.
Nous le plaçons dans rosbots.xacro dans la balise (pour plus de commodité, vous pouvez l'ajouter à la fin):
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>
Le code ci-dessus ajoute un lien et un joint à notre caméra, ce qui permet de la visualiser.
Regardez ça.
1er terminal:
roslaunch gazebo_ros empty_world.launch
2e:
roslaunch rosbots_description spawn.launch
Si tout est correct, vous pouvez voir la caméra ajoutée sur le robot (blanc):

Il semble que tout soit simple. Cependant, il faut comprendre que seule la visualisation par caméra a été ajoutée. Le comportement de cette caméra dans le monde des choses physiques n'est pas encore clair. Son comportement n'est pas défini. L'appareil photo n'est pas encore en mesure de prendre des photos ou de filmer des vidéos.
Il est temps de travailler sur le dossier avec gazebo.
Ajouter à
rosbots.gazebo.xacroà l'intérieur des balises
<robot> </robot>
ajouter:
<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>
Comme il est facile de deviner dans le code, nous avons déterminé les paramètres de la caméra:
- update_rate: à quelle fréquence les données arriveront-elles
- largeur / hauteur: résolution des images. Dans ce cas, 320x240.
- format: format vidéo (R8G8B8).
- imageTopicName: le nom du sujet où les données seront envoyées
- frameName: lien-lien auquel la caméra sera attachée.
Maintenant, tout est prêt pour visualiser la caméra et sa simulation.
Si vous redémarrez maintenant la simulation et voyez la liste des sujets, vous pouvez voir que parmi eux les sujets générés par la caméra ont été ajoutés:
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
Il y a tout un arsenal de sujets! Mais, en règle générale, tous ne sont pas utilisés si souvent, sauf les trois premiers.
Image dans rviz du simulateur de gazebo
* ici, il convient de noter que dans la configuration actuelle de l'image pour le gazebo VMWare Workstation se bloque lorsque vous essayez de démarrer la diffusion vers rviz à partir d'une caméra vidéo virtuelle. Une solution possible est indiquée à la fin de l'article dans la section des erreurs.Pour plus de clarté, lorsque vous travaillez avec la caméra dans la simulation, exécutez rviz et placez un objet devant le robot.
Pour ce faire, vous avez d'abord besoin de l'objet lui-même, qui sera ajouté au gazebo.
Téléchargez le fichier
object.urdf et placez-le dans ~ / catkin_ws / src /
Lançons-le.
1er terminal:
roslaunch gazebo_ros empty_world.launch
2e (placez les modèles):
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
Dans la simulation, nous obtenons l'image suivante:

Un modèle de robot et un poste qui a également été ajouté en tant que modèle.
Les éléments peuvent être ajoutés à l'éditeur de gazebo d'une manière plus simple à partir de l'onglet à l'intérieur de l'éditeur d'insertion:

Voyons maintenant ce que voit le robot.
Sans fermer les deux terminaux précédents, lancez rviz avec la description du robot:
roslaunch rosbots_description rviz.launch
Et ajoutez-y un nouvel écran appelé «Image»:

Un nouvel affichage avec une image de caméra apparaîtra et ... l'éditeur de gazebo s'envolera.
Malheureusement, lorsque vous travaillez sur une machine virtuelle avec une image VMWare, l'ajout d'une diffusion à partir d'une caméra virtuelle entraîne une erreur.
Si le travail est effectué non pas sur une machine virtuelle, mais sur une machine réelle, nous obtiendrons une image d'une caméra virtuelle dans un gazebo avec une image d'une figure de colonne:

Ajoutons maintenant IMU au modèle.
IMU (gyroscope)
Le processus d'ajout d'imu est similaire à l'ajout d'un appareil photo.
Tout d'abord, ouvrez rosbots.gazebo.xacro et faites
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>
Nous ajouterons ce code, ainsi que le code de la caméra ajoutée, dans la balise
<robot></robot>
Comme il n'est pas difficile de deviner à partir du code, il publiera les données dans la rubrique / imu / data.
Maintenant, si vous
rostopic list
le modèle de robot dans le gazebo et exécutez la commande:
rostopic list
dans le terminal voisin, vous pouvez voir le sujet avec les données imu entre autres:

Vous pouvez également consulter ce qu'il publie en exécutant la commande:
rostopic echo /imu/data -n1

En bref, imu publie les informations suivantes:
- orientation: l'orientation du robot le long des axes x, y, z et w.
- angular_velocity: vitesse angulaire du robot.
- linear_acceleration: accélération linéaire.
Il y avait une petite touche
.
Ajouter à rosbots.gazebo.xacro tout est également dans la balise
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>
Ce code déterminera des paramètres supplémentaires du robot: coefficients de frottement pour les roues, couleurs dans le gazebo, capteur de contact. Le capteur de contact sera déclenché immédiatement après que le pare-chocs du robot aura touché l'obstacle.
Redémarrez maintenant le gazebo, placez le modèle et, dans rviz, ajoutez l'affichage imu comme précédemment, ajoutez l'affichage avec une caméra:

Si tout s'est bien passé, alors nous verrons que imu publie dans le sujet.
En conclusion, nous contrôlerons le robot dans la simulation et verrons comment les données changent avec imu:
1er terminal:
roslaunch gazebo_ros empty_world.launch
2e:
roslaunch rosbots_description spawn.launch
roslaunch rosbots_description rviz.launch
3ème:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel
Erreurs possibles pendant le fonctionnement :
1. Le modèle de robot n'apparaît pas dans le gazebo (le package [rosbots_description] n'a pas de chemin) - fermez le gazebo, exécutez la source devel / setup.bash dans le terminal, redémarrez le gazebo.
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)
Solution possible (non testée):
https://bitbucket.org/osrf/gazebo/issues/1837/vmware-rendering-z-ordering-appears-random