Todo lo que necesitas saber de los archivos URDF

¿Qué son y para qué sirven?

El formato URDF (Unified Robot Description Format) es una especificación XML que permite describir cómo es un robot, de modo que mediante elementos XML se pueden definir las siguientes características del mismo:

 

      • El aspecto visual.
      • Su cinemática y dinámica.
      • El modelo de colisión.
Una vez que tenemos el modelo URDF de nuestro robot podremos usarlo para realizar simulaciones, por ejemplo con GAZEBO o RVIZ2.

Descomponiendo nuestro robot en enlaces (links) y articulaciones (joints)

Cada una de las partes (sólidos rígidos) que componen el robot se denomina eslabón o link. La forma en que se unen dos links entre sí constituye una articulación o joint.

En función del tipo de movimiento que permita la unión entre dos partes se tienen diferentes tipos de articulaciones. Las permitidas por la especificación URDF son las siguientes:

 

      • revolute: permite el giro sobre un eje y tiene un rango limitado especificado por los límites superior e inferior.
      • continuous: permite el giro alrededor de un eje y no tiene límites superior e inferior.
      • prismatic: permite el deslizamiento a lo largo de un eje y tiene un rango limitado especificado por los límites superior e inferior.
      • fixed: no permite ningún tipo de movimiento por lo que realmente no es una articulación, pero es útil cuando interesa asociar al enlace un sistema de referencia en un punto concreto, por ejemplo para el caso de sensores o cámaras.
      • floating: permite el movimiento en los 6 grados de libertad.
      • planar: permite el movimiento en un plano perpendicular al eje.

Dados dos eslabones unidos por una articulación, el más cercano a la raiz de la estructura (es decir a la base o al chásis del robot) recibe el nombre de padre y el otro se denomina hijo.

La siguiente foto corresponde al robot manipulador modelo IRB120 del fabricante ABB. Como puede observarse en este caso nuestro robot estaría compuesto por 6 eslabones (links),  unidos mediante 6 articulaciones (joints) de giro.

Definiendo la cadena cinemática

Dado que un robot puede considerarse como una cadena cinemática compuesta por objetos rígidos o eslabones (links) unidos entre sí mediante articulaciones (joints)  la posición espacial de cada una de sus partes se puede describir respecto de un sistema de referencia fijo situado en la base del mismo. 

Para ello en cada eslabón es necesario establecer  un sistema de referencia L que ubicaremos en la articulación que lo une al eslabón padre, de modo que uno de sus ejes coincida, en función del tipo de articulación, con el eje de giro (revolute, continuous) o con la dirección de desplazamiento (prismatic).

Una vez definidos todos los sistemas de referencia se puede resolver el problema de la cinemática directa para obtener la posición y orientación en el espacio del extremo del robot en función de los valores de las variables (ángulos y desplazamientos) asociadas a cada uno de los grados de libertad de las articulaciones.

En la siguiente figura se muestran dos enlaces unidos por una articulación de giro donde se han representados los sistemas de referencia propios de cada uno (en naranja) y el sistema de referencia asociado al enlace hijo ubicado en la articulación con origen en O2.

Contenido de un archivo URDF

En este apartado vamos a ver como es la estructura básica de un archivo URDF, así como los diferentes elementos y atributos que nos permiten definir el modelo de un robot. 

 

Estructura básica

Dado que un archivo URDF contiene código XML, lo primero que debe aparecer es el encabezado que define este tipo de archivos y a continuación el elemento <robot> el cual encapsula al resto de elementos, que fundamentalmente serán cada una de las partes del robots (links) y las articulaciones que las unen (joints). Es obligatorio que el elemento <robot> contenga el atributo name, al que asignaremos el nombre que queramos darle a nuestro robot.

 

<?xml version="1.0"?>

</robot>
<robot name="mi_robot">
  <link> ... </link>
  <link> ... </link>
  <link> ... </link>

  <joint>  ....  </joint>
  <joint>  ....  </joint>
  <joint>  ....  </joint>
</robot>

Estructura básica de un archivo URDF

Definiendo cada uno de los enlaces. El elemento <link>

A continuación se muestra un ejemplo de código simple de definición de un enlace con forma de cilindro.
 <link name="my_link">
   <inertial>
     <origin xyz="0 0 0.5" rpy="0 0 0"/>
     <mass value="1"/>
     <inertia ixx="100"  ixy="0"  ixz="0" iyy="100" iyz="0" izz="100" />
   </inertial>

   <visual>
     <origin xyz="0 0 0" rpy="0 0 0" />
     <geometry>
       <cylinder radius="1" length="0.5"/>
     </geometry>
     <material name="Cyan">
       <color rgba="0 1.0 1.0 1.0"/>
     </material>
   </visual>

   <collision>
     <origin xyz="0 0 0" rpy="0 0 0"/>
     <geometry>
       <cylinder radius="1" length="0.5"/>
     </geometry>
   </collision>
 </link>

Ejemplo de código de definición de un enlace (link)

El elemento link permite definir como es cada uno de los enlaces de nuestro robot, estableciendo tanto su apariencia visual como sus propiedades físicas. Para ello admite a su vez los siguientes elementos, todos ellos opcionales:

Asignando las propiedades físicas. El elemento <inertial>

Permite indicar la masa del enlace y sus momentos de inercia, que se calculan en referencia a un sistema de referencia C ubicado en el centro de gravedad.

Estableciendo la representación visual. El elemento <visual>

Proporciona la información relativa a la representación visual del enlace, es decir, su posición, orientación, forma y aspecto. 

Para establecer la posición y orientación es necesario indicar la pose del sistema de referencia V, que para las figuras básicas (cilindros, cajas y esferas) que admite la especificación URDF se encuentra en el centro geométrico de las mismas, y para formas más complejas (mallas) se establece durante su diseño cuando se emplea un software de modelado como Fusion360 o Solidworks. 

Pueden existir varias instancias de visual para un mismo enlace, en cuyo caso la unión de la geometría que definen constituirá su representación visual.

Definiendo el modelo de colisión. El elemento <collision>

Define cómo es la forma que se tendrá en cuenta para calcular las posibles colisiones del enlace con otros objetos.

No tiene por qué coincidir con la geometría que define el aspecto visual del enlace, ya que a menudo se utilizan modelos de colisión más simples para reducir el tiempo de cálculo.

Pueden existir varias instancias de collision para un mismo enlace, en cuyo caso la unión de la geometría que definen constituirá la representación de colisión del enlace.

Resumen de elementos y atributos admitidos

En el siguiente cuadro se resumen todos los elementos y atributos que podemos usar para definir los enlaces de nuestro robot.

ELEMENTOS Y ATRIBUTOS ADMITIDOS POR <LINK>

<inertial> (opcional: por defecto masa e inercia cero)

<origin> (opcional)

Indica la posición y la orientación del sistema de referencia C ubicado en del centro de gravedad del enlace, en relación al sistema de referencia L ubicado en la articulación con el enlace padre. 

xyz (opcional: por defecto es vector cero)

Representa el vector de posición del origen Co del sistema de referencia C en metros.

rpy (opcional: el valor predeterminado es identidad si no se especifica)

Representa la orientación de los vectores unitarios Cx, Cy, Cz del sistema de referencia C respecto del sistema de referencia L ubicado en la articulación, como una secuencia de rotaciones de Euler (rpy) en radianes. 

<mass> (requerido)

Establece la masa del enlace.

value

Valor de la masa.

<inertia> (requerido)

Establece los momentos de inercia de este eslabón ixx, iyy, izz y los productos de inercia ixy, ixz, iyz sobre Co (el centro de masa del eslabón) para los vectores unitarios Cx, Cy, Cz del sistema de referencia ubicado en el centro de masa C. Los atributos ixx, ixy, ixz, iyy, iyz, izz para algunas formas primitivas se pueden obtener aquí . URDF asume una convención de producto de inercia negativa (para más información, consulte estos documentos de MathWorks para trabajar con herramientas CAD). La forma más sencilla de evitar problemas de compatibilidad asociados con la convención de signos negativos para el producto de inercia es alinear Cx, Cy, Cz con las direcciones principales de inercia para que todos los productos de inercia sean cero.

 

 

<visual> (opcional)

Recoge las propiedades visuales del enlace. Este elemento permite especificar la forma del enlace (caja, cilindro, esfera o malla), su posición y orientación, el color y la textura. 

nombre (opcional)

Especifica un nombre para una parte de la geometría de un enlace. Esto es útil para poder referirse a partes específicas de la geometría del mismo.

<origin> (opcional)

Indica la posición y la orientación del sistema de referencia V en relación al sistema de referencia L ubicado en la articulación con el enlace padre. 

xyz (opcional: por defecto es vector cero)

Representa el vector de posición del origen Vo del sistema de referencia V en metros.

rpy (opcional: el valor predeterminado es identidad si no se especifica)

Representa la orientación de los vectores unitarios Vx, Vy, Vz del sistema de referencia V respecto del sistema de referencia L ubicado en la articulación, como una secuencia de rotaciones de Euler (rpy) en radianes. 

<geometry> (requerido)

Establece la forma visual del enlace. Permite los siguientes elementos:

<box> (opcional)

Define una caja. El origen de la caja está en su centro.

size (atributo) Contiene las tres longitudes laterales de la misma. 

<cylinder> (opcional)

Define un cilindro. El origen del cilindro está en su centro.

radious (atributo) Radio del cilindro.

length . (atributo) Longitud del cilindro.

<sphere> (opcional)

Define una esfera. El origen de la esfera está en su centro.

radious (atributo) Radio de la esfera.

<mesh> (opcional)

Define un elemento malla. Su origen dependerá de donde se haya fijado el sistema de referencia durante el diseño de la malla mediante algún programa de modelado 3D.

filename (atributo) Nombre del archivo que contiene la información geométrica de la malla. Es compatible con los formatos .stl y Collada .dae, aunque el formato recomendado para obtener la mejor compatibilidad con texturas y colores es este último. Hay que prefijar al nombre del archivo de malla  package://<packagename>/<path>/ para hacer que su ruta sea relativa al paquete.

scale (atributo opcional) Aplica un factor de escala a la geometría definida por la malla.

<material> (opcional)

Establece el material del elemento visual. Se permite especificar un elemento material fuera del objeto link, en el elemento robot de nivel superior, de forma que desde dentro de un elemento link, se pueda hacer referencia al material por su nombre.

nombre (atributo) Nombre del material.

<color> (opcional)

rgba (atributo) El color de un material especificado por un conjunto de cuatro números que representan los canales rojo/verde/azul/alfa, cada uno en el rango de [0,1].

<texture> (opcional)

filename (atributo) Nombre del archivo que contiene la textura del material.

 

 

<collision> (opcional)

Establece la forma geométrica empleada para el cálculo de colisión de un enlace.

nombre (opcional)

Especifica un nombre para una parte de la geometría de un vínculo. Esto es útil para poder referirse a bits específicos de la geometría de un enlace.

<origin> (opcional)

Define el sistema de referencia V del elemento de colisión, relativo al sistema de referencia L del enlace.

xyz (opcional: por defecto es vector cero)

Representa el vector de posición del origen Vo del sistema de referencia V en metros.

rpy (opcional: el valor predeterminado es identidad si no se especifica)

Representa la orientación de los vectores unitarios Vx, Vy, Vz del sistema de referencia V respecto del sistema de referencia L ubicado en la articulación, como una secuencia de rotaciones de Euler (rpy) en radianes. 

 

<geometry>

Establece la forma del objeto empleado para la detección de colisiones. Admite los mismos elementos que el descrito para <visual>.

 

Definiendo cada una de las articulaciones. El elemento <joint>

A continuación se muestra un ejemplo de código de definición de una articulación.

 <joint name="my_joint" type="floating">
    <origin xyz="0 0 1" rpy="0 0 3.1416"/>
    <parent link="link1"/>
    <child link="link2"/>

    <calibration rising="0.0"/>
    <dynamics damping="0.0" friction="0.0"/>
    <limit effort="30" velocity="1.0" lower="-2.2" upper="0.7" />
    <safety_controller k_velocity="10" k_position="15" soft_lower_limit="-2.0" soft_upper_limit="0.5" />
 </joint>

El elemento joint permite definir la cinemática y la dinámica de cada una de las articulaciones, así como sus límites de seguridad. Para ello admite los siguientes elementos, siendo todos ellos opcionales menos <parent> y <child>.

Fijando el sistema de referencia del enlace hijo. El elemento <origin>

Este elemento indica la ubicación y orientación del sistema de referencia L del enlace hijo. Como ya hemos comentado este sistema de referencia forma parte de la definición de la cadena cinemática y lo ubicaremos en la articulación con el enlace padre, de modo que uno de sus ejes coincida en función del tipo de articulación con el eje de giro (revolute, continuous) o con la dirección de desplazamiento (prismatic). 

La pose del sistema de referencia L se establece en relación al sistema de referencia L del enlace padre.

Estableciendo los enlaces de la articulación. Los elementos <parent> y <child>

Estos elementos permiten proporcionar la única información que realmente es obligatoria a la hora de definir una articulación, que es la definición de los enlaces padre e hijo unidos por la misma.

Indicando el eje asociado al movimiento de la articulación. El elemento <axis>

Para articulaciones de tipo revolute, continuous o prismatic, el elemento <axis> permite indicar cual de los ejes del sistema de referencia L coincide con el eje de giro o de desplazamiento de la articulación.

Estableciendo la dinámica. El elemento <dynamics>

El elemento <dynamics> permite indicar las propiedades dinámicas de la articulación, estableciendo los coeficientes de rozamiento estático y de amortiguamiento. 

Fijando los límites de movimiento, velocidad y esfuerzo. El elemento <limit>

El elemento <limit> permite establecer el rango del movimiento de la articulación, así como la velocidad máxima que puede alcanzar o el esfuerzo máximo que es capaz de desarrollar. Para más información consultar la siguiente página donde se explican los límites de seguridad de una articulación.

Ajustando los límites de seguridad. El elemento <safety_controller>

Este elemento permite establecer las relaciones límite entre posición/velocidad y velocidad/esfuerzo. El área sombreada en la figura inferior representa la zona de valores permitidos. Para más información consultar la siguiente página donde se explican los límites de seguridad de una articulación.

Límites de seguridad de la articulación

Calibrando la articulación. El elemento <calibration>

Este elemento se utiliza para establecer la posición de referencia de la articulación, la cual es empleada para calibrar su posición absoluta. Permite lanzar una señal con un flanco de subida o de bajada cuando se alcanza la posición de referencia.

Imitando el movimiento de otra articulación. El elemento <mimic>

Este elemento permite que una articulación imite los movimientos de otra. Esto es muy útil por ejemplo cuando estamos modelando una pinza para un brazo manipulador.

Resumen de elementos y atributos admitidos

En el siguiente cuadro se recogen todos los elementos, junto con sus atributos, admitidos por la especificación URDF para caracterizar las articulaciones.

ELEMENTOS Y ATRIBUTOS ADMITIDOS POR <JOINT>

<origin> (opcional: el valor predeterminado es la  identidad si no se especifica)

Define el sistema de referencia L del enlace, ubicado sobre la articulación con el enlace padre. Atributos:

xyz (opcional: por defecto es el vector cero)

Origen del sistema de referencia L. Valores en metros.

rpy (opcional: por defecto es el vector cero)

Representa  la orientación de los vectores unitarios Lx, Ly, Lz del sistema de referencia L respecto del sistema de referencia del enlace padre, como una secuencia de rotaciones de Euler (rpy) en radianes.

 

<parent> (requerido)

Nombre del link padre. Atributos:

Link (requerido)

El nombre del enlace padre de la articulación.

 

<child> (requerido)

Nombre del link hijo. Atributos:

Link (requerido)

El nombre del enlace hijo de la articulación.

 

<axis> (opcional: por defecto es (1,0,0))

El eje de unión especificado en el marco de unión. Este es el eje de rotación para las articulaciones giratorias, el eje de traslación para las articulaciones prismáticas y la superficie normal para las articulaciones planas. El eje se especifica en el sistema de referencia L. Las uniones fijas y flotantes no utilizan este elemento.

xyz (requerido)

Representa las componentes de un vector. El vector debe ser normalizado.

 

<calibration> (opcional)

Define las posiciones de referencia de la articulación, utilizadas para calibrar la posición absoluta de la misma.

rising (opcional)

Cuando la articulación se mueve en una dirección positiva, esta posición de referencia activará un flanco ascendente.

falling (opcional)

Cuando la articulación se mueve en una dirección positiva, esta posición de referencia activará un flanco descendente.

 

<dynamics> (opcional)

Especifica las propiedades físicas de la articulación. 

damping (opcional, predeterminado en 0)

El valor de amortiguamiento de la articulación (en N∙s/m para articulaciones prismáticas, y en Nms/rad para las de giro).

friction (opcional, por defecto es 0)

El valor del coeficiente de rozamiento estático de la articulación (en N para las prismáticas y en Nm para las de giro).

 

<limit> (requerido solo para articulaciones de giro y prismáticas)

Un elemento puede contener los siguientes atributos:

lower (opcional, por defecto es 0)

Especifica el límite inferior de la articulación (en radianes para articulaciones de giro, y en metros para las prismáticas). Omitir si la articulación  es continua.

upper (opcional, por defecto es 0)

Especifica el límite superior de la articulación (en radianes para articulaciones de giro, y metros para las prismáticas). Omitir si la articulación es continua.

effort (requerido)

Esfuerzo máximo que puede realizar la articulación.

velocity (requerido)

Velocidad máxima que puede alcanzar la articulación (en rad/s para las de giro y en m/s para las prismáticas).

 

<mimic> (opcional)

Esta etiqueta se utiliza para especificar que la articulación que se está definiendo imita otra articulación existente. El valor de esta articulación se puede calcular como valor = multiplicador * otro_valor_junta + compensaciónAtributos:

joint (requerido)

Especifica el nombre de la articulación a imitar.

multiplier (opcional)

Especifica el factor multiplicativo en la fórmula anterior.

offset (opcional)

Especifica el desplazamiento para agregar en la fórmula anterior. El valor predeterminado es 0 (radianes para articulaciones de giro, y metros para las prismáticas).

 

<safety_controller> (opcional)

Este elemento puede contener los siguientes atributos:

soft_lower_limit (opcional, por defecto es 0)

Especifica el límite inferior de la articulación donde el controlador de seguridad comienza a limitar la posición de la articulación. Este límite debe ser mayor que el límite inferior de la articulación (ver arriba).

soft_upper_limit (opcional, por defecto es 0)

Especifica el límite superior de la articulación donde el controlador de seguridad comienza a limitar la posición de la misma. Este límite debe ser menor que el límite superior (ver arriba). 

k_position (opcional, por defecto es 0)

Relación entre la posición y los límites de velocidad.

k_velocity (obligatorio)

Relación entre el esfuerzo y los límites de velocidad.

Comparte este artículo:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *