SLAM
O Que é SLAM (e Por Que É Difícil)
SLAM (Localização e Mapeamento Simultâneos (Simultaneous Localization and Mapping)) é o problema de construir um mapa de um ambiente desconhecido enquanto se estima a localização do robô dentro desse mapa. Ele está no coração de muitos sistemas robóticos porque uma localização precisa é necessária para navegar, e um bom mapa muitas vezes é necessário para localizar.
SLAM é importante em diversos domínios:
- Robôs aspiradores: mantêm uma planta do ambiente enquanto rastreiam onde estão.
- Realidade aumentada/realidade virtual (AR/VR): rastreiam a pose (pose) de um headset enquanto constroem um modelo esparso/denso do cômodo (frequentemente chamado de rastreamento de dentro para fora (inside-out tracking)).
- Drones e robôs móveis: navegam em ambientes sem GPS, como armazéns ou florestas.
- Direção autônoma: localizam-se com precisão em relação a um mapa prévio (às vezes o “mapeamento” é feito offline, enquanto o carro realiza a localização online).
SLAM é difícil porque acopla dois processos incertos:
- Movimento (odometria (odometry)): para onde você acha que foi, frequentemente acumulando deriva ao longo do tempo.
- Percepção (medições de sensor (sensor measurements)): o que você acha que viu, frequentemente ruidoso e ambíguo.
Os erros se acumulam: uma pequena deriva de rotação pode causar grande distorção no mapa; uma decisão errada de “este marco é aquele marco” pode corromper toda a estimativa.
SLAM é um componente central no pipeline mais amplo de Percepção → Planejamento → Controle: ele produz estimativas de estado (state estimates) e mapas dos quais módulos posteriores (como Planejamento de Movimento (Motion Planning) e Controle (Control)) dependem.
A Formulação Probabilística
A maior parte do SLAM moderno é formulada como inferência probabilística (probabilistic inference) sobre:
- Poses do robô ao longo do tempo: (x_{1:T})
- Um mapa: (m) (pode ser marcos (landmarks), uma grade de ocupação (occupancy grid), uma nuvem de pontos (point cloud) etc.)
- Controles (integração de odometria/IMU): (u_{1:T})
- Observações (características (features) de câmera/LiDAR, casamento de varreduras (scan matches) etc.): (z_{1:T})
Um objetivo canônico de SLAM é estimar:
[ p(x_{1:T}, m \mid z_{1:T}, u_{1:T}) ]
Dois pontos de vista intimamente relacionados dominam:
Visão de filtragem (filtering view) (online)
Estimar apenas o estado atual (e às vezes o mapa) de forma sequencial:
[ p(x_t, m \mid z_{1:t}, u_{1:t}) ]
Este é o domínio da Filtragem Bayesiana (Bayesian Filtering), incluindo a família do Filtro de Kalman (Kalman Filter) e filtros de partículas.
Visão de suavização / otimização em grafos (smoothing / graph optimization view) (em lote ou incremental)
Estimar todas as poses (e às vezes marcos) conjuntamente:
[ \arg\max_{x_{1:T}, m} ; p(x_{1:T}, m \mid z_{1:T}, u_{1:T}) ]
Isso é tipicamente resolvido como mínimos quadrados não lineares em um grafo de fatores (factor graph) (grafo de poses (pose graph), ajuste de feixe (bundle adjustment) etc.), usando Gauss–Newton ou Levenberg–Marquardt.
Na prática, a maioria dos “sistemas de SLAM” implementa:
- Um módulo de entrada (front-end) que transforma dados brutos de sensores em restrições (por exemplo, correspondências de características, casamento de varreduras, pré-integração de IMU)
- Um módulo de retaguarda (back-end) que resolve o problema global de inferência/otimização de forma robusta
Sensores e Modelos: Quais Restrições Você Obtém
A escolha de sensores molda fortemente o algoritmo e os tradeoffs.
Sensores comuns
- Odometria de rodas: barata, mas deriva; falha com escorregamento.
- IMU (Unidade de Medição Inercial) (Inertial Measurement Unit): boa para rotação/aceleração no curto prazo; deriva de bias; precisa de fusão.
- Câmera monocular: rica em características, barata; mas a escala é não observável sem informação extra.
- Estéreo / RGB-D: fornece profundidade métrica; maior complexidade de hardware.
- LiDAR 2D: excelente para mapas internos planares; tem dificuldade com estruturas 3D.
- LiDAR 3D: geometria robusta; caro e pesado em computação; se destaca ao ar livre.
Modelos de movimento e medição
Um sistema de SLAM precisa de:
- Um modelo de movimento: como controles/IMU implicam mudanças de pose (com incerteza).
- Um modelo de medição: como o mapa e a pose predizem as observações do sensor.
Incompatibilidade de modelo é um grande ponto de dor prático: por exemplo, assumir ruído Gaussiano quando você tem outliers de cauda pesada (objetos dinâmicos, correspondências ruins).
Representações de Mapa (e Seus Tradeoffs)
Não existe um único “mapa”. Sistemas de SLAM escolhem representações com base em memória, computação e necessidades a jusante.
Mapas de marcos (landmark maps) (esparsos)
Armazenam características/marcos discretos (por exemplo, pontos-chave ORB, AprilTags).
- Prós: compactos; otimização eficiente; bons para localização
- Contras: não são diretamente úteis para desvio de obstáculos a menos que combinados com outro tipo de mapeamento
Grades de ocupação (occupancy grids) (2D/3D)
Discretizam o espaço em células com probabilidades de ocupação.
- Prós: intuitivas; ótimas para navegação; integram bem com planejamento
- Contras: pesadas em memória em 3D; tradeoffs de resolução; ambientes dinâmicos complicam as atualizações
Geometria densa (dense geometry) (nuvens de pontos, surfels, TSDF)
- Nuvens de pontos: fáceis de acumular; podem ser ruidosas.
- Surfels (elementos de superfície (surfels)): elementos de superfície com normais; bons para rastreamento denso.
- TSDF (função de distância assinada truncada (Truncated Signed Distance Function)): popular para reconstrução RGB-D.
O mapeamento denso permite reconstrução de alta fidelidade, mas aumenta custos de computação e memória.
Mapas semânticos (semantic maps)
Anexam rótulos (paredes, portas, carros) à geometria.
- Prós: melhor robustez de longo prazo e planejamento; suporta raciocínio de tarefas
- Contras: depende de modelos de percepção; pode falhar sob mudança de domínio (domain shift) (Sim2Real (Sim2Real))
Famílias de Algoritmos Principais
EKF-SLAM (baseado em filtro)
EKF-SLAM mantém uma crença Gaussiana sobre a pose do robô e os marcos.
- Força: propagação de incerteza fundamentada; historicamente influente
- Fraqueza: a covariância é densa; a escalabilidade é ruim ((O(n^2)) de memória, (O(n^3)) de atualização em formas ingênuas); a linearização pode ser frágil
Métodos no estilo EKF ainda aparecem em configurações especializadas, especialmente quando a dimensão do estado é controlada (por exemplo, estimação IMU-câmera fortemente acoplada com número limitado de marcos).
SLAM com filtro de partículas (particle filter SLAM) (por exemplo, FastSLAM)
Filtros de partículas representam incerteza com amostras sobre trajetórias (ou poses), frequentemente com estimativas de marcos por partícula.
- Força: consegue representar multimodalidade (útil em ambientes ambíguos)
- Fraqueza: depleção de partículas em altas dimensões; pode ser caro para trajetórias longas
Filtros de partículas continuam comuns em variantes de localização e mapeamento com LiDAR 2D, especialmente quando a computação permite um número suficiente de partículas.
SLAM baseado em grafos (graph-based SLAM) (padrão moderno)
A maioria dos sistemas de SLAM estado da arte hoje usa otimização em grafos (graph optimization):
- Nós: poses do robô (e às vezes marcos)
- Fatores/arestas: restrições de odometria, casamento de varreduras, observações de características, fechamento de laço, pré-integração de IMU
A otimização tipicamente minimiza uma soma de resíduos quadráticos:
[ \min_{\Theta} \sum_i | r_i(\Theta) |_{\Sigma_i}^{2} ]
onde (\Theta) contém poses (e opcionalmente marcos), e (\Sigma_i) são covariâncias de medição.
Benefícios principais:
- Melhor escalabilidade via álgebra linear esparsa
- Suporta naturalmente restrições de fechamento de laço
- Mais fácil incorporar múltiplos sensores
- Pode rodar incrementalmente (por exemplo, atualizações no estilo iSAM)
SLAM baseado em grafos é intimamente relacionado ao ajuste de feixe em visão e frequentemente é implementado com solucionadores como Ceres ou GTSAM (veja Descida do Gradiente (Gradient Descent) para intuição de otimização; solucionadores práticos usam métodos de segunda ordem).
SLAM Visual: Baseado em Características vs Direto
Baseado em características (por exemplo, pipelines no estilo ORB)
Pipeline:
- Detectar pontos-chave (tipo ORB/SIFT)
- Casar descritores entre quadros
- Estimar pose relativa (por exemplo, PnP / matriz essencial)
- Adicionar quadros-chave e otimizar o grafo local/global
- Prós: robusto a algumas mudanças de iluminação; computação esparsa eficiente
- Contras: falha em cenas sem textura (paredes lisas), desfoque de movimento, mudanças fortes de iluminação
Métodos diretos (direct methods)
Usam intensidades de pixels diretamente (erro fotométrico), frequentemente com rastreamento semi-denso/denso.
- Prós: pode funcionar com baixa textura se houver estrutura de gradiente suficiente
- Contras: mais sensível a mudanças de exposição e rolling shutter; maior custo computacional; exige calibração cuidadosa
SLAM visual-inercial (visual-inertial SLAM) (VIO/VINS)
Fazer fusão de câmera + IMU traz melhorias significativas:
- A IMU estabiliza movimento rápido e fornece escala métrica (mesmo com câmeras monoculares).
- Exige calibração cuidadosa da IMU, sincronização temporal e modelagem de bias.
Muitos sistemas reais de AR são visual-inerciais por esse motivo.
SLAM com LiDAR: Geometria em Primeiro Lugar
SLAM com LiDAR tipicamente alinha varreduras para construir uma trajetória e um mapa consistentes.
Estratégias comuns:
- Alinhamento scan-to-scan para movimento incremental
- Alinhamento scan-to-map para reduzir deriva
- Métodos LiDAR baseados em características (bordas/planos) vs alinhamento denso no estilo ICP
SLAM com LiDAR costuma ser mais robusto do que visão pura em baixa iluminação, mas pode ter dificuldades com:
- Geometria pobre em características (túneis longos, campos abertos)
- Cenas dinâmicas (tráfego)
- Alta demanda computacional para mapas em grande escala
Associação de Dados e Fechamento de Laço
Associação de dados (data association)
Associação de dados responde: esta observação é a mesma coisa que eu vi antes?
Más associações são catastróficas. Sistemas práticos se apoiam em:
- Gating geométrico (rejeitar correspondências que violam restrições epipolares/ICP)
- Estimadores robustos (RANSAC, M-estimadores como Huber/Cauchy)
- Consistência temporal (rastrear características ao longo de múltiplos quadros)
Fechamento de laço (loop closure)
Fechamento de laço detecta o retorno a um lugar previamente visitado e adiciona restrições que “puxam” a trajetória de volta à consistência.
Pipeline típico de fechamento de laço:
- Reconhecimento de lugar (place recognition) (recuperação de candidatos)
- Verificação geométrica (garantir que não é um falso positivo)
- Adicionar um fator de restrição de laço
- Otimização global para distribuir a correção
Reconhecimento de lugar frequentemente usa:
- Bag-of-words (bag-of-words) sobre descritores locais (clássico)
- Descritores globais aprendidos via embeddings de Redes Neurais Convolucionais (Convolutional Neural Networks) ou Arquitetura Transformer (Transformer Architecture) (moderno)
- Técnicas robustas a múltiplas sessões para mudanças de longo prazo (iluminação, estações)
Falsos fechamentos de laço são perigosos; sistemas frequentemente exigem verificação forte e podem manter fechamentos de laço “suaves” até confirmação.
Uma Arquitetura Prática de Sistema SLAM (com Tradeoffs)
A maioria dos sistemas de SLAM implantados pode ser resumida como:
- Rastreamento (tracking): estimar pose quadro a quadro (rápido, local)
- Mapeamento (mapping): atualizar a representação local do mapa
- Fechamento de laço: detectar revisitas (mais lento, global)
- Otimização (optimization): refinar poses/mapa (em segundo plano ou incremental)
Aqui está um pseudocódigo simplificado:
state = initialize()
graph = FactorGraph()
for each time t:
z_t = read_sensors()
u_t = read_odometry_or_imu()
# Front-end: local estimation
x_pred = predict(state.x, u_t)
matches = associate(z_t, state.local_map)
x_t = estimate_pose(x_pred, matches) # e.g., PnP / ICP
# Add factors to the graph
graph.add_odometry_factor(t-1, t, u_t)
graph.add_measurement_factors(t, matches)
# Keyframe logic (tradeoff: accuracy vs compute)
if should_add_keyframe(x_t, z_t):
graph.add_keyframe(t)
candidates = place_recognition(z_t)
for c in candidates:
if geometric_verify(t, c):
graph.add_loop_factor(t, c)
# Back-end optimization (incremental or periodic)
if time_to_optimize():
state.trajectory = optimize(graph) # sparse nonlinear least squares
state.local_map = update_map(state.trajectory, measurements)
state.x = x_t
Tradeoffs-chave para projetar
1) Acurácia vs latência (restrições de tempo real)
- Janelas de otimização mais curtas e menos quadros-chave reduzem uso de CPU/GPU, mas aumentam deriva.
- Otimização global em segundo plano melhora a acurácia, mas pode criar “atualizações de mapa” que módulos a jusante precisam tratar de forma graciosa.
2) Mapeamento esparso vs denso
- Mapas esparsos são suficientes para localização e são leves.
- Mapas densos ajudam no desvio de obstáculos e na reconstrução, mas são caros e podem ser frágeis sob dinâmicas.
3) Robustez a outliers vs precisão
Rejeição agressiva de outliers evita falhas catastróficas, mas pode descartar restrições úteis. Funções de custo robustas e restrições comutáveis (switchable constraints) ajudam.
4) Ambientes dinâmicos
Pessoas, carros e móveis em movimento violam suposições de mundo estático. Mitigações:
- Segmentação de movimento / filtragem de objetos dinâmicos
- Mascaramento semântico (ignorar pixels de “pessoa/carro”)
- Resíduos robustos e fechamento de laço conservador
5) Geometria degenerada e observabilidade
Alguns movimentos/ambientes são fundamentalmente ambíguos:
- Corredores longos: restrições laterais fracas para LiDAR 2D
- Rotação pura com visão monocular: estimação de translação fraca
- Cenas planares: ambiguidade de profundidade
Bons sistemas detectam degenerescência e se adaptam (por exemplo, confiar mais na IMU, adiar atualizações de mapeamento).
6) Calibração e sincronização
SLAM prático pode falhar por problemas “sem graça”:
- Intrínsecos/extrínsecos de câmera incorretos
- Offset temporal IMU-câmera
- Distorção de rolling shutter
- Parâmetros de ruído mal modelados
Calibração frequentemente é a diferença entre uma demo de artigo e um produto confiável.
7) Relocalização e recuperação
Robôs reais perdem rastreamento. Um sistema de produção precisa de:
- Relocalização rápida em relação a um mapa (reconhecimento de lugar + estimação de pose)
- Comportamentos seguros de fallback (reduzir velocidade, parar, pedir ajuda) alinhados com Segurança em Robótica (Robotics Safety)
SLAM na Pilha de Robótica
As saídas de SLAM são consumidas por:
- Planejadores locais: precisam de estimativas de pose precisas em horizonte curto.
- Planejadores globais: precisam de mapas consistentes (grades de ocupação, mapas topológicos).
- Controladores: precisam de estimativas de estado de baixa latência.
Isso cria restrições de integração:
- Se o SLAM ocasionalmente “salta” após fechamento de laço, planejadores/controladores devem lidar com descontinuidades (por exemplo, suavizando ou operando em um referencial localmente consistente).
- Muitos sistemas mantêm tanto um referencial de odometria (odometry frame) (suave, com deriva) quanto um referencial do mapa (map frame) (globalmente consistente, pode saltar).
Aplicações e Exemplos Concretos
Robô aspirador (LiDAR 2D ou visão)
- Mapa: grade de ocupação 2D
- Deve lidar com: superfícies refletivas, cadeiras se movendo, passagens estreitas
- Tradeoff: acurácia moderada é aceitável; robustez e planejamento de cobertura importam mais
Robô de armazém
- Frequentemente usa SLAM com LiDAR ou localização em relação a um mapa prévio
- Precisa de: estabilidade de longo prazo, repetibilidade, operação multi-robô
- Forte ênfase na confiabilidade do fechamento de laço e na manutenção do mapa
Headset de AR (visual-inercial)
- Mapa: quadros-chave/marcos esparsos + às vezes uma malha
- Deve lidar com: movimento rápido da cabeça, desfoque de movimento, iluminação variável
- Restrições duras: baixa latência e rastreamento suave (conforto do usuário)
Direção autônoma
- Abordagem comum: construir mapas HD offline; fazer localização online (tipo SLAM baseado em mapa)
- Desafios: objetos dinâmicos, grande escala, conjuntos de sensores, restrições rigorosas de segurança
Componentes Baseados em Aprendizado (Onde ML Ajuda e Onde é Arriscado)
Embora o SLAM clássico não seja “aprendizado profundo por padrão”, aprendizado de máquina (machine learning) ajuda cada vez mais no módulo de entrada:
- Detecção/descrição de características: pontos-chave e descritores aprendidos podem melhorar o casamento em condições difíceis.
- Reconhecimento de lugar: embeddings globais de imagem para recuperar candidatos de fechamento de laço.
- Estimativa de profundidade: predição de profundidade monocular pode ajudar na inicialização, mas introduz priors aprendidos.
- Filtragem semântica: remover objetos dinâmicos usando redes de segmentação.
No entanto, o aprendizado introduz tradeoffs:
- Mudança de domínio (domain shift) e problemas de generalização (notavelmente em mudanças externas/sazonais), conectando-se a Sim2Real.
- Modos de falha mais difíceis de interpretar comparados a pipelines puramente geométricos.
- Requisitos de dados de treinamento e computação.
Um padrão pragmático é sistemas híbridos (hybrid systems): o aprendizado propõe hipóteses (correspondências, candidatos de laço, máscaras), enquanto geometria e otimização impõem consistência.
Avaliação: Como SLAM é Medido
Métricas comuns de trajetória:
- ATE (Erro Absoluto de Trajetória) (Absolute Trajectory Error): erro de alinhamento global em relação ao ground truth.
- RPE (Erro Relativo de Pose) (Relative Pose Error): deriva local em uma janela fixa de tempo/distância.
Métricas de qualidade do mapa dependem da representação:
- Acurácia de ocupação vs ground truth (quando disponível)
- Erro de reconstrução para 3D denso
- Precisão/recall de fechamento de laço (importante em execuções de grande escala)
Datasets/benchmarks amplamente usados incluem:
- KITTI (direção, variantes de visão/LiDAR)
- EuRoC MAV (visual-inercial)
- TUM RGB-D (ambientes internos com RGB-D)
- Variantes do Replica / ScanNet (para pesquisa em reconstrução densa)
Notas de Implementação e Ferramentas Comuns
Componentes open-source comuns (as escolhas dependem de sensores e objetivos):
- SLAM visual: família ORB-SLAM, RTAB-Map
- SLAM com LiDAR: Cartographer, métodos derivados de LOAM
- Módulos de otimização: GTSAM, Ceres Solver
- Bibliotecas de suporte: OpenCV, PCL
Considerações de engenharia que frequentemente dominam:
- Threading e escalonamento em tempo real
- Gerenciamento de memória para quadros-chave e mapas
- Logging/replay para depuração
- Determinismo e reprodutibilidade (importantes para validação de segurança)
Resumo: O Triângulo Central de Tradeoffs em SLAM
A maioria das decisões de projeto em SLAM vive dentro de um triângulo:
- Acurácia/Consistência (correção global, fechamentos de laço, baixa deriva)
- Robustez (resistência a outliers, recuperação, cenas dinâmicas)
- Computação/Latência (restrições de tempo real em hardware embarcado)
Um “bom” sistema de SLAM não é apenas um estimador inteligente — é um subsistema ponta a ponta, consciente de falhas, que se integra de forma limpa à pilha de robótica, suporta comportamentos de recuperação e corresponde ao ambiente e aos requisitos da tarefa.