Carro para camiones ROS. Parte 5. Trabajando en rviz y gazebo: xacro, nuevos sensores

Publicaciones en la serie:
8. Controlamos desde el control del teléfono ROS, nodo GPS
7. Localización de robots: gmapping, AMCL, puntos de referencia en el mapa de la sala
6. Odometría con codificadores de rueda, mapa de habitación, lidar
5. Trabajamos en rviz y gazebo: xacro, nuevos sensores.
4. Cree una simulación de robot utilizando los editores rviz y gazebo.
3. Acelera, cambia la cámara, arregla la marcha
2. Software
1. hierro

La última vez, se lograron los siguientes objetivos:

  • visualice el robot creando un archivo xacro que contenga la descripción urdf del robot;
  • cree dos archivos de inicio, uno de los cuales le permite colocar el robot en el editor-simulador Gazebo;
  • controla el robot en el simulador Gazebo desde el teclado.

En esta publicación, organizaremos el proyecto en forma de módulos xacro para que sea más legible (antes, para mayor claridad, incluimos la descripción completa en un archivo xacro). Agregue una cámara de video virtual e imu. Veamos cómo agregar una glorieta a objetos extraños en el mundo que nos rodea.

Primero, verifique si el terminal está navegando a través del sistema ROS utilizando los comandos roscd:

roscd rosbots_description/launch 

Si no funciona, vaya a la carpeta con catkin_ws y ejecute el comando:

 source devel/setup.bash 

Ahora vamos a la carpeta con la descripción del robot:

 roscd rosbots_description/launch 

En el archivo spawn.launch creado anteriormente, se indicó lo siguiente:

 <param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" /> 

El comando cat se usó para cargar el contenido de rosbots.xacro en el parámetro robot_description.

Para aprovechar al máximo el formato del comando xacro, el código debe modificarse ligeramente. Reemplace la línea anterior con lo siguiente:

 <param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'" /> 

Ahora el sistema usará xacro.py para ejecutar rosbots.xacro.

Se requerirán los mismos cambios para el segundo archivo de inicio: rviz.launch.

Cambio

 <param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" /> 

en

 <param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'"/> 

Verifique que todo funcione con la nueva sintaxis.

Primero, mire el modelo en el editor rviz:

 roslaunch rosbots_description rviz.launch 

Luego, cerrando rviz, verifique en la glorieta.

1er terminal:

 roslaunch gazebo_ros empty_world.launch 

2do:

 roslaunch rosbots_description spawn.launch 

* Puedes ver los mensajes
color amarillo


 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 


No dan el clima, por lo que no puedes prestar atención.

Entonces, todo funciona como antes, solo que ahora se usa el formato xacro.
¿Qué da él? Este formato le permite reorganizar el código. A medida que el proyecto crezca, esto ayudará a navegar mejor en el futuro.

Trabajando con xacro


Ahora es el momento de dividir rosbots.xacro en sus partes constituyentes y aprovechar xacro.

Mueva todo sobre el editor de gazebo (etiquetas de gazebo) de rosbots.xacro a un nuevo archivo.
Cree el archivo rosbots.gazebo.xacro en la carpeta urdf:

 nano rosbots.gazebo.xacro 

Y pon el código allí:

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> 


El mismo código dentro de la etiqueta
 <gazebo> </gazebo> 
eliminar del archivo rosbots.xacro.

Ahora adjuntaremos el archivo recién creado a rosbots.xacro. ¡Desde algún lugar, se debe recibir la misma información sobre el componente de gazebo de rosbots.xacro!

En consecuencia, agregue a rosbots.xacro:

 <xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" /> 

Inserte esta línea después de la línea con la etiqueta
 <robot> 
. Ahora el comienzo del archivo se ve así:

 <robot name="rosbots" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" /> 

Verifique nuevamente que todo funcione en el nuevo formato:

1er terminal:

 roslaunch gazebo_ros empty_world.launch 

2do:

 roslaunch rosbots_description spawn.launch 

Por lo tanto, para el usuario, todo permanece en su lugar en términos de lanzamiento del modelo en la simulación, los comandos son los mismos.

Agregar nuevos sensores


Ahora que el proyecto ha tomado un aspecto más o menos estructurado, conectaremos sensores adicionales.

Para no abarrotar al robot con “kits de cuerpo”, agregamos solo dos sensores: una cámara y un imu (módulo de medición de inercia o giroscopio).

Para estos fines, deberá reparar los archivos rosbots.xacro y rosbots.gazebo.xacro.

Comencemos con la cámara y el archivo rosbots.xacro. Para que todo funcione, para el sensor debe agregar:

  • comunicación (enlace). Será representado por un archivo dae.
  • articulación, que unirá la cámara al cuerpo del robot.

En otro archivo, rosbots.gazebo.xacro, agregaremos:

  • un complemento que detectará el enlace creado anteriormente como un sensor.

Lo colocamos en rosbots.xacro dentro de la etiqueta (para mayor comodidad, puede agregarlo al final):

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> 


El código anterior agrega un enlace y una unión a nuestra cámara, lo que permite que se visualice.

Mira esto.

1er terminal:

 roslaunch gazebo_ros empty_world.launch 

2do:

 roslaunch rosbots_description spawn.launch 

Si todo está correcto, puede ver la cámara agregada en el robot (blanco):



Parece que todo es simple. Sin embargo, debe entenderse que solo se ha agregado la visualización de la cámara. Todavía no está claro cómo se comportará esta cámara en el mundo de las cosas físicas. Su comportamiento es indefinido. La cámara aún no puede tomar fotos ni grabar videos.

Es el turno de trabajar en el archivo con gazebo.

Añadir a

rosbots.gazebo.xacro
etiquetas interiores

 <robot> </robot> 

agregar:

 <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> 


Como es fácil de adivinar en el código, determinamos los parámetros de la cámara:

  • update_rate: con qué frecuencia llegarán los datos
  • ancho / alto: resolución de imágenes. En este caso, 320x240.
  • formato: formato de video (R8G8B8).
  • imageTopicName: el nombre del tema donde se enviarán los datos
  • frameName: enlace-enlace al que se adjuntará la cámara.

Ahora todo está listo tanto para visualizar la cámara como para su simulación.

Si ahora reinicia la simulación y ve la lista de temas, puede ver que entre ellos se han agregado los temas generados por la cámara:

 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 

¡Hay todo un arsenal de temas! Pero, por regla general, no todos se usan con tanta frecuencia, excepto los primeros tres.

Imagen en rviz del simulador de gazebo


* aquí debe tenerse en cuenta que en la configuración actual de la imagen para VMWare Workstation, el gazebo se bloquea cuando intenta comenzar a transmitir a rviz desde una cámara de video virtual. Una posible solución se indica al final de la publicación en la sección de error.

Para mayor claridad, cuando trabaje con la cámara en la simulación, ejecute rviz y coloque algún objeto frente al robot.

Para hacer esto, primero necesita el objeto en sí, que se agregará a la glorieta.

Descargue el archivo object.urdf y póngalo en ~ / catkin_ws / src /

Vamos a ejecutarlo.

1er terminal:

 roslaunch gazebo_ros empty_world.launch 

2do (colocar los modelos):

 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 

En la simulación obtenemos la siguiente imagen:



Un modelo de robot y una publicación que también se agregó como modelo.

Los elementos se pueden agregar al editor de gazebo de una manera más simple desde la pestaña dentro del editor de inserción:



Ahora veamos qué ve el robot.

Sin cerrar los dos terminales anteriores, ejecute rviz con la descripción del robot:

 roslaunch rosbots_description rviz.launch 

Y agregue una nueva pantalla llamada "Imagen":



Aparecerá una nueva pantalla con una imagen de cámara y ... el editor de gazebo saldrá volando.

Desafortunadamente, cuando se trabaja en una máquina virtual con una imagen VMWare, al agregar una transmisión desde una cámara virtual se produce un error.

Si el trabajo se lleva a cabo no en una máquina virtual, sino en una real, obtendremos una imagen de una cámara virtual en un mirador con una imagen de una figura de columna:



Ahora agreguemos IMU al modelo.

IMU (giroscopio)


El proceso de agregar imu es similar a agregar una cámara.

Primero, abre rosbots.gazebo.xacro y crea

codigo
 <gazebo> <plugin name="gazebo_ros_imu_controller" filename="libgazebo_ros_imu.so"> <!-- <robotNamespace></robotNamespace> --> <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> 


Agregaremos este código, así como el código de la cámara agregada, dentro de la etiqueta

  <robot></robot> 

Como no es difícil adivinar el código, publicará los datos en el tema / imu / data.

Ahora, si vuelve a colocar el modelo de robot en la glorieta y ejecuta el comando: rostopic list en la terminal vecina, puede ver el tema con datos de imu, entre otros:



También puedes echar un vistazo a lo que publica ejecutando el comando:

 rostopic echo /imu/data -n1 



En resumen, imu publica la siguiente información:

  • orientación: la orientación del robot a lo largo de los ejes x, y, z y w.
  • angular_velocity: velocidad angular del robot.
  • linear_acceleration: aceleración lineal.

Hubo un pequeño toque

.
Agregue a rosbots.gazebo.xacro todo también está dentro de la etiqueta

codigo
 <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> 


Este código determinará parámetros adicionales del robot: coeficientes de fricción para las ruedas, colores en la glorieta, sensor de contacto. El sensor de contacto se activará inmediatamente después de que el parachoques del robot toque el obstáculo.

Ahora reinicie el gazebo, coloque el modelo y en rviz agregue la pantalla imu como antes, agregue la pantalla con una cámara:



Si todo salió bien, veremos que imu está publicando en el tema.

En conclusión, controlaremos el robot en la simulación y veremos cómo cambian los datos con imu:

1er terminal:

 roslaunch gazebo_ros empty_world.launch 

2do:

 roslaunch rosbots_description spawn.launch 

 roslaunch rosbots_description rviz.launch 

3er:

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


Posibles errores durante la operación :

1. El modelo de robot no aparece en el gazebo (el paquete [rosbots_description] no tiene una ruta): cierre el gazebo, ejecute el desarrollo de origen / setup.bash en la terminal, reinicie el 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) 

Posible solución (no probada):

 https://bitbucket.org/osrf/gazebo/issues/1837/vmware-rendering-z-ordering-appears-random 

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


All Articles