Boa tarde, queridos leitores. No
meu último artigo, falei sobre dois algoritmos SLAM projetados para câmeras de profundidade: rtabmap e RGBD-SLAM. Depois, tentamos apenas construir um mapa da área. Neste artigo, falarei sobre as possibilidades de localização e navegação do robô usando o algoritmo rtabmap. Quem estiver interessado, por favor, sob o gato.
Localização no rtabmap com visualização no rviz
Para começar, se o mestre do ROS não estiver em execução, execute-o:
roscore
Execute o driver da câmera:
roslaunch freenect_launch freenect.launch depth_registration:=true
Execute o rtabmap para criar um mapa com visualização no rviz e excluindo o mapa antigo:
roslaunch rtabmap_ros rtabmap.launch rtabmap_args:="--delete_db_on_start" rtabmapviz:=false rviz:=true
Quando o procedimento de construção do mapa é concluído, encerramos o programa usando Ctrl + C para salvar o mapa e reiniciar o rtabmap no modo de localização:
roslaunch rtabmap_ros rtabmap.launch localization:=true rtabmapviz:=false rviz:=true

Para mostrar o mapa no rviz, você precisa clicar na marca de seleção no item Download Map no visor MapCloud:


Mova a câmera para o local em que o robô está localizado no mapa em rviz. Depois disso, a transformação entre os sistemas de coordenadas / mapa → / odom será publicada.

Construção de mapa e navegação usando o rtabmap usando o Turtlebot como exemplo
A criação de mapas e a localização do robô usando o método rtabmap podem ser experimentadas no simulador de robô Turtlebot. O Rtabmap possui pacotes especiais para isso. Para informações adicionais, dou um link para a
fonte do material. Primeiro, instale os pacotes necessários:
sudo apt-get install ros-<ros_version>-turtlebot-bringup ros-<ros_version>-turtlebot-navigation ros-<ros_version>-rtabmap-ros
Por padrão, o driver OpenNI2 é usado, especificado no arquivo 3dsensor.launch (TURTLEBOT_3D_SENSOR = asus_xtion_pro). Nas minhas experiências, usei a câmera Microsoft Kinect. Vamos instalar o driver para ele na variável TURTLEBOT_3D_SENSOR:
echo 'export TURTLEBOT_3D_SENSOR=kinect' >> ~/.bashrc source ~/.bashrc
Agora começaremos a construir o mapa usando pacotes especiais para o simulador Turtlebot em 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 na janela do rviz:

E agora com uma nuvem de pontos da câmera Kinect:

Você deve ver um mapa bidimensional, um mapa tridimensional e um pouco mais de saída de tópico necessária para a navegação. Além disso, os displays rviz padrão e os adicionais específicos para rtabmap (Mapa Local, Mapa Global, Rtabmap Cloud) são exibidos no painel de exibição à esquerda.

Vamos mover a câmera no espaço e depois de um tempo veremos:

Por padrão, o rtabmap usa o mesmo banco de dados toda vez que demo_turtlebot_rviz.launch é executado. Para excluir o mapa antigo e começar a compilar o mapa novamente (desde o início), você pode excluir manualmente o banco de dados salvo no arquivo ~ / .ros / rtabmap.db ou executar demo_turtlebot_rviz.launch com o argumento args: = "- delete_db_on_start".
Execute a construção do mapa sem excluir o banco de dados:
roslaunch rtabmap_ros demo_turtlebot_mapping.launch
Após a construção do mapa, o resultado será mais ou menos assim:

Localização com Turtlebot
Agora, temos um mapa que é salvo no banco de dados no arquivo ~ / .ros / rtabmap.db. Reinicie demo_turtlebot_mapping.launch no modo de localização com localização: = true:
roslaunch rtabmap_ros demo_turtlebot_mapping.launch rgbd_odometry:=true localization:=true
Veremos a seguinte imagem:

Mova o Kinect para o lado. O robô determinará sua nova localização assim que detectar um loop (fechamento do loop):

A detecção de loop bem-sucedida levará tempo, portanto, seja paciente.
Funciona bem rápido:
Navegação autônoma com Turtlebot
Agora que o mapa foi criado, você pode tentar a navegação offline em um mapa conhecido usando a pilha de Navegação. Para isso, basta indicar para o robô o alvo atual no mapa em rviz, em qual direção o robô deve se mover no modo offline. Todo o resto será tratado pela pilha de Navegação. Para começar, basta clicar no botão Meta de navegação 2D no rviz

e indique a meta clicando em um local arbitrário no mapa

Inclua a exibição Pose selecionando o tópico “/ move_base / current_goal” e a exibição Path selecionando o tópico “/ move_base / NavfnROS / plan”. Você deve ver o caminho planejado (linha verde no mapa) e o alvo definido, indicado por uma seta vermelha:

O pacote move_base é responsável por controlar o robô em direção ao alvo. Ele publicará comandos de movimento como geometry_msgs / Twist no tópico / mobile_base / command / velocity:
rostopic echo /mobile_base/commands/velocity
Informações adicionais sobre como trabalhar com a pilha de Navegação podem ser encontradas no
tutorial na página oficial turtlebot_navigation. Há também um
tutorial para usar o rtabmap em seu próprio robô.
Dessa forma, desta vez, conseguimos localizar o robô em um mapa construído previamente e aprendemos como definir uma meta para o robô, para que ele pudesse se mover em direção a ele offline. Desejo-lhe boa sorte nos experimentos e até breve!