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


Note

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([
                FindPackageShare('ros_gz_sim'), 'launch', 'gz_sim.launch.py'
            ]),
        ),
        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

Warning

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(
        package="ros_gz_sim",
        executable="create",
        arguments=[
            "-entity", "<nombre_robot>",
            "-topic", "robot_description",
        ],
        output="screen",
    ),

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

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
  • 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].yaml
        </parameters>
    </plugin>
</gazebo>

Cargar controladores

Desde la linea de comando

    $ ros2 control load_controller --set-state active
        <nombre_controlador> <archivo_parametros>

Desde archivo launch

    ExecuteProcess(
        cmd=['ros2', 'control', 'load_controller',
             '--set-state', 'active',
             '<nombre_controlador>'],
        output='screen'
    )

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.