En este artículo vamos a ver como cargar en Gazebo un archivo world. Para ello vamos a usar los archivos world que Gazebo incluye como ejemplos en su instalación, los cuales se encuentran en la siguiente ruta usr/share/gazebo-/worlds.
También podemos ver en este repositorio de GitHub la lista con todos los archivos world incluidos con Gazebo.
Los modelos de los objetos utilizados en estos ejemplos se encuentran almacenados en la siguiente ruta ~/.gazebo/models.
Desde la línea de comando de un terminal
Desde el terminal podemos cargar un archivo world de la siguiente forma:
gazebo <archivo_world>
Donde <archivo_world> es la ruta al archivo world, pudiendo ser:
- Relativa al directorio actual.
- Absoluta.
- Relativa a una ruta que se encuentre en la variable de entorno GAZEBO_RESOURCE_PATH.
- worlds/<archivo.world> siendo en este caso uno de los archivos world que Gazebo incluye.
Por ejemplo, el siguiente comando ejecutará Gazebo (tanto el servidor como el cliente) y cargará el archivo cafe.world.
gazebo worlds/cafe.world
Si solo queremos ejecutar el servidor pero no el cliente (interfaz gráfico), simplemente sustituimos gazebo por gzserver en la línea de comando.
Desde un archivo launch usando ROS2
Para lanzar Gazebo y cargar un archivo world desde ROS2 tendremos que realizar los siguientes pasos:
- Crear un paquete Python (o usar uno que ya tengamos).
- Añadir una carpeta launch y crear en su interior un archivo .launch.py
- Añadir una carpeta worlds donde ubicaremos el archivo world que queramos cargar.
- Añadir una carpeta models donde ubicaremos los archivos de los modelos que use el archivo world.
- Modificar el archivo setup.py del paquete para incorporar a data_files las rutas de los archivos que queremos que se copien en la instalación del paquete.
Si necesitas más información sobre como realizar estos pasos puedes ver los siguientes artículos:
Vamos a usar un paquete de ejemplo, al que he llamado gazebo_world_launch, que podemos descargar desde GitHub o clonarlo ejecutando el siguiente comando desde un teminal:
git clone https://github.com/joseecm-github/gazebo_world_launch
Como puede verse en la siguiente imagen el paquete ya incluye las carpetas launch, worlds y models. En la carpeta worlds hemos ubicado el archivo table.world y dentro de la carpeta models se encuentra la información de los modelos que usa: ground_plane, sun y table.
Si abrimos el archivo gazebo_world.launch.py podemos ve el código empleado para lanzar Gazebo y cargar el archivo table.world. En los comentarios añadidos se explica para que sirven las diferentes líneas.
import os
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch_ros.substitutions import FindPackageShare
def generate_launch_description():
# Obtenemos la ruta del paquete Gazebo ROS.
pkg_gazebo_ros = FindPackageShare(package='gazebo_ros').find('gazebo_ros')
# Obtenemos la ruta de instalación de nuestro paquete.
pkg_install_path = FindPackageShare(package='gazebo_world_launch').find('gazebo_world_launch')
# Obtenemos la ruta del archivo world, que está almacenado en la
# carpeta worlds del paquete.
world_file = 'table.world'
world_path = os.path.join(pkg_install_path, 'worlds', world_file)
# Obtenemos la ruta de la capeta models que es donde se encuentra
# la información del modelo que es empleado en nuestro archivo world
# y la guardamos en la variable de entorno GAZEBO_MODEL_PATH, que
# contiene las rutas donde busca Gazebo.
gazebo_models_path = os.path.join(pkg_install_path, 'models')
os.environ["GAZEBO_MODEL_PATH"] = gazebo_models_path
# Creamos una acción para ejecutar el archivo gzserver.launch.py,
# que se encuentra dentro de la carpeta launch del paquete
# Gazebo Ros. Lo que hace es arrancar el servidor de Gazebo
# cargando el archivo world que pasamos como argumento.
start_gazebo_server_cmd = IncludeLaunchDescription(
PythonLaunchDescriptionSource(os.path.join(pkg_gazebo_ros, 'launch', 'gzserver.launch.py')),
launch_arguments={'world': world_path}.items())
# Creamos una acción para ejecutar el archivo gzclient.launch.py,
# que se encuentra dentro de la carpeta launch del paquete
# Gazebo Ros. Lo que hace es arrancar el cliente de Gazebo, que
# es la interfaz gráfica.
start_gazebo_client_cmd = IncludeLaunchDescription(
PythonLaunchDescriptionSource(os.path.join(pkg_gazebo_ros, 'launch', 'gzclient.launch.py')),
)
# Devolvemos un objeto LaunchDescription con las acciones que queremos
# realizar.
return LaunchDescription([
start_gazebo_server_cmd,
start_gazebo_client_cmd
])
Antes de usar el paquete tenemos que compilarlo. Para ello ejecutamos colcon build desde el directorio raíz de nuestro espacio de trabajo.
colcon build --packages-select gazebo_world_launch
Y por último ejecutamos el archivo launch.
ros2 launch gazebo_world_launch gazebo_world.launch.py