Conteúdo detalhado
🔦 O que um LiDAR enxerga (LaserScan)
Um LiDAR 2D é um sensor de distância que gira. Ele dispara um feixe de luz infravermelha, mede quanto tempo (ou em que ângulo) a luz volta e anota a distância. Como a cabeça gira várias vezes por segundo, cada volta vira um "anel" de centenas de medidas em volta do robô, todas na mesma altura. É como um sensor ultrassônico do módulo 1.4, só que apontando para todos os lados ao mesmo tempo e com precisão de centímetros.
🌱 Novo aqui?
LiDAR vem de "Light Detection and Ranging": medir distância com luz. No ROS 2, cada volta do LiDAR chega como uma mensagem do tipo sensor_msgs/msg/LaserScan, publicada num tópico que por convenção se chama /scan. Mensagem e tópico são os mesmos do módulo 4.1: um nó publica, outros ouvem.
Como ler: cada linha âmbar é um feixe e cada ponto brilhante é uma medida que voltou. Note a sombra ciano atrás da caixa: o LiDAR só vê a primeira superfície que o feixe toca. Para "ver" atrás, o robô precisa andar.
A mensagem LaserScan não guarda pontos (x, y). Ela guarda uma lista de distâncias e as regras para saber o ângulo de cada uma: onde a volta começa, onde termina e quantos graus separam uma medida da outra. Medida que não voltou aparece como inf (nada ao alcance) ou fica fora dos limites range_min/range_max.
Como ler: a fileira de caixas é o vetor ranges. Para desenhar o ponto, o ROS 2 pega o índice, calcula o ângulo pela fórmula ciano e converte (ângulo, distância) em (x, y). RViz2 e slam_toolbox fazem essa conta para você.
✓ O LiDAR 2D vê bem
- ✓Paredes, portas, móveis altos e pernas de mesa na altura do feixe.
- ✓Corredores e cantos: ótimos para casar uma volta com a outra.
- ✓No escuro: ele traz a própria luz, não depende da iluminação da sala.
✗ O LiDAR 2D não vê
- ✗Vidro e espelho: a luz atravessa ou rebate para longe.
- ✗Tampo de mesa acima do feixe e objetos abaixo dele (brinquedo, degrau).
- ✗Escada que desce: o chão some, mas o feixe horizontal não percebe.
Por que aprender
O LiDAR é o sensor mais usado em robô móvel que navega dentro de casa, de aspirador a robô de armazém. Entender o que ele mede, e o que ele não mede, decide se o seu robô vai desviar da cadeira ou bater no vidro da porta.
Conceitos-chave
🔌 Ligar o LiDAR no ROS 2
Os LiDARs baratos mais comuns para makers são o RPLIDAR C1 ou A1 (Slamtec) e o LD19 (LDRobot). Todos chegam ao PC ou ao Raspberry Pi 5 por um adaptador USB-serial. Quem transforma os bytes da serial em mensagens /scan é um driver: um pacote ROS 2 do fabricante que você compila no seu workspace, como fez com colcon no módulo 4.2.
Como ler: o seu trabalho é só a parte âmbar: ligar a USB e subir o nó driver. A partir de /scan (ciano), qualquer nó do ROS 2 pode usar o dado. A frase de baixo é o detalhe que mais falha: sem a transformação base_link → laser, o RViz2 não sabe onde desenhar.
Passo a passo com o LiDAR real
Ache a porta
Ligue o LiDAR e rode ls /dev/ttyUSB*. Normalmente aparece /dev/ttyUSB0. Dê permissão ao seu usuário com o grupo dialout (bloco abaixo) e saia e entre de novo na sessão.
Baixe e compile o driver
RPLIDAR: repositório rplidar_ros da Slamtec (ramo do ROS 2). LD19: ldlidar_stl_ros2 da LDRobot. Clone dentro de ~/ros2_ws/src e compile com colcon.
Suba o launch do seu modelo
Cada driver traz um launch por modelo. O nome muda entre versões: liste a pasta launch/ do pacote e use o do seu sensor.
Veja no RViz2
Em RViz2, ponha Fixed Frame = laser (ou o frame que o driver usa), clique em Add → LaserScan e escolha o tópico /scan.
Objetivo: ver o LiDAR publicando em /scan. O exemplo usa o RPLIDAR; para o LD19 troque o repositório e o launch. Rode num terminal com o ROS 2 carregado (<distro> = jazzy ou lyrical).
# 1) permissão para usar a porta serial (saia e entre na sessão depois)
sudo usermod -aG dialout $USER
# 2) driver no workspace (confira o ramo ROS 2 no README do repositório)
source /opt/ros/<distro>/setup.bash
mkdir -p ~/ros2_ws/src && cd ~/ros2_ws/src
git clone https://github.com/Slamtec/rplidar_ros.git -b ros2
cd ~/ros2_ws && colcon build --symlink-install
source install/setup.bash
# 3) veja quais launch files o pacote tem e suba o do seu modelo
ls $(ros2 pkg prefix rplidar_ros)/share/rplidar_ros/launch
ros2 launch rplidar_ros rplidar_c1_launch.py serial_port:=/dev/ttyUSB0
# 4) em OUTRO terminal: confira o tópico
ros2 topic hz /scan
ros2 topic echo /scan --once --field ranges
Como verificar
- ✓O LiDAR começa a girar e ros2 topic hz /scan mostra uma taxa estável (perto de 10 Hz nos modelos citados; confira a ficha do seu).
- ✓O echo imprime uma lista de números; ponha a mão perto do sensor e os valores daquele lado caem.
- ✗"Permission denied" na porta: o grupo dialout ainda não valeu; saia da sessão. Erro de launch inexistente: use o nome que o ls mostrou.
🌱 Novo aqui?
Um frame (quadro de coordenadas) é um "ponto de vista" com origem e eixos próprios: o centro do robô (base_link), o próprio LiDAR (laser). O TF2, visto no módulo 4.2, guarda como um frame está posicionado em relação ao outro. Se o seu URDF já tem o link do LiDAR, o robot_state_publisher publica essa relação sozinho.
Por que aprender
Sensor novo no ROS 2 é sempre o mesmo roteiro: porta, permissão, driver, launch, tópico, frame. Depois de fazer com o LiDAR, você liga câmera de profundidade ou IMU pelo mesmo caminho.
Conceitos-chave
🗺️ SLAM explicado: mapa e posição ao mesmo tempo
Para desenhar o mapa, o robô precisa saber onde estava quando fez cada medida. Para saber onde está, ele precisa de um mapa. Esse "ovo e galinha" tem nome: SLAM, localização e mapeamento simultâneos. A saída é estimar as duas coisas juntas, corrigindo uma com a outra a cada nova volta do LiDAR.
🌱 Novo aqui?
Odometria é a posição calculada pelos giros das rodas (módulo 2.2). Ela tem deriva: pequenos erros se somam e, depois de alguns metros, o robô "acha" que está longe de onde está. Casamento de varreduras (scan matching) é encaixar a volta nova do LiDAR sobre as anteriores, como peças de quebra-cabeça, para corrigir essa deriva. Fechamento de laço (loop closure) é reconhecer "já passei aqui" e distribuir o erro acumulado por todo o caminho.
Como ler: o laço âmbar (prever, encaixar, corrigir) roda o tempo todo. O quadro ciano tracejado só acontece de vez em quando, quando o robô volta a um lugar conhecido; é ele que impede o corredor de "entortar" no mapa final.
No ROS 2, o pacote padrão para SLAM com LiDAR 2D é o slam_toolbox. Ele guarda as posições do robô como nós de um grafo e as varreduras presas a eles; quando fecha um laço, reajusta o grafo inteiro. O resultado sai no tópico /map e na transformação map → odom, que é exatamente a correção da deriva. Tutoriais antigos citam pacotes do ROS 1; no ROS 2 use o slam_toolbox. O Cartographer também existe, mas é menos mantido.
| Fonte | Bom em | Fraco em |
|---|---|---|
| Odometria (rodas) | curto prazo, suave, rápida | deriva; patina em tapete |
| LiDAR (encaixe) | corrige a deriva com paredes | corredor liso e igual, vidro |
| Fechamento de laço | endireita o mapa inteiro | só se você voltar a um lugar visto |
Por que aprender
Quando o mapa sair torto ou "duplicado", você vai saber onde olhar: odometria ruim, varredura pobre ou laço que não fechou. Sem esse modelo mental, a única saída é mexer em parâmetros no escuro.
Conceitos-chave
🖥️ slam_toolbox na simulação
Antes de levar o robô para a sala, mapeie um mundo simulado. Você tem duas opções: o seu robô do módulo 4.2 no Gazebo (Harmonic com Jazzy, Jetty com Lyrical), desde que ele tenha um LiDAR simulado publicando /scan; ou o TurtleBot simulado que vem com os exemplos do Nav2, sem montar nada. O slam_toolbox não sabe a diferença: ele só quer /scan, a odometria e o TF.
Objetivo: instalar os pacotes, abrir o TurtleBot num mundo simulado com SLAM ligado e dirigir com o teclado até o mapa aparecer. Os nomes dos launch files de simulação mudam entre distros: confira na página "Getting Started" de docs.nav2.org.
# instalar SLAM, Nav2 e os robôs de exemplo (troque <distro> por jazzy ou lyrical)
sudo apt update
sudo apt install ros-<distro>-slam-toolbox ros-<distro>-navigation2 ros-<distro>-nav2-bringup
sudo apt install ros-<distro>-nav2-minimal-tb* # TurtleBot simulado (confira o nome na doc)
# terminal 1: TurtleBot no Gazebo + RViz2 já com o slam_toolbox ligado
source /opt/ros/<distro>/setup.bash
ros2 launch nav2_bringup tb4_simulation_launch.py slam:=True headless:=False
# terminal 2: dirigir com o teclado (teclas i, j, l, vírgula)
source /opt/ros/<distro>/setup.bash
ros2 run teleop_twist_keyboard teleop_twist_keyboard
Como verificar
- ✓O Gazebo abre com o robô; o RViz2 mostra os pontos do LiDAR e um mapa cinza que cresce enquanto você dirige.
- ✓ros2 topic list mostra /map, /scan e /odom.
- ✗"Package not found" no launch? Seu Nav2 pode usar tb3_simulation_launch.py; liste $(ros2 pkg prefix nav2_bringup)/share/nav2_bringup/launch.
Com o seu próprio robô simulado (ou real), o slam_toolbox sobe sozinho. O modo online_async processa as varreduras "o mais rápido que der", pulando algumas se o computador estiver ocupado; é o indicado para começar e para o Raspberry Pi 5.
# com o seu robô já publicando /scan, /odom e o TF (simulado: use_sim_time:=true)
source /opt/ros/<distro>/setup.bash
ros2 launch slam_toolbox online_async_launch.py use_sim_time:=true
# conferir a árvore de frames: map -> odom -> base_link -> laser
ros2 run tf2_tools view_frames
Como verificar: o view_frames gera um PDF com a árvore de frames; ela precisa ter map no topo, depois odom, base_link e o frame do LiDAR. No robô real, troque para use_sim_time:=false.
💡 use_sim_time: a armadilha nº 1
Na simulação, o relógio é o do Gazebo (tópico /clock). Se um nó usar o relógio do PC e outro o do simulador, as mensagens parecem "do futuro" ou "velhas demais" e o TF reclama. Regra: na simulação, use_sim_time:=true em todos os nós; no robô real, false em todos.
Por que aprender
Na simulação você erra de graça: bate na parede, refaz o mapa, troca parâmetro, sem bateria e sem móvel arranhado. Quando passar para o robô real, só o que muda são as fontes de /scan e /odom.
Conceitos-chave
🏠 Mapear sua casa ou sala de aula
Mapear um lugar real é mais "jeito de dirigir" do que código. O slam_toolbox faz a matemática; você decide o caminho, a velocidade e se volta aos lugares já vistos. Um mapa bom sai de um passeio lento, com curvas suaves, passando duas vezes pelos mesmos pontos de referência. Nesta etapa o robô ainda é dirigido por você (teleop): a navegação sozinha vem no módulo 4.5.
Roteiro de um mapeamento
Prepare o ambiente
Portas na posição em que vão ficar, fios e brinquedos fora do chão, pessoas e animais avisados. Feche ou bloqueie o acesso a escadas.
Comece num canto com paredes
O ponto de partida vira a origem do mapa. Um lugar com quinas dá ao slam_toolbox referências firmes logo na primeira volta.
Dirija devagar e gire devagar
No teleop, reduza a velocidade (tecla z) até uns 0,1–0,2 m/s. Giro rápido é o que mais borra o mapa: as rodas patinam e a odometria erra.
Feche laços
Dê a volta num cômodo e termine onde começou; passe de novo pelo corredor. Observe no RViz2 o mapa "se endireitar" quando o laço fecha.
Salve antes de desligar
Com o mapa bom na tela, salve (tópico 6). Se desligar o slam_toolbox antes, o mapa se perde.
✓ Faça
- ✓Monte o LiDAR no ponto mais alto e livre do robô, sem fios cruzando o feixe.
- ✓Cubra porta de vidro ou espelho com papel na hora de mapear.
- ✓Fique sempre ao alcance do robô e da chave de desligar dos motores.
✗ Não faça
- ✗Mapear com gente andando em volta: pernas viram "paredes" no mapa.
- ✗Deixar o robô perto de escada que desce: o LiDAR 2D não vê o degrau.
- ✗Mapear um salão enorme e vazio: sem paredes ao alcance, não há o que encaixar.
🌱 Novo aqui?
Sem o robô real ainda? Dá para fazer este roteiro inteiro na simulação do tópico 4, inclusive em sala de aula com um projetor: um aluno dirige, a turma observa o mapa e aponta onde o laço fechou. O Gazebo também deixa você montar um mundo parecido com a sua sala, com caixas no lugar dos móveis.
Por que aprender
O mapa é a base de tudo que vem depois: se ele tiver paredes duplicadas ou buracos, o Nav2 vai planejar caminhos que atravessam paredes ou recusar caminhos que existem. Dez minutos de mapeamento cuidadoso poupam horas de ajuste de navegação.
Conceitos-chave
💾 Salvar e carregar mapas
O mapa que o slam_toolbox publica é um mapa de ocupação: o chão dividido em quadradinhos (células) de alguns centímetros, cada um marcado como livre, ocupado ou desconhecido. Salvar esse mapa gera dois arquivos: uma imagem .pgm (a "foto" das células) e um .yaml que diz o tamanho de cada célula e onde fica a origem.
Como ler: cada quadradinho é uma célula do mapa. Cinza é onde o LiDAR nunca chegou; branco é chão livre; preto é parede ou móvel. O quadrado preto no meio é um obstáculo isolado, como um armário. Com células de 5 cm, uma sala de 5 m × 4 m vira uma imagem de 100 × 80 pixels.
Objetivo: salvar o mapa atual em ~/mapas, conferir o arquivo de configuração e abrir o mapa salvo de novo para usar no Nav2.
# com o slam_toolbox AINDA rodando e o mapa na tela
source /opt/ros/<distro>/setup.bash
mkdir -p ~/mapas && cd ~/mapas
ros2 run nav2_map_server map_saver_cli -f mapa
# confira os dois arquivos gerados
ls -l mapa.pgm mapa.yaml
cat mapa.yaml
# mais tarde, para navegar no mapa salvo (módulo 4.5)
ros2 launch nav2_bringup bringup_launch.py map:=$HOME/mapas/mapa.yaml
Como verificar
- ✓O terminal termina com uma mensagem de mapa salvo e aparecem mapa.pgm e mapa.yaml.
- ✓O mapa.yaml tem linhas como image: mapa.pgm, resolution: 0.05 e origin: [x, y, ângulo].
- ✓Abrindo o .pgm num editor de imagem você vê a planta do lugar em branco, preto e cinza.
- ✗"Failed to receive map"? O slam_toolbox foi fechado ou o tópico /map não existe; confira com ros2 topic list.
💡 Dois jeitos de salvar
O map_saver_cli salva a imagem que o Nav2 usa para navegar. O slam_toolbox também sabe salvar o próprio grafo (botão "Serialize Map" no painel SlamToolboxPlugin do RViz2): com ele você continua o mapeamento outro dia ou usa o modo de localização do próprio slam_toolbox. Guarde os dois; o PGM você pode até retocar num editor de imagem (pintar de preto uma área proibida).
Por que aprender
Mapear de novo a cada vez que liga o robô é lento e instável. Com o mapa salvo, o robô liga, se localiza e já pode navegar, que é exatamente o que o Nav2 espera no próximo módulo.
Conceitos-chave
✅ Resumo do módulo
Para ir além
- slam_toolbox (GitHub) — modos, parâmetros e o plugin do RViz2
- Nav2: Getting Started — instalação e simulação do TurtleBot na sua distro
- Nav2: navegar enquanto mapeia — SLAM com o Nav2 ligado
- Documentação do ROS 2 — troque lyrical por jazzy na URL se for a sua distro
- rplidar_ros e ldlidar_stl_ros2 — drivers dos LiDARs citados
Próximo módulo
4.5 · Navegação com Nav2: o robô se localiza no mapa salvo e vai sozinho até onde você mandar.