Apriltags utilizando ROS y Gazebo

Buenas! Mi nombre es Steven Desvars, soy Software Developer en la empresa Ekumen, y generalmente trabajo con ROS y Gazebo.

Últimamente estuve investigando sobre los apriltags, y me pareció un tema interesante como para hacer un post al respecto, no me considero un experto pero creo que algo de información podría dar pie a que luego cada uno realice su propia investigación.

¿Qué son los Apriltags?

Los apriltags son Marcas de Referencia(Fiducial) que a la vez son parecidos al código QR, utilizado en campos como Realidad Aumentada, Robótica y Calibración de Cámaras.

Aquí pueden encontrar un Demo de Localization utilizando Apriltags

La ventaja de una apriltag en comparación con un código QR por ejemplo, es el hecho que visualizar el código te permite saber posición, orientación e id de los tags, comparada con los QR que aportan una cantidad mayor de información pero sin los detalles de posición.

apriltag_ros

Apriltag_ros es un wrapper de los algoritmos utilizados para el procesamiento visual de los tags, comunicando la posición de los tags a través de tópicos de ROS.

En donde las entradas representan:

  • /camera/image_rect: Del tipo sensor_msgs/Image. Un tópico que contiene la imagen a ser procesada (ej. Un frame del stream de un video).

  • /camera/camera_info: Del tipo sensor_msgs/CameraInfo. Un tópico que contiene la matriz de calibración de la cámara.

Mientras que las salidas serían:

  • /tf: La posición entre el frame de la cámara y cada tag detectado (especificado en el “tags.yaml”). Solo se publica si el campo “publish_tf” tiene el valor True en el “settings.yaml”.

  • /tag_detections: La misma información que la publicada en la tf, pero en forma de mensaje custom. Proveyendo el ID, el tamaño y la posición en formato de geometry_msgs/PoseWithCovarianceStamped.

  • /tag_detections_image: la misma imagen que la entrada de “/camera/image_rect” pero con los tags resaltados. Se publica solo si la variable publish_tag_detections_image tiene el valor True en el launch file launch/continuous_detection.launch.

Dos archivos de configuración son necesarios para esta operación, “tags.yaml” y “settings.yaml”.

config/settings.yaml

tag_family:        'tag36h11' # Familia del tag
tag_border:        1          # Tamano (en bits) del borde negro
tag_threads:       2          # Numero de thread de detección. Ajustar de acuerdo a tu CPU
tag_decimate:      1.0        # Reduce la resolución de la imagen por este número. Incremente la velocidad al costo de detectar tags pequenos
tag_blur:          0.0        # tag_blur>0 borronea la imagen y tag_blur<0 ajusta la imagen
tag_refine_edges:  1          # mejora la detección de bordes and por lo tanto mejora la estimación de la pose. Light computation
tag_refine_decode: 0          # reduce la frecuencia de detección de falsos negativos. Medium computation
tag_refine_pose:   0          # mejora la precisión de la estimacion. Heavy computation
tag_debug:         0          # Guarda las imágenes en ~/.ros Cuidado de usar con video
publish_tf:        true       # Publica las poses de tag/bundle al tópico de /tf

config/tags.yaml

Este archivo se encarga de comunicar al algoritmo de detección que tags está buscando y su tamaño de manera a que puedan ser ubicados en un espacio 3D. El software asume que la posición está dada en metros y la orientación en cuaterniones.

standalone_tags:
  [
    {id: 10, size: 0.15},
    {id: 20, size: 0.1},
    {id: 30, size: 0.07}
  ]
tag_bundles:
  [
    {
      name: 'my_bundle',
      layout:
        [
          {id: 0, size: 0.05, x: 0.0000, y: 0.0000, z: 0.0, qw: 1.0, qx: 0.0, qy: 0.0, qz: 0.0},
          {id: 4, size: 0.05, x: 0.0548, y: -0.0522, z: 0.0, qw: 1.0, qx: 0.0, qy: 0.0, qz: 0.0},
          {id: 3, size: 0.05, x: -0.0580, y: -0.0553, z: 0.0, qw: 1.0, qx: 0.0, qy: 0.0, qz: 0.0},
          {id: 2, size: 0.05, x: 0.0543, y: 0.0603, z: 0.0, qw: 1.0, qx: 0.0, qy: 0.0, qz: 0.0},
          {id: 1, size: 0.05, x: -0.0582, y: 0.0573, z: 0.0, qw: 1.0, qx: 0.0, qy: 0.0, qz: 0.0}
        ]
    }
  ]

Ejemplo de aplicación:

Video de Demo de Apriltags utilizando Gazebo

Pueden seguir las instrucciones para probarlos ustedes mismos, para más detalles entrar en el link.

La versión corta de la explicación sería:

Una vez completado el Paso 0 para preparar el entorno.

Pueden acceder al docker creado usando el script ./run.sh y ejecutar:

source /opt/ros/melodic/setup.bash
rosdep install --from-paths src --ignore-src -r -y
catkin_make_isolated
source devel/setup.bash
TURTLEBOT3_MODEL=waffle_pi roslaunch apriltag_simulation apriltag_simulation.launch

Para lanzar el teleop, en otra terminal entran al docker container ejecutando el script ./run.sh y luego ejecutan lo siguiente:

source devel/setup.bash
TURTLEBOT3_MODEL=waffle_pi roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

La idea de la aplicación de los tags en este caso sería ayudar a la localización, cuando se tienen entornos con puntos de referencia muy similares, utilizar un apriltag puede ayudar a que el robot no se pierda, o no haya “saltos” en el mapa.

Esto es debido a la posibilidad de los algoritmos de apriltag_ros de determinar la posición y orientación de los tags respecto al frame de la cámara, que es un punto fijo respecto a los links del robot.

Si quieren probarlo ustedes mismos, les dejo el link al repo donde configuré y ejecuté el test:

apriltag_sim

Espero que les guste y les parezca interesante.

Si tienen preguntas, encantado de responderlas a medida de mis posibilidades.

Saludos.

Fuentes y Links Adicionales:

Papers sobre los Apriltags

  1. AprilTag: A robust and flexible visual fiducial system
  2. AprilTag 2: Efficient and robust fiducial detection
  3. Flexible Layouts for Fiducial Tags

Información adicional

  1. Repo del demo - turtlebot3_spanish
  2. Apriltag_ros wiki
  3. Apriltags 101 - Optitag
  4. Using Apriltag with ROS
  5. April Robotics Page
13 Likes

Gracias @stevendes! Es fantástico ver contenido de calidad en nuestro idioma.

1 Like