Chariot de camion ROS. Partie 4. Création d'une simulation de robot à l'aide des éditeurs rviz et gazebo

Messages dans la série:
8. Nous contrôlons à partir du téléphone-ROS Control, GPS-node
7. Localisation du robot: gmapping, AMCL, points de référence sur le plan de la salle
6. Odométrie avec encodeurs de roue, plan de salle, lidar
5. 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émarche
2. Logiciel
1. Fer

Suite d'une série d'articles sur la création d'un petit robot. Cette fois, nous parlerons de la création d'une copie du robot dans la simulation, qui est offerte par les environnements visuels ROS rviz et gazebo (ci-après dénommés «éditeurs»). Le travail dans les éditeurs sera effectué sur une machine virtuelle, dont l'image était précédemment fournie pour le téléchargement de l' image . Puisque nous parlons de simulation, de construction d'un modèle, le chariot robot lui-même n'est pas nécessaire.



Articles précédents de la série:

1. Partie 3
2. Partie 2
3. Partie 1

Création de fichiers urdf de base

En général, le processus de création d'un robot de manière simplifiée comprend généralement les étapes suivantes:

1. Création d'un modèle de robot.
2. Test du modèle dans une simulation.
3. Création d'un vrai modèle de robot.
4. Tester un vrai modèle.

En travaillant avec les éditeurs ROS, qui offrent de grandes opportunités pour les modèles de construction et leurs tests dans le monde virtuel, nous devons admettre que les vrais modèles de robots ne se comportent pas toujours de la même manière que leurs frères incorporels. Et ici, le temps de travailler avec des modèles dans le monde virtuel s'ajoute au temps nécessaire pour finaliser le modèle réel.
Un tel don de temps, comme l'a dit une personne célèbre, ne peut pas seulement se permettre tout.

À cet égard, dans les articles précédents, la séquence de la robotique a été perturbée: tout d'abord, un véritable modèle du robot a été créé. Nous allons maintenant parler de sa virtualisation, pour ainsi dire.

Créer urdf


Pour profiter pleinement de la simulation dans Gazebo et tester le robot, vous devez d'abord créer un fichier URDF pour le robot.

Le fichier URDF est une sorte de squelette squelette dans le domaine de la visualisation.
Autrement dit, un fichier URDF est un fichier décrivant un robot.

Comme indiqué précédemment, le travail sera effectué à l'aide de l'image VMWARE Workstation sur laquelle ROS (Ubuntu 16.04, ROS-Kinetic) et des éditeurs visuels sont déjà installés. Par conséquent, toutes les actions sont reproductibles dans ce système.

Créez un package ROS appelé rosbots_description.

Pour ce faire, vous devez entrer le dossier avec catkin_ws / src et exécuter la commande pour créer le package dans ROS:

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

* Si lors de l'exécution de la commande roscd; cd ..; cd src; Si vous n'entrez pas dans catkin_ws, alors vous avez peut-être plusieurs environnements de ce type. Pour activer le nécessaire, allez dans le dossier catkin_ws et exécutez la commande: source devel / setup.bash. Afin de ne pas vous perdre, si vous travaillez avec une image, vous pouvez accéder à ce dossier depuis la racine: cd ~; cd catkin_ws.

Si tout s'est bien passé, le dossier rosbots_description sera créé.

Pourquoi est-il si difficile et pas plus facile de simplement créer un dossier dans catkin_ws / src manuellement? Et quel genre de rospy est-ce?

Vous pouvez créer manuellement un dossier, mais vous devrez également écrire manuellement deux autres fichiers avec lesquels ROS fonctionne: CMakeLists.txt et package.xml.

Ils sont présents dans le dossier après création:



Leur ROS crée par eux-mêmes. Bien que nous ne nous attarderons pas sur leur contenu.
rospy à la fin de la commande signifie créer des dépendances, prendre en charge python.

Continuons.

Dans le package rosbots_description nouvellement créé, créez le dossier urdf et le fichier rosbots.xacro.

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

La beauté du système ROS est que dans quel dossier du système vous ne seriez pas situé, vous pouvez immédiatement accéder à la cible en tapant simplement son nom avec la commande roscd au début de la ligne.

Maintenant, mettez le code suivant dans le fichier nouvellement créé:

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> 


Si le code n'apparaît pas, tous les fichiers peuvent être téléchargés à la fin de la publication.

Pour le code ci-dessus, nous avons également besoin de cellules (meches), qui seront chargées lors du lancement du package.

Les mécènes peuvent être emportés ici
et placez le dossier meches décompressé dans rosbots_description.

Si vous regardez le code en détail, vous pouvez découvrir qu'il s'agit d'un fichier xml standard composé de blocs:
- visuel
- collision
- inertiel

Chaque bloc décrit sa part: visuel est l'apparence du robot, pas plus, collision et inertie est la physique du robot, comment tout va interagir avec le monde extérieur - collisions, inertie.
articulations - éléments qui aident à déterminer le mouvement entre les parties du robot (liens). Par exemple, le mouvement de la roue (roue) affecte le cadre dans son ensemble (chasis).

origine xyz est l'emplacement initial de l'objet le long des axes x, y, z.

le lien parent et le lien enfant sont respectivement les liens parent et enfant, qui découlent de quoi.
La présence de types est également remarquable: type = "continu", type = "fixe". Il s'agit d'une définition de ce qui peut et ne peut pas tourner. Les roues sont donc continues. Et, par exemple, batery_joint est fixe.
L'indentation dans le code est aussi profondément significative qu'en python, où vous ne pouvez pas interférer avec les tabulations et les espaces, ne les portez pas. Mais pour un paradis et une visibilité perfectionnistes, il vaut mieux les avoir.

Le code ci-dessus est essentiellement un modèle de robot.

Travailler chez RVIZ


Voyons ce qui s'est passé.

Pour ce faire, créez un fichier de démarrage qui exécutera le package ROS.

Pour cela, les fichiers dits de lancement sont utilisés dans ROS. L'essence du fichier de lancement est de permettre le lancement d'un nœud, d'une commande ou de plusieurs nœuds avec une seule commande courte sans qu'il soit nécessaire de spécifier tous les arguments et autres.

Créez un dossier de lancement dans la rosbots_description avec le fichier rviz.launch:

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

* Cette fois et les suivantes, il n'est plus nécessaire de créer un package ROS comme cela a été fait précédemment. Maintenant, le système lui-même "verra" les fichiers à l'intérieur du paquet. Par conséquent, nous créons simplement un répertoire.

Remplissez le fichier avec le contenu -
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> 


Ici, vous pouvez voir qu'au démarrage, le système recherchera une description du modèle dans rosbots.xacro.

Ensuite, il lancera 3 nœuds: joint_state_publisher à partir du package joint_state_publisher, robot_state_publisher à partir de robot_state_publisher, rviz à partir de rviz. type est le type de nœud, correspond généralement au fichier Python ou C du même nom, mais est spécifié sans extension.

Exécuter:

Dans le 1er terminal, exécutez le maître ROS:

 roscore 

Au 2ème:

 roslaunch rosbots_description rviz.launch 

* Si une erreur s'est produite
ROS_MASTER_URI [http: //192.168.1 ....: 11311] l'hôte n'est pas défini sur cette machine
, alors vous devez vérifier bashrc - sur quel ip ROS s'exécute:

 nano ~/.bashrc 

spécifiez l'ip de la machine virtuelle dans le fichier bashrc lui-même (par exemple, celui-ci):

 export ROS_MASTER_URI=http://192.168.1.114:11311 

relisez bashrc plus loin:

source ~/.bashrc ou redémarrez.
**
Si roslaunch ne démarre toujours pas, vous pouvez essayer d'aller dans le dossier catkin_ws et d'exécuter: source devel / setup.bash

Plonger à Rviz


Une fois la commande exécutée, l'éditeur Rviz démarre et le shell graphique s'ouvre.
La présentation visuelle peut varier, mais en général, la vue sera approximativement la suivante:



À gauche dans la colonne Affichages, vous pouvez observer les options d'affichage pour divers éléments interagissant avec les nœuds ROS, au centre - l'image du robot, à droite - une colonne avec une vue caméra du robot. Je dois dire tout de suite qu'il vaut mieux travailler avec une souris à 3 roues avec rviz, puisque tous les boutons de la souris sont impliqués ici. En maintenant la gauche, vous pouvez faire pivoter l'espace dans la fenêtre avec le robot affiché, en maintenant la droite - zoom avant / zoom arrière, en maintenant les deux touches - déplacer l'espace par rapport au robot.

La plupart du travail dans l'éditeur est effectué dans les deux premières colonnes: les affichages et la représentation visuelle du robot.

Travaillons avec l'apparence d'un robot


Sélectionnons "Fixed Frame" - "base link" dans la ligne:



Et ajoutez la description du robot aux écrans:

Cliquez sur "Ajouter" et sélectionnez "RobotModel" dans la liste:

"

Maintenant, dans la fenêtre de simulation, vous pouvez observer le robot qui a été reproduit à partir du modèle rviz.xacro:

"

Super. Avec une représentation visuelle, tout est clair. Vous devez maintenant comprendre comment exécuter la simulation, car rviz n'est qu'une visualisation de la simulation, mais pas la simulation elle-même.
Autrement dit, la physique ne fonctionne pas ici.

La simulation elle-même vit dans un éditeur appelé Gazebo.

Gazebo


Pour placer le modèle créé dans Gazebo, créez un autre fichier de lancement - spawn.launch dans le dossier de lancement du projet. Nous avons maintenant 2 fichiers de lancement!

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> 


Ici, nous lisons également le modèle, puis avec des arguments, nous passons son emplacement dans l'espace le long des axes x, y, z. Ensuite, exécutez un seul nœud - mybot_spawn à partir du package gazebo_ros.
* Il n'est pas nécessaire de réinstaller les packages mentionnés ci-dessus. Si vous le souhaitez, vous pouvez consulter ces packages avec la même commande: roscd. Par exemple roscd gazebo_ros.

Arrêtez maintenant le Ros-master dans le terminal 1:

 CTRL+C 

Et lancez l'éditeur Gazebo:

 roslaunch gazebo_ros empty_world.launch 

Dans le terminal 2, exécutez le fichier nouvellement créé:

 roslaunch rosbots_description spawn.launch 

Maintenant, nous voyons notre robot dans la simulation de l'éditeur Gazebo:



* Si vous avez une erreur: Waiting for service /gazebo/spawn_urdf_model
Cela signifie que vous avez lancé le modèle sans avoir d'abord démarré Gazebo, violant l'ordre de lancement.

Passons à la simulation de gazebo.


Ajoutez maintenant le code suivant à rosbots.xacro avant la balise de fermeture:

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> 


Le gazebo du simulateur ne peut pas être fermé lors de l'édition.

Maintenant, supprimez le modèle de l'éditeur Gazebo:

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

Ou redémarrez simplement l'éditeur.

* Gazebo est grincheux dans une machine virtuelle, donc même après la fermeture, il pardonne parfois CTRL + C en plus dans le terminal.

Replacez le modèle dans Gazebo après modification:

 roslaunch rosbots_description spawn.launch 

Si vous regardez maintenant la liste des sujets ROS, vous pouvez voir que parmi eux il y a

 /part2_cmr/cmd_vel 



Essayons maintenant de contrôler le robot dans la simulation en exécutant le contrôle dans un terminal séparé:

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

En étant dans la fenêtre avec le contrôle en marche et en appuyant sur les touches «i», «l», «j», «k», «,» dans la fenêtre du terminal, vous pouvez observer le mouvement du robot dans la simulation de l'éditeur Gazebo:



Code - téléchargement .

À suivre.

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


All Articles