Clase 09 - Taller de resolución
Gazebo
Instalación de Gazebo
1️⃣ Actualizar el sistema
Actualizar repositorios apt y asegurar que los paquetes se encuentren actualizados
$ sudo apt update && sudo apt upgrade -y
2️⃣ Instalar Gazebo Harmonic
Instalar la versión de Gazebo por defecto para ROS Jazzy
$ sudo apt install ros-jazzy-ros-gz
Traducido de gazebosim.org
Recuerda actualizar las dependencias. Gazebo: ros_gz
y ROS2 control: gz_ros2_control
Ejecutar Gazebo
Desde la linea de comando
$ ros2 launch ros_gz_sim gz_sim.launch.py gz_args:=empty.sdf
Desde archivo launch
IncludeLaunchDescription(
PythonLaunchDescriptionSource(
PathJoinSubstitution(['ros_gz_sim'), 'launch', 'gz_sim.launch.py'
FindPackageShare(
]),
),={
launch_arguments'gz_args': '-r empty.sdf',
'on_exit_shutdown': 'True'
}.items(), ),
Macros de inercia: inertial_macros.xacro
Geometría de prisma
xacro:inertial_box mass="[masa_kg]" x="[largo]" y="[ancho]" z="[alto]">
<origin xyz="[traslacion]" rpy="[rotacion]"/>
<xacro:inertial_box> </
Geometría de cilindro
xacro:inertial_cylinder mass="[masa_kg]" radius="[radio]" length="[ancho]">
<origin xyz="[traslacion]" rpy="[rotacion]"/>
<xacro:inertial_cylinder> </
Geometría de esfera
xacro:inertial_sphere mass="[masa_kg]" radius="[radio]">
<origin xyz="[traslacion]" rpy="[rotacion]"/>
<xacro:inertial_sphere> </
Geometría e inercia despreciable
dummy_inertial /> <
Cargar robot en Gazebo
Recuerda que el URDF debe estar disponible en el topic \robot_description
y cumplir con todos los requerimientos de Gazebo:
- Geometrías de colisión e inercias definidas
- Todos los links y joints nombrados
- Colores y materiales (opcional)
Desde la linea de comando
$ ros2 run ros_gz_sim create -topic robot_description
-entity <nombre_robot>
Desde archivo launch
Node(="ros_gz_sim",
package="create",
executable=[
arguments"-entity", "<nombre_robot>",
"-topic", "robot_description",
],="screen",
output ),
ros2_control
Definición de hardware simulado y las interfaces
Definir un hardware simulado con <hardware>
ros2_control name="GazeboSystem" type="system">
<hardware>
<plugin>gz_ros2_control/GazeboSimSystem</plugin>
<hardware>
</
...ros2_control> </
Para cada junta <joint>
definir las interfaces
ros2_control name="GazeboSystem" type="system">
<hardware>
<plugin>gz_ros2_control/GazeboSimSystem</plugin>
<hardware>
</joint name="[nombre_junta]">
<<!-- Interfaces -->
joint>
</ros2_control> </
- Interfaces de estado con
<state_interface .. />
ros2_control name="GazeboSystem" type="system">
<
...joint name="[nombre_junta]">
<<!-- Interfaz de estado de posición -->
state_interface name="position" />
<<!-- Interfaz de estado de velocidad -->
state_interface name="velocity" />
<<!-- Interfaz de estado de esfuerzo -->
state_interface name="effort" />
<joint>
</
...ros2_control> </
- Interfaces de comando
<command_interface .. />
ros2_control name="GazeboSystem" type="system">
<
...joint name="[nombre_junta]">
<<!-- Interfaz de estado de posición -->
command_interface name="position" />
<<!-- Interfaz de estado de velocidad -->
command_interface name="velocity" />
<<!-- Interfaz de estado de esfuerzo -->
command_interface name="effort" />
<joint>
</
...ros2_control> </
Adicionalmente las interfaces pueden recibir parámetros:
<param name="initial_value">{valor inicial}</param>
<param name="min">{limite_minimo}</param>
<param name="max">{limite_maximo}</param>
Definir controladores para ros2_control
- Tipos de controladores:
- Publicar estado de las juntas:
joint_state_broadcaster/JointStateBroadcaster
- Controladr la velocidad de la junta:
velocity_controllers/JointGroupVelocityController
- Publicar estado de las juntas:
- Mediante un archivo de configuración YAML
controller_manager:
ros__parameters:
update_rate: 30
use_sim_time: true
{nombre_controlador}:
type: {tipo_controlador}
...
Configuraciones velocity_controllers/JointGroupVelocityController
{nombre_controlador}:
ros__parameters:
joints:
- {nombre_junta}
command_interfaces:
# Según corresponda (las 3 o alguna)
- {velocity}
- {position}
- {effort}
state_interfaces:
# Según corresponda (las 3 o alguna)
- {velocity}
- {position}
- {effort}
Cargar el plugin de gz_ros2_control
- Cargar el plugin con un archivo de configuración adicional
gazebo>
<plugin filename="gz_ros2_control-system"
< name="gz_ros2_control::GazeboSimROS2ControlPlugin">
parameters>
<
$(find [nombre_paquete])/config/[nombre_archivo].yamlparameters>
</plugin>
</gazebo> </
Cargar controladores
Desde la linea de comando
$ ros2 control load_controller --set-state active
<nombre_controlador> <archivo_parametros>
Desde archivo launch
ExecuteProcess(=['ros2', 'control', 'load_controller',
cmd'--set-state', 'active',
'<nombre_controlador>'],
='screen'
output )
Resolución ejercicios 3 y 4
Editar el o los archivos XACRO del ejercicio 1, de manera que sea/n compatible/s con los requerimientos de Gazebo, haciendo uso de los macros disponibles en el archivo inertial_macros.xacro
.
Crear un paquete (*)_gz
y un archivo launch nuevo, que ejecute Gazebo, procese la descripción del robot y, utilizando el ejecutable spawn_entity.py
, cargue el robot en el simulador. Puede reutilizar el archivo creado en el ejercicio 2 incluyéndolo (no debe ejecutar el joint_state_publisher_gui
ni RViz
).
Editar el archivo de definición del robot y agregar los elementos necesarios para configurar ROS2 control y Gazebo de forma tal que las juntas correspondientes a las ruedas de tracción reciban comandos de velocidad y devuelvan el estado de posición y velocidad. Para esto deberá añadir los tags <ros2_control>
y <gazebo>
.
Crear un paquete (*)_control
, con una carpeta config
y un archivo de configuración en formato YAML con los parámetros necesarios para que el controller_manager
de ROS2 control cargue un JointStateBroadcaster
y dos controladores de velocidad de tipo JointGroupVelocityController
, uno para cada rueda de tracción.
Editar el archivo launch del ejercicio 3 para invocar al comando load_controller
de ros2_control
y cargar los controladores del inciso anterior.