Buenas tardes, queridos lectores! En artículos anteriores sobre la plataforma robótica ROS, me referí al tema de localización y mapeo, en particular, estudiamos los métodos SLAM: gmapping en el
artículo y hector_slam en el
artículo . En este artículo, continuaré familiarizándome con los algoritmos de localización en ROS y proporcionaré una visión general de varios algoritmos de odometría visual implementados en la plataforma ROS. La odometría visual es importante en robótica porque le permite evaluar el movimiento del robot, su posición actual y su aceleración en función de la transmisión de video de la cámara. Puede usar una cámara RGB normal (en este caso, hablando de odometría monocular) o una cámara estéreo (odometría estéreo) e incluso una cámara RGBD.
Cuando se usan cámaras RGBD como Microsoft Kinect, es posible obtener una odometría visual más precisa que con las cámaras estéreo, ya que en este caso usamos datos 3D. En este artículo consideraremos tales algoritmos. ¿Quién está interesado en este tema, por favor debajo del gato.
rtabmap
rtabmap es esencialmente un algoritmo ROS SLAM. En este paquete, además de las herramientas para SLAM, hay una aplicación
odometryViewer para probar varios métodos de odometría visual. En rtabmap, la odometría visual funciona de la siguiente manera: para calcular la odometría, el algoritmo utiliza atributos visuales obtenidos de imágenes RGB y datos de profundidad de un mapa de profundidad. Usando atributos visuales coincidentes (coincidencia) entre dos imágenes, el algoritmo RANSAC calcula la transformación entre cuadros consecutivos.
Instalar rtabmap en ROS Indigo y Kinetic es muy simple a través de apt-get:
sudo apt-get install ros-<version>-rtabmap ros-<version>-rtabmap-ros
También puede configurar rtabmap y rtabmap_ros desde la fuente:
source /opt/ros/<version>/setup.bash cd ~ git clone https://github.com/introlab/rtabmap.git rtabmap cd rtabmap/build cmake .. make cd ~/catkin_ws git clone https://github.com/introlab/rtabmap_ros.git src/rtabmap_ros catkin_make -j1
Ejecute odometryViewer:
rtabmap-odometryViewer
Se abre una ventana como esta:

Mueve la cámara un poco:

Intentemos ejecutar con los parámetros. Por ejemplo, usando el método de la bolsa de palabras (el valor predeterminado es SURF):
rtabmap-odometryViewer -bow
Usar el método de la bolsa de palabras con un descriptor SIFT (0 = SURF, 1 = SIFT)
rtabmap-odometryViewer -bow 1

Usando el método FAST + BRIEF:
rtabmap-odometryViewer -bin

También puede probar la odometría basada en el método ICP (punto de cierre iterativo) utilizando la opción -icp.
Puede ajustar la frecuencia de procesamiento utilizando el parámetro hz (cuadros enteros por segundo):
rtabmap-odometryViewer -hz 2
También puede configurar los parámetros internos del algoritmo, como la distancia máxima entre inlayers, el número máximo de signos visuales para encontrar una coincidencia, el número de iteraciones en el método RANSAC / ICP.
En general, los experimentos con odometría visual de rtabmap mostraron que el algoritmo funciona rápidamente, sin demora, y determina con precisión la posición de la cámara en relación con la escena. El único inconveniente del algoritmo del paquete rtabmap es que, al usarlo, no era posible mostrar datos de odometría en rviz. Aquí debe aprender más sobre la integración con ROS.
Paquete Fovis_ros
El paquete fovis_ros solo funciona bajo la versión ROS Hydro. Hay una rama Indigo en el repositorio, pero fovis_ros se bloquea con un error al compilar en el espacio de trabajo catkin.
Para instalar fovis_ros necesitaremos la biblioteca libfovis y el paquete fovis_ros. Descárguelos de los repositorios de github:
cd ~/catkin_ws/src git clone https://github.com/srv/libfovis.git cd libfovis git checkout hydro cd .. git clone https://github.com/srv/fovis.git cd fovis git checkout hydro cd ~/catkin_ws catkin_make source devel/setup.bash
Aquí debemos asegurarnos de que Hydro seleccione la rama actual; de lo contrario, pueden producirse problemas de compilación (la rama actual en los repositorios es Indigo).
Ahora crea un lanzador para lanzar fovis_ros:
cd ~/catkin_ws/src git clone https://github.com/vovaekb/fovis_demo.git d ~/catkin_ws catkin_make source devel/setup.bash
Ejecute fovis_demo.launch:
roslaunch fovis_demo fovis_demo.launch
Se abrirá la ventana rviz:

Mueva la cámara un poco y obtenga una posición actualizada:

fovis_ros publica datos en dos temas: / kinect_odometer / odometry (odometry) y / kinect_odometer / pose (position).
Ahora trataremos con el contenido de los archivos de inicio en mi ejemplo. Para información, los archivos están tomados del libro "Aprendiendo ROS para la programación de robótica - Segunda edición" del Capítulo 5 llamado Visión por computadora.
Comencemos con el archivo principal fovis_demo.launch.
En linea
<arg name="mode" default="no_registered"/>
establecemos el parámetro de modo en no_registered. Esto significa que usamos información de profundidad no registrada, es decir, el mapa de profundidad no está registrado y no se transforma en una imagen de una cámara RGB. Esto se hace para acelerar el procesamiento, ya que si se registrara la profundidad, el algoritmo funcionaría lentamente.
Verifique la frecuencia de actualización del odómetro:
rostopic hz /kinect_odometer/odometry
Tenemos una conclusión similar:
average rate: 8.759 min: 0.084s max: 0.156s std dev: 0.02417s window: 9 average rate: 7.938 min: 0.084s max: 0.180s std dev: 0.02724s window: 16 average rate: 7.493 min: 0.084s max: 0.217s std dev: 0.03286s window: 23 average rate: 8.111 min: 0.068s max: 0.217s std dev: 0.03645s window: 33
Ejecute fovis_demo con el registro del programa utilizando el modo: = parámetro sw_registered:
roslaunch fovis_demo fovis_demo.launch mode:=sw_registered
Recibiremos la siguiente información sobre la tasa de actualización del odómetro:
average rate: 0.963 min: 1.022s max: 1.056s std dev: 0.01676s window: 3 average rate: 0.968 min: 1.020s max: 1.056s std dev: 0.01635s window: 4 average rate: 1.212 min: 0.509s max: 1.056s std dev: 0.25435s window: 6
A continuación, definimos el archivo de configuración de pantalla para rviz:
<arg name="rviz_config" default="$(find fovis_demo)/config/rviz_$(arg mode).rviz"/>
No consideraré su contenido aquí. Solo diré que determina la apariencia de la ventana rviz: pantallas activas para temas, configuraciones globales como Marco fijo, etc.
La siguiente es la definición del parámetro rviz y el inicio del controlador para el sensor Kinect, según el parámetro de modo:
<include file="$(find fovis_demo)/launch/openni_kinect_$(arg mode).launch"/>
Inicie el lanzador para fovis desde nuestro paquete también dependiendo del parámetro de modo:
<include file="$(find fovis_demo)/launch/fovis_$(arg mode).launch"/>
Como estimamos el movimiento del robot en función del movimiento de la cámara, necesitamos conocer el desplazamiento o la transformación del sistema de coordenadas de la cámara al sistema de coordenadas del robot. Para hacer esto, publicamos una transformación estática entre los sistemas de coordenadas base_link → camera_link usando static_transform_publisher del paquete tf:
<node pkg="tf" type="static_transform_publisher" name="base_to_camera_tf" args="0 0 -0.05 0 0 0 base_link camera_link 100"/>
Finalmente, ejecuta rviz:
<group if="$(arg rviz)"> <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rviz_config)"/> </group>
No consideraré el resto de los archivos del iniciador en este artículo. Esto se puede hacer de forma independiente si lo desea. Solo diré que cuando se inicia fovis_ros con el modo de parámetro = sw_registered, hacemos estrangulamientos de cuadros desde la cámara RGB, es decir. volver a publicar mensajes de un tema a otro con una frecuencia de actualización más baja (2.5 Hz) (puede leer más detalles sobre esto
aquí ).
Para aquellos que estén interesados en explorar el algoritmo fovis en profundidad, hay
un artículo sobre los detalles del algoritmo.
Los experimentos con odometría visual fovis_ros mostraron que el algoritmo no funciona tan rápido como rtabmap, con pequeños retrasos al mover la cámara, pero aún así determina con bastante precisión la posición de la cámara en relación con la escena.
Espero que esta revisión de los algoritmos de odometría visual sea útil en su trabajo y lo ayude a resolver algunos problemas. ¡Te deseo éxito en tus proyectos y hasta pronto!
PD: También le pido que participe en la encuesta y elija la versión de ROS que usa en su trabajo.