Escrito por GuYueHome
01 O que é SLAM
O nome completo de SLAM é Simultaneous Localization And Mapping, que se traduz como localização instantânea e construção de mapas. Há duas palavras-chave aqui: localização e construção de mapas, o que significa que o robô determinará sua posição em um ambiente desconhecido enquanto constrói um mapa, produzindo por fim um mapa como este.

Em resumo, o processo de construção de mapas do SLAM consiste em medir as informações de distância entre o robô e o ambiente ao redor com sensores de profundidade, de modo a concluir a construção do mapa do ambiente circundante. Ao mesmo tempo, o robô verificará a consistência do ambiente e detectará se ele se move para o local onde o mapa já foi construído, concluindo por fim o fechamento do laço do mapa para finalizar todo o mapa.

O algoritmo SLAM mais utilizado no ROS é o Gmapping, um algoritmo SLAM open source comum baseado no framework SLAM filtrado, que se baseia no algoritmo de filtragem de partículas RBpf, ou seja, os processos de localização e construção de mapas são separados, realizando-se primeiro a localização e depois a construção do mapa. Se você tem interesse no algoritmo Gmapping, pode ler o artigo sobre o algoritmo em: https://openslam-org.github.io/gmapping.html
02 Controle de Movimento do Robô Móvel LIMO
2.1 Robô multimodal LIMO
Nossos tipos comuns de movimento de robôs móveis geralmente são diferencial de quatro rodas, esterçamento Ackermann, diferencial de esteira, movimento omnidirecional, etc., mas como diz o ditado, os adultos não fazem escolhas, o LIMO da Songling Robotics atende a todas as suas necessidades, quatro tipos de movimento alternáveis à vontade.
Vamos nos dedicar aos testes de tipos de movimento multimodal no futuro. O foco de hoje é a implementação de funções de aplicação SLAM no estado de movimento do robô LIMO com velocidade diferencial de quatro rodas.
2.2 Conexão remota ao LIMO
Você pode baixar o NoMachine - Free Remote Desktop For Everybody diretamente do site oficial do LIMO: https://www.nomachine.com/
Uma vez instalado o software, o computador e o carrinho são conectados ao mesmo WiFi para que você possa se conectar com o carrinho remotamente.

2.3 Baixar e compilar o código
O código do robô LIMO está sendo continuamente atualizado, como podemos ver na página inicial do Github. Para garantir que estamos usando o código mais recente, aqui utilizamos o comando a seguir para baixar o pacote de código para o workspace no sistema embarcado do LIMO, substituindo o código original.

Em seguida, use o comando catkin_make para compilar o espaço. Esta é uma operação regular do ROS, portanto, se você não estiver familiarizado com ela, pode ler "21 Palestras sobre Introdução ao ROS" de Guyue Jun.
2.4 Fazer o carrinho funcionar
Para garantir que a funcionalidade básica do robô esteja pronta para funcionar, vamos experimentar o controle mais básico por teclado para colocar o carrinho em movimento.
Inicie um terminal para ativar o chassi e os sensores do carrinho.

Após o chassi ser iniciado com sucesso, ele se inscreverá no tópico cmd_vel, assim como controlar uma pequena tartaruga marinha, e ao iniciar o seguinte nó de controle por teclado, você pode controlar o movimento suave do LIMO pelo teclado.

03 Análise da configuração da função SLAM do Gmapping
3.1 Pacote Gmapping
Antes de usar o pacote Gmapping no ROS, você precisa instalá-lo usando o comando a seguir, aqui está a versão Melodic; se você estiver usando outras versões do ROS, substitua o nome da versão no comando.

O algoritmo SLAM não é simples, mas o Gmapping é um "bloco de construção" que foi empacotado muito bem, e podemos encontrar a interface na wiki do ROS. A descrição é mostrada na figura a seguir.

Como se pode ver, o Gmapping precisa se inscrever no tópico de transformação de juntas do robô /tf e no tópico de dados de varredura do LiDAR /scan, e então publicar o tópico do mapa em grade /map.
Em relação ao /tf, ele é ainda dividido em duas partes; as transformações TF no pacote de funcionalidades Gmapping são mostradas na figura a seguir.

Assim, podemos determinar que as condições necessárias para o algoritmo Gmapping — /tf, /odom, /scan — estarão prontas para publicar /map por meio do algoritmo.
Após a inicialização do chassi do robô LIMO anterior, essas condições básicas já foram publicadas ou atualizadas normalmente no nó de nível inferior, portanto nosso foco é configurar o nó de função Gmapping por meio de um arquivo launch.
3.2 Configuração da função SLAM
Crie um pacote de funcionalidades chamado limo_slam sob o arquivo src no workspace, onde é criada outra pasta launch, e o arquivo launch referente à configuração de inicialização do Gmapping é colocado aqui.
Os detalhes do arquivo launch gmapping.launch são os seguintes. Se você usar outros robôs, precisará alterar as partes comentadas no arquivo a seguir de acordo com a sua respectiva situação.

Se você está familiarizado com o algoritmo SLAM, esses parâmetros podem não ser novidade para você, mas se você não conhece o algoritmo SLAM, não se preocupe: esses parâmetros têm valores padrão e, na maioria das vezes, você pode simplesmente usar os valores padrão ou usar a configuração de robôs semelhantes no ROS.
Como a estrutura do algoritmo Gmapping é mostrada abaixo, os principais parâmetros que precisamos alterar são odom (sistema de coordenadas do odômetro, obrigatório), scan (tópico do LIDAR, obrigatório), base_footprint_frame (sistema de coordenadas da base do robô, obrigatório), imu_data (tópico do IMU, opcional), e os nomes e valores desses parâmetros precisam corresponder aos nomes e valores dos tópicos publicados no driver do chassi do robô limo_start, caso contrário o Gmapping não recebe esses parâmetros e não pode executar o SLAM.

04 Resultados de operação do Gmapping SLAM
Após realizar as preparações relevantes, podemos usar o LiDAR para SLAM.
Primeiro, o código é compilado no workspace usando catkin_make, e então um terminal é iniciado separadamente para executar os comandos a seguir.

Para ver o efeito do SLAM dinâmico, também precisamos usar a exibição visual do Rviz, abrindo um terminal e digitando o comando a seguir.

Em seguida, clique no botão ADD para adicionar as configurações necessárias, como Map, LaserScan, TF, etc., inscrevendo-se nos dados de tópico correspondentes; por exemplo, ao adicionar Map, precisamos alterar o Topic sob Map para /map.

Então podemos controlar o movimento lento do carrinho para SLAM pelo teclado. Se movermos o carrinho após iniciar o SLAM, precisamos refazer o SLAM, porque o TF do carrinho provavelmente estará incorreto.
Atenção ao controlar a velocidade de movimento do carro; se a velocidade for muito alta ao fazer curvas, é fácil ocorrer o fenômeno de deslocamento do mapa.
Após configurar o Rviz, também podemos salvar a configuração atual no pacote de funcionalidades e então adicionar a configuração de nós e parâmetros do Rviz a seguir ao arquivo launch de inicialização do Gmapping, para evitar a necessidade de criar um novo terminal a cada vez para digitar o comando rviz e readicionar a exibição no Rviz.
Também podemos usar o comando rqt_graph para ver as relações entre os nós:

Ao final do SLAM, o comando a seguir é necessário para salvar o mapa:

Devido ao espaço limitado, construímos o mapa conforme mostrado abaixo.

Neste ponto, implementamos o SLAM em um robô móvel LIMO usando o algoritmo Gmapping! Usando uma abordagem semelhante, também podemos implementar outros pacotes de função SLAM para execução, como hector, cartographer e rtabmap, etc. Cada algoritmo tem suas próprias vantagens e desvantagens, então você pode escolher um pacote de algoritmo adequado de acordo com suas necessidades.

