Este tutorial tiene como propósito dar una introduccion al uso de las herramientas de ROS en conjunto a una simulacion corriendo en Ignition. Al final de este tutorial, tendrá un resultado similar al que se muestra en este video.
Para este tutorial usaremos Ignition Dome y ROS Melodic; no obstante,
tenga en cuenta que este tutorial es valido para releases de Ignition compatibles con ros_ign_bridge
y releases de ROS compatibles con teleop_twist_keyboard
y ros_ign
.
Primero completaremos los pasos del tutorial y posteriormente explicaremos que sucede detrás de escenas.
-
Instalar Ignition Dome
- Enlace a las instrucciones: Dome Installation
-
Instalar ROS Melodic
- Enlace a las instrucciones: ROS Melodic Installation
-
Instalar
ros_ign
. Usaremos ROS Melodic# Agregar https://packages.osrfoundation.org sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list' wget https://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add - sudo apt-get update # Instalar `ros_ign` sudo apt install ros-melodic-ros-ign
-
Instalar
teleop_twist_keyboard
sudo apt-get install ros-melodic-teleop-twist-keyboard
mkdir -p ~/ign_teleop_tutorial_ws/src
git clone [email protected]:Blast545/ign_tutorials.git ~/ign_teleop_tutorial_ws/src
cd ~/ign_teleop_tutorial_ws
catkin_make
Abriremos dos terminales que compartan el mismo entorno. En cada una, correremos los siguientes comandos:
# Shell 1
source ~/ign_teleop_tutorial_ws/devel/setup.bash
roslaunch roslaunch ign_tutorials diff_drive_demo.launch
# Shell 2
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
Después de estos pasos, queda un entorno similar al siguiente:
Por ultimo, usando la terminal con el nodo teleop_twist_keyboard se pueden enviar comandos para mover el robot:
Para este tutorial hemos usado el mundo de ejemplo tunnel.sdf
, este incluye un vehículo tipo "diff-drive" y contiene varias funcionalidades
disponibles del simulador Ignition. El sistema de comandos para el plugin diff drive funciona de esta manera:
- El nodo
teleop_twist_keyboard
toma las teclas presionadas por el usuario y las convierte en comandos ROS Twist. ros_ign_bridge
se subscribe a esos comandos ROS Twist y los convierte en mensajes Ignition Transport.- Los mensajes Ignition Transport son usados por el plugin diff drive ejecutado como parte de la simulacion del
tunnel.sdf
. - El simulador mueve al robot apropiadamente, de acuerdo a los mensajes recibidos desde el plugin diff drive.
Podemos observar la parte del codigo del launchfile que usa el ros_ign_bridge:
<node
pkg="ros_ign_bridge"
type="parameter_bridge"
name="$(anon ros_ign_bridge)"
output="screen"
args="/model/vehicle/odometry@nav_msgs/[email protected] /cmd_vel@geometry_msgs/[email protected] ">
</node>
Los mensajes van y vienen a través del tópico /cmd_vel
, este tópico es usado tanto en la capa de Ignition Transport como del lado de ROS.
De entrada, toma mensajes geometry_msgs/Twist
y de salida usa mensajes de tipo ignition.msgs.Twist
.
Lo mismo aplica para la configuración de odometría mostrada en rviz
.
Por último, mirando el código del archivo SDF ign_ws/src/ign-gazebo/examples/worlds/tunnel.sdf
vemos que:
<plugin
filename="ignition-gazebo-diff-drive-system"
name="ignition::gazebo::systems::DiffDrive">
<left_joint>left_rear_wheel</left_joint>
<left_joint>left_front_wheel</left_joint>
<right_joint>right_rear_wheel</right_joint>
<right_joint>right_front_wheel</right_joint>
<wheel_separation>1.25</wheel_separation>
<wheel_radius>0.3</wheel_radius>
<odom_publish_frequency>1</odom_publish_frequency>
<topic>cmd_vel</topic>
</plugin>
Así queda configurado el plugin diff drive para recibir comandos desde el tópico cmd_vel
y controlar las
cuatro articulaciones: left_rear_wheel
, left_front_wheel
, right_rear_wheel
y right_front_wheel
que controlan el movimiento del robot.
Como ejercicio, ¿Puede tomar alguna de las siguientes tareas?
- Enviar mensajes al robot directamente usando Ignition Transport.
- Puede chequear este tutorial de ignition: Moving the robot.
- Revise la estructura del model sdf
tunnel.sdf
.
- ¿Puede cambiar el launchfile para usar otro motor de física? como TPE.
- Revise el tutorial de
ign-physics
: Switching physics engines.
- Revise el tutorial de
- El mundo de ejemplo
diff_drive.sdf
(ign_ws/src/ign-gazebo/examples/worlds/diff_drive.sdf
) no usa el mismo tópicocmd_vel
para recibir comandos de velocidad, ¿Puede modificar el tutorial para usar este mundo de ejemplo y enviar comandos a alguno de esos robots?- Puede revisar
diff_drive.sdf
example commands y ajustar losros_ign
bridges apropiadamente.
- Puede revisar
¿Quiere saber mas de Ignition Gazebo? Revise los siguientes enlaces:
- Portal principal del simulador Ignition portal.
- Revise los tutoriales oficiales tutorials for Ignition Dome.
- Discussiones y anuncios en Gazebo/Ignition community forum.