Buenas tardes, queridos lectores. En
mi último artículo, hablé sobre dos algoritmos SLAM diseñados para cámaras de profundidad: rtabmap y RGBD-SLAM. Luego intentamos solo construir un mapa del área. En este artículo hablaré sobre las posibilidades de localización y navegación del robot usando el algoritmo rtabmap. ¿Quiénes están interesados, por favor, debajo del gato?
Localización en rtabmap con visualización en rviz
Para empezar, si el maestro ROS no se está ejecutando, ejecútelo:
roscore
Ejecute el controlador para la cámara:
roslaunch freenect_launch freenect.launch depth_registration:=true
Ejecute rtabmap para construir un mapa con visualización en rviz y eliminar el mapa antiguo:
roslaunch rtabmap_ros rtabmap.launch rtabmap_args:="--delete_db_on_start" rtabmapviz:=false rviz:=true
Cuando se completa el procedimiento de construcción del mapa, salimos del programa usando Ctrl + C para guardar el mapa y reiniciar rtabmap en modo de localización:
roslaunch rtabmap_ros rtabmap.launch localization:=true rtabmapviz:=false rviz:=true

Para mostrar el mapa en rviz, debe hacer clic en la marca de verificación en el elemento Descargar mapa en la pantalla de MapCloud:


Mueva la cámara al lugar donde se encuentra el robot en el mapa en rviz. Después de eso, se publicará la transformación entre los sistemas de coordenadas / mapa → / odom.

Construcción de mapas y navegación usando rtabmap usando Turtlebot como ejemplo
La construcción de mapas y la localización de robots utilizando el método rtabmap se pueden probar en el simulador de robots Turtlebot. Rtabmap tiene paquetes especiales para esto. Para obtener información adicional, doy un enlace a la
fuente del material. Primero, instale los paquetes necesarios:
sudo apt-get install ros-<ros_version>-turtlebot-bringup ros-<ros_version>-turtlebot-navigation ros-<ros_version>-rtabmap-ros
De forma predeterminada, se utiliza el controlador OpenNI2, que se especifica en el archivo 3dsensor.launch (TURTLEBOT_3D_SENSOR = asus_xtion_pro). En mis experimentos, usé la cámara Microsoft Kinect. Instalemos el controlador en la variable TURTLEBOT_3D_SENSOR:
echo 'export TURTLEBOT_3D_SENSOR=kinect' >> ~/.bashrc source ~/.bashrc
Ahora comenzaremos a construir el mapa usando paquetes especiales para el simulador Turtlebot en rtabmap_ros:
roslaunch turtlebot_bringup minimal.launch roslaunch rtabmap_ros demo_turtlebot_mapping.launch args:="--delete_db_on_start" rgbd_odometry:=true roslaunch rtabmap_ros demo_turtlebot_rviz.launch
Veremos en la ventana de rviz:

Y ahora con una nube de puntos de la cámara Kinect:

Debería ver un mapa bidimensional, un mapa tridimensional y algunos resultados de temas más necesarios para la navegación. Además, las pantallas estándar de rviz y las específicas adicionales para rtabmap (Mapa local, Mapa global, Rtabmap Cloud) se muestran en el panel de visualización a la izquierda.

Muevamos la cámara en el espacio y después de un tiempo veremos:

Por defecto, rtabmap usa la misma base de datos cada vez que se ejecuta demo_turtlebot_rviz.launch. Para eliminar el mapa antiguo y comenzar a construir el mapa nuevamente (desde un inicio limpio), puede eliminar manualmente la base de datos guardada en el archivo ~ / .ros / rtabmap.db, o ejecutar demo_turtlebot_rviz.launch con el argumento args: = "- delete_db_on_start".
Ejecute la creación de mapas sin eliminar la base de datos:
roslaunch rtabmap_ros demo_turtlebot_mapping.launch
Después de construir el mapa, el resultado se verá así:

Localización con Turtlebot
Ahora tenemos un mapa que se guarda en la base de datos en el archivo ~ / .ros / rtabmap.db. Reinicie demo_turtlebot_mapping.launch en modo de localización con localización: = verdadero:
roslaunch rtabmap_ros demo_turtlebot_mapping.launch rgbd_odometry:=true localization:=true
Veremos la siguiente imagen:

Mueve a Kinect a un lado. El robot determinará su nueva ubicación tan pronto como detecte un bucle (cierre del bucle):

La detección exitosa del circuito llevará tiempo, así que sea paciente.
Funciona bastante rápido:
Navegación independiente con Turtlebot
Ahora que se ha creado el mapa, puede probar la navegación sin conexión en un mapa conocido utilizando la pila de Navegación. Para hacer esto, simplemente indique para el robot el objetivo actual en el mapa en rviz, en qué dirección debe moverse el robot en modo fuera de línea. Todo lo demás se encargará de la pila de navegación. Para comenzar, simplemente haga clic en el botón 2D Nav Goal en rviz

e indique el objetivo haciendo clic en un lugar arbitrario en el mapa

Agregue la pantalla Pose seleccionando el tema "/ move_base / current_goal" para él y la pantalla Ruta seleccionando el tema "/ move_base / NavfnROS / plan". Debería ver la ruta planificada (línea verde en el mapa) y el objetivo establecido, indicado por una flecha roja:

El paquete move_base es responsable de controlar el robot hacia el objetivo. Publicará comandos de movimiento como geometry_msgs / Twist en el tema / mobile_base / command / velocity:
rostopic echo /mobile_base/commands/velocity
Se puede encontrar información adicional sobre cómo trabajar con la pila de Navegación en el
tutorial en la página oficial de turtlebot_navigation. También hay un
tutorial para usar rtabmap en su propio robot.
Por lo tanto, esta vez pudimos localizar el robot en un mapa construido de antemano y aprendimos cómo establecer una meta para el robot para que pueda moverse hacia él fuera de línea. ¡Te deseo buena suerte en los experimentos y hasta pronto!