Robótica

Clase 08

Semana 9 - 12/05/2025

URDF: Unified Robot Definition Format

  • Permite describir geometría y características del robot
  • Formato XML: La información se representa a través de etiquetas anidadas

Etiquetas principales: <robot>, <link>, <joint>

URDF: 2 Elementos fundamentales

  • Eslabones: <link>
  • Juntas: <joint>

 

Link

 

Joint

 

Etiqueta <robot>..<\robot>

  • Etiqueta raíz (todo el contenido se encuentra dentro)
  • 1 solo atributo: el nombre
<?xml version="1.0"?>

<robot name="mi_robot">
    ...
    <!-- Contenido -->
    ... 
</robot>

Etiqueta <joint>..</joint>

  • 2 atributos: el nombre y tipo

Por convención el nombre tiene sufijo ‘_joint

  • 2 elementos requeridos: link padre e hijo
<joint name="parteB_joint" type="tipo">
    <parent link="parteA_link"/>
    <child link="parteB_link"/>
    ...
</joint>

Tipos de juntas

  • Fija (fixed)

1 elemento: <origin .. />

<joint name="parteA_joint" type="fixed">
    <parent link="padre_link"/>
    <child link="parteA_link"/>
    <origin xyz="[pos_x] [pos_y] [pos_z]"
        rpy="[roll] [pitch] [yaw]"/>
</joint>

Tipos de juntas

  • Fija (fixed)
  • Continua (continuous)

2 elementos: <origin .. />

<axis ../>

<joint name="parteA_joint" type="revolute">
    <parent link="padre_link"/>
    <child link="parteA_link"/>
    <origin xyz="[pos_x] [pos_y] [pos_z]"
        rpy="[roll] [pitch] [yaw]"/>
    <axis xyz="[x] [y] [z]"/>
</joint>

Tipos de juntas

  • Fija (fixed)
  • Continua (continuous)
  • Revolución (revolute)

3 elementos: <origin .. />

<axis ../> y <limit ../>

<joint name="parteA_joint" type="revolute">
    <parent link="padre_link"/>
    <child link="parteA_link"/>
    <origin xyz="[pos_x] [pos_y] [pos_z]"
        rpy="[roll] [pitch] [yaw]"/>
    <axis xyz="[x] [y] [z]"/>
    <limit lower="[min_rad]" upper="[max_rad]"
        velocity="[rad_por_seg]"
        effort="[effort]" />
</joint>

Tipos de juntas

  • Fija (fixed)
  • Continua (continuous)
  • Revolución (revolute)
  • Prismática (prismatic)

XACRO: Macros en XML

  • Facilita la codificación de URDF
  • Herramienta para dividir código y evitar duplicar
  • Provee estructuras de ‘programacion

Agregar al tag robot

<robot name="mi_robot" xmlns:xacro="http://www.ros.org/wiki/xacro" >
    ...
    <!-- Contenido -->
    ... 
</robot>

XACRO: Macros en XML

Se necesita un paso de compilación:

  $ xacro description.urdf.xacro

Actualizar dependencias: <exec_depend>xacro</exec_depend>

Partición de los componentes

Ejemplos:

  • La geometría principal (links y joints)
  • Materiales
  • Sensores
  • Simulador (y parámetros de simulación)
  • Macros
📂 paquete_description
    📁 paquete_description
    📂 launch
        📄 description.launch.py
        ...
    📂 urdf
        📄 description.urdf.xacro
        📄 materials.xacro
        📄 my_macro.xacro
        📄 sim_sensor.xacro
        ...
    📄 package.xml
    📄 setup.py
    ...

Inclusión de archivos

  • Archivo principal:
    • se lo nombre con extensión ‘.urdf.xacro
    • contiene el tag robot con nombre
  • Archivos incluidos:
    • extensión ‘.xacro
    • solo contienen el tag robot (sin nombre)

Se incluyen las partes mediante el tag <xacro:include .. />

Ejemplo xacro:include

materials.xacro
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" >
    <material name="Orange">
        <color rgba="1 0.3 0.1 1"/>
    </material>
</robot>


description.urdf.xacro
<?xml version="1.0"?>
<robot name="MyBot" ...>
    <xacro:include filename="materials.xacro" />
    ...
    <link name="base_link">
        <visual>
            ...
            <geometry> ... </geometry>
            <material name="Orange">
        </visual>
    </link>
    ...
</robot>

Parametrización de atributos

  • Operaciones matemáticas: ${..}
  • Propiedades xacro:property: Nombre y valor
<?xml version="1.0"?>
<robot name="MyBot" ...>
    <xacro:property name="diametro" value="2.1" />
    <xacro:property name="ancho" value="4.5" />
    <xacro:property name="alpha" value="${30/180*pi}" />
    ...
        <geometry type="cylinder"
            radius="${diametro / 2}" length="${ancho}" />
        ...
        <origin xyz="0 0 0" rpy="0 0 ${alpha}" />
    ...
</robot>

Comandos de rospack

  • Argumentos xacro:args: Nombre y valor por defecto
    <xacro:arg name="arg1" default="false"/>
  • Buscar paquetes $(find ..):
    <xacro:include filename="$(find <nombre_paquete>)/<nombre_archivo>.xacro" />

Bloques condicionales

  • Etiqueta xacro:if para true y xacro:unless para false
<xacro:if value="[expresion]">
    <!-- Si la expresión es verdadera: 'true' o 1 -->
</xacro:if>
<xacro:unless value="[expresion]">
    <!-- Si la expresión es falsa: 'false' o 0  -->
</xacro:unless>

Macros

  • Porciones de código a reutilizar (plantillas)
  • xacro:macro: Nombre y parámetros a recibir
macro.xacro
<xacro:macro name="rueda_esferica"
    params="prefijo link_padre radio 
            pos_x:=0 pos_y:=0 pos_z:=0">
    <xacro:property name="nombre_link"
        value="${prefijo}_link" />
    <link name="${nombre_link}">
        <visual>
            <geometry>
                <sphere radius="${radio}" />
            </geometry>
            <material name="black" />
        </visual>
        ...
    </link>
    <joint name="${prefijo}_joint" type="fixed">
        <parent link="${link_padre}$"/>
        <child link="${nombre_link}"/>
        <origin xyz="${pos_x} ${pos_y} ${pos_z}"
            rpy="0 0 0"/>
    </joint>
</xacro:macro>
<xacro:rueda_esferica prefix="rueda_delantera"
    link_padre="base_link" radio="1.0" pos_x="0.5" /> 

Resultado:

    <link name="rueda_delantera_link">
        <visual>
            <geometry>
                <sphere radius="1.0" />
            </geometry>
            <material name="black" />
        </visual>
        ...
    </link>
    <joint name="rueda_delantera_joint" type="fixed">
        <parent link="base_link"/>
        <child link="rueda_delantera_link"/>
        <origin xyz="0.5 0 0" rpy="0 0 0"/>
    </joint>

Similitudes entre

URDF

tf2

arbol de .. arbol de ..

frames

conectados por .. conectados por ..

joints

transforms

Tip

Interpretando los links y joints del robot description puedo publicar los frames y tf correspondientes

Paquete robot_state_publisher

  1. Descripción del robot ➡️ /robot_description
  2. Juntas fijas (transformaciones estáticas) ➡️ /tf_static
  3. Juntas móviles ➡️ /joint_states ➡️ transformaciones dinámicas ➡️ /tf

Topic /joint_states

  • Listado de juntas con sus respectivos estados:
        sensor_msgs/JointState
        ├── std_msgs/Header header
        ├── string[] name
        ├── float64[] position
        ├── float64[] velocity
        └── float64[] effort

Quién publica en el /joint_states?

Sistema completo

URDF + XACRO + robot_state_publisher + joint_state_publisher_gui

Comandos de cada paquete

  • robot_state_publisher
    $ ros2 run robot_state_publisher robot_state_publisher
                --ros-args -p robot_description:='<robot_description>'
  • joint_state_publisher_gui
    $ ros2 run joint_state_publisher_gui joint_state_publisher_gui

Taller de resolución

Ejercicios 1 y 2