Modelo mesh

Usando archivos mesh en nuestro modelo URDF

Introducción

En este artículo aprenderás a usar archivos mesh en los modelos URDF y cómo evitar problemas con la visualización debidos a errores al indicar la ruta a los mismos lo cual, al menos a mí, me ha dado más de un dolor de cabeza cuando estaba aprendiendo.

Aunque para familiarizarnos con los archivos URDF empezamos utilizando figuras básicas (cajas, cilindros y esferas) tarde o temprano querremos emplear archivos de malla o mesh para crear formas complejas y dotar así a nuestro modelo de un mayor realismo.

Los archivos de malla describen la geometría de la superficie de un objeto tridimensional mediante el uso de triángulos. Los formatos admitidos son .stl y .dae (Collada), siendo preferible el uso del segundo ya que el formato .stl solo incluye información geométrica, mientras que el formato .dae permite incluir información adicional como colores y texturas.

Modificando el código URDF

Usando la etiqueta < mesh >

Para utilizar un archivo de malla se usa la etiqueta < mesh > en del código URDF de nuestro modelo, dentro del elemento geometry, pudiendo emplearse tanto para establecer su representación visual como para definir el modelo de colisión:

<visual>
    <geometry>
        <mesh filename="path_to_mesh_file" scale="1 1 1" />
    </geometry>
</visual>

<collision>
    <geometry>
        <mesh filename="path_to_mesh_file" scale="1 1 1" />
    </geometry>
</collision>

Como puede verse en el código la etiqueta mesh admite dos atributos:

filename: indica la ruta del archivo mesh.

scale: permite realizar un escalado aplicando coeficientes en las direcciones x, y, z. 

Indicando la ruta del archivo de malla

Supongamos que, como es habitual, hemos incluido en nuestro paquete una carpeta meshes donde ubicar los archivos de malla de nuestro modelo y que en la misma tenemos uno al que hemos llamado mesh_file. Entonces tendremos una estructura de archivos como la siguiente:

Arbol de instalación del paquete

Por tanto la ruta de instalación dentro de nuestro espacio de trabajo al archivo mesh será:

my_workspace/install/my_package/share/my_package/meshes/mesh_file

Para indicar en el atributo filename de la etiqueta < mesh > la ruta al archivo de malla tenemos dos posibilidades: usar una ruta absoluta o una ruta relativa. 

Usando una ruta absoluta

Prefijando file:// a la ruta del archivo mesh indicamos que se trata de una ruta absoluta.

<mesh filename="file://absolute_path_to_mesh_file"/>

El siguiente código muestra una forma de indicar la ruta con la que no tendremos problemas, dado que al final lo que se obtiene una vez evaluada la expresión es una ruta absoluta al archivo mesh, y funcionará tanto en Gazebo como en Rviz. Pero por contra tendremos que usar el lenguaje de macros xacro en nuestro archivo URDF.

<mesh filename="file://$(find my_package)/meshes/mesh_file"/>
Usando una ruta relativa

Prefijando package:// a la ruta del archivo mesh indicamos que se trata de una ruta relativa.

<mesh filename="package://relative_path_to_mesh_file"/>

En este caso hay tener en cuenta algunas consideraciones.

Rviz interpreta que la ruta indicada es relativa a la carpeta share existente en el directorio de instalación del paquete:

my_workspace/install/my_package/share/

Por tanto, para que sea capaz de encontrar el archivo en nuestro código URDF tendremos que usar:

<mesh filename="package://my_package/meshes/mesh_file"/>

Gazebo por su parte busca la ubicación del archivo en alguna de las rutas (separadas mediante “:”) almacenadas en la variable de entorno GAZEBO_MODEL_PATH

Para que nuestro archivo URDF cargue correctamente los archivos mesh tanto en Rviz como en Gazebo tenemos que añadir a esta variable de entorno la ruta absoluta a la carpeta share. Para ello podemos insertar en nuestro archivo launch el siguiente código:

import os
from ament_index_python import get_package_prefix

pkg_share_path = os.pathsep + os.path.join(get_package_prefix(package_name), 'share')
if 'GAZEBO_MODEL_PATH' in os.environ:
    os.environ['GAZEBO_MODEL_PATH'] += pkg_share_path
else:
    os.environ['GAZEBO_MODEL_PATH'] =  pkg_share_path

Donde la función get_package_prefix empleada devuelve la siguiente ruta:  /home/…./my_workspace/install/my_package.

Comparte este artículo:

2 comentarios en “Usando archivos mesh en nuestro modelo URDF”

  1. Hola, me ha parecido bastante bien explicada esta entrada de ROS2. Me ha dejado bastante claro algunos puntos sobre de que carpeta lee el archivo RVIZ2. Sin embargo, tengo este mismo problema. Mi base_link procede de un archivo .stl pero al ejecutar el RVIZ2 solo me muestra las ruedas, que estan hechas a mano en la URDF. En el base_link me dice que no tiene geometría. ¿Sabes a qué se puede deber?
    Un saludo y muchas gracias.

    1. Hola Daniel.

      Gracias por visitar mi blog. Con respecto a tu problema, ¿estás ejecutando el nodo joint_state_publisher para publicar el estado de las articulaciones de tu robot?
      RVIZ no es capaz de representar el modelo adecuadamente si desconoce la posición relativa entre cada una de las partes de tu robot.
      Si quieres mandame tu archivo URDF junto con el código de tu archivo launch y le echo un ojo, a ver si te puedo ayudar.

      Un saludo.

      Jose Enrique Cabrera.

Deja un comentario

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