Bem-vindo a este tutorial sobre o ORB-SLAM 3, uma poderosa ferramenta para mapeamento 3D e localização. Se você se interessa por visão computacional, robótica, ou simplesmente deseja aprender mais sobre os últimos avanços na tecnologia SLAM, então você está no lugar certo.
ORB-SLAM 3 é um sistema SLAM de última geração que se baseia no sucesso de seus predecessores, ORB-SLAM e ORB-SLAM 2. Ele usa uma combinação de métodos baseados em características e diretos para alcançar desempenho em tempo real em uma variedade de plataformas. Neste tutorial, guiaremos você no processo passo a passo de implementação do ORB-SLAM 3, desde a instalação até a execução do sistema com seus próprios dados. Então, vamos começar!
Aplicações de Localização e Mapeamento Simultâneos (SLAM)
SLAM, ou Simultaneous Localization and Mapping, é um problema fundamental em visão computacional que envolve construir um mapa de um ambiente desconhecido enquanto rastreia simultaneamente a posição dentro desse ambiente. Este é um problema desafiador que requer uma combinação de fusão de sensores, otimização e técnicas de aprendizado de máquina.
SLAM tem uma ampla gama de aplicações em robótica, visão computacional e realidade aumentada. Uma das aplicações mais comuns do SLAM é em veículos autônomos, onde é usado para construir um mapa do ambiente e localizar o veículo dentro desse mapa. Na prática, isso permite que o veículo navegue de forma autônoma sem intervenção humana.
Outra aplicação importante é na área da robótica, onde é usado para construir mapas de ambientes desconhecidos e permitir que robôs naveguem por eles. Isso é particularmente útil em cenários onde a intervenção humana não é possível ou desejável, como missões de busca e resgate ou ambientes perigosos.
SLAM também é utilizado no campo da realidade aumentada, onde é usado para rastrear a posição do dispositivo do usuário em tempo real e sobrepor objetos virtuais no mundo real. Isso permite experiências imersivas e interativas que mesclam os mundos digital e físico.
Além dessas aplicações, o SLAM possui uma ampla gama de outros usos, incluindo nos campos da agricultura, construção e arqueologia. À medida que esta tecnologia continua avançando, podemos esperar ver ainda mais aplicações inovadoras no futuro.
O que é ORB-SLAM?
ORB-SLAM é um sistema SLAM (Simultaneous Localization and Mapping) de última geração que usa uma combinação de métodos baseados em características e diretos para alcançar desempenho em tempo real em uma variedade de plataformas. Foi desenvolvido por pesquisadores da Universidade de Zaragoza, Espanha, e agora é amplamente utilizado tanto na academia quanto na indústria.
O nome ORB-SLAM vem do fato de que ele utiliza recursos Oriented FAST e Rotated BRIEF (ORB) para detectar e combinar pontos-chave nas imagens. Essas características são combinadas com outras técnicas, como fechamento de loop e otimização de pose, para alcançar localização e mapeamento robustos e precisos.
Uma das principais vantagens do ORB-SLAM é sua capacidade de funcionar em tempo real em uma variedade de plataformas, incluindo laptops, dispositivos móveis e até drones. Isso o torna uma ferramenta versátil para uma ampla gama de aplicações, desde veículos autônomos até realidade aumentada.
No geral, ORB-SLAM é um sistema SLAM poderoso e flexível que se tornou uma escolha popular para pesquisadores e profissionais. Sua combinação de métodos baseados em características e diretos, juntamente com seu desempenho em tempo real e flexibilidade de plataforma, tornam-no uma ferramenta valiosa para qualquer pessoa que trabalhe na área de visão computacional ou robótica.
Configurando uma máquina virtual com ORB-SLAM 3
Provavelmente todo entusiasta que se aventurou a tentar instalar qualquer uma das versões ORB-SLAM a partir das instruções no repositório GitHub acabou frustrado após horas ou dias tentando construir e instalar todas as dependências. A verdade é que, como se trata de um projeto de pesquisa no limite do conhecimento e recente, ele exige versões específicas de suas dependências para serem instaladas. Isso também se aplica ao sistema operacional que deve ser usado.
No meu caso específico, eu tenho um MacBook Pro (chip Intel) e tive que criar uma máquina virtual com Ubuntu. Mesmo assim, tive que testar três versões diferentes para encontrar uma em que eu pudesse compilar e executar com sucesso em um conjunto de dados de teste.
Se você procurar por aí, encontrará instruções que afirmam ser possível compilar no macOS ou no Ubuntu 20.04. No entanto, basta dar uma olhada nos problemas abertos ou até mesmo nas solicitações de mesclagem para ver que não é tão simples assim. Após várias tentativas (e xícaras de café), graças a um fork do repositório oficial, consegui encontrar uma sequência que funcionou sem erros. E é isso que vou ensinar abaixo.
A versão com a qual tive sucesso foi o Ubuntu 18.04. Usaremos uma versão recém-instalada a partir desta imagem. Se você deseja usar outra versão, devo avisar que provavelmente não funcionará de imediato e você terá que adaptar as etapas.
Construindo a biblioteca ORB-SLAM3 e exemplos
Nesta seção, forneceremos um guia passo a passo para implementar o ORB-SLAM 3, desde a instalação até a execução do sistema em seus próprios dados. Cobriremos tudo o que você precisa saber para começar com o ORB-SLAM 3, incluindo como instalar as dependências necessárias, como construir o sistema a partir do código-fonte e como executar o sistema em seus próprios dados.
Atenção! Muitas vezes executaremos o comando git checkout
para selecionar commits específicos das dependências, bem como modificar arquivos antes de construir e instalar o ORB-SLAM3.
$ sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" $ sudo apt update $ sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev $ sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev libjasper-dev $ libglew-dev libboost-all-dev libssl-dev libeigen3-dev
Este bloco de código específico ilustra a instalação das dependências necessárias para construir e executar o ORB-SLAM 3. A primeira linha adiciona o repositório de segurança Ubuntu Xenial à lista de repositórios, que contém os pacotes necessários para construir e executar o ORB-SLAM 3. A segunda linha atualiza a lista de pacotes para incluir o repositório recém-adicionado. A terceira linha instala as dependências necessárias, incluindo ferramentas de construção, bibliotecas para processamento de imagem e vídeo e as bibliotecas Boost C++.
$ cd ~ $ mkdir Dev && cd Dev $ git clone https://github.com/opencv/opencv.git $ cd opencv $ git checkout 3.2.0
Aqui, temos um segmento de código que ilustra como baixar e instalar o OpenCV 3.2.0. Os dois primeiros comandos alteram o diretório atual para o diretório inicial do usuário e criam um novo diretório chamado Dev
no diretório inicial do usuário, mudando o diretório atual para esse diretório. O terceiro comando clona o repositório OpenCV do GitHub para o diretório atual. O quarto comando verifica uma versão específica da biblioteca, necessária para construir e executar o ORB-SLAM 3. Essa versão foi a única que realmente funcionou para mim.
$ gedit ./modules/videoio/src/cap_ffmpeg_impl.hpp
Como demonstrado no bloco de código acima, este comando abre o arquivo “cap_ffmpeg_impl.hpp” no módulo videoio
do código-fonte do OpenCV usando o editor de texto Gedit. Este arquivo contém a implementação da funcionalidade de captura de vídeo baseada em FFmpeg usada pelo ORB-SLAM 3. Modificaremos isso para habilitar o suporte à codificação de vídeo H.264, necessária para processar dados de vídeo de muitas câmeras modernas. As modificações envolvem adicionar essas poucas linhas de código no cabeçalho do arquivo:
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22) #define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER #define AVFMT_RAWPICTURE 0x0020
Essas linhas de código definem três constantes usadas para modificar a funcionalidade de captura de vídeo baseada em FFmpeg. A primeira constante, AV_CODEC_FLAG_GLOBAL_HEADER
, é uma sinalização que indica que o codec deve gerar um cabeçalho global. A segunda constante, CODEC_FLAG_GLOBAL_HEADER
, é um alias para a primeira constante. A terceira constante, AVFMT_RAWPICTURE
, é uma sinalização que indica que o formato utiliza dados brutos de imagem.
$ mkdir build $ cd build $ cmake -D CMAKE_BUILD_TYPE=Release -D WITH_CUDA=OFF -D CMAKE_INSTALL_PREFIX=/usr/local .. $ make -j 3 $ sudo make install
Depois de selecionar a versão correta e alterar o arquivo, o trecho de código acima mostra como construir e instalar o OpenCV 3.2.0 no seu sistema. O primeiro comando cria um novo diretório chamado “build” e altera o diretório atual para esse diretório. O terceiro comando configura a compilação usando o CMake com opções específicas, incluindo a definição do tipo de compilação para “Release”, desativando o uso do CUDA e especificando o prefixo de instalação. O quarto comando compila o código usando três threads. O quinto comando instala o OpenCV compilado no seu sistema.
$ cd ~/Dev $ git clone https://github.com/stevenlovegrove/Pangolin.git $ cd Pangolin $ git checkout 86eb4975fc4fc8b5d92148c2e370045ae9bf9f5d $ mkdir build $ cd build $ cmake .. -DCMAKE_BUILD_TYPE=Release $ make -j 3 $ sudo make install
O trecho de código acima demonstra como construir e instalar a biblioteca Pangolin, que é uma biblioteca C++ leve para exibir gráficos e imagens 3D. Voltando do diretório atual para o diretório “Dev” no diretório inicial do usuário, clonamos o repositório Pangolin do GitHub no diretório atual e verificamos um commit específico do código. Os comandos seguintes criam um novo diretório chamado “build”, alteram o diretório atual para esse diretório, executam o CMake, compilam o código usando três threads e instalam o código compilado no seu sistema.
$ cd ~/Dev $ git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git $ cd ORB_SLAM3 $ git checkout ef9784101fbd28506b52f233315541ef8ba7af57
O momento que todos esperávamos! Os comandos acima clonam o repositório ORB-SLAM 3 do GitHub e verificam um commit específico do código que funcionou para mim. O primeiro comando muda o diretório atual para o diretório “Dev” no diretório inicial do usuário. O segundo comando clona o repositório ORB-SLAM 3 do GitHub no diretório atual. O terceiro comando muda o diretório atual para o repositório ORB-SLAM 3 recém-clonado.
$ gedit ./include/LoopClosing.h
Neste bloco de código, podemos ver que o comando gedit
é usado para abrir o arquivo “LoopClosing.h“. Este arquivo contém a implementação da funcionalidade de fechamento de loop, que é responsável por detectar e corrigir fechamentos de loop no sistema SLAM e precisa ser modificado. No arquivo ./include/LoopClosing.h (na linha 51) altere a linha de:
Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;
to:
Eigen::aligned_allocator<std::pair<KeyFrame *const, g2o::Sim3> > > KeyFrameAndPose;
Este ajuste garante uma compilação bem-sucedida. Após esta mudança, podemos compilar o ORB-SLAM3 e suas dependências, como DBoW2 e g2o.
$ ./build.sh
Vamos explorar este pedaço de código e entender o que está acontecendo. Este comando executa o script “build.sh”, que é um script de shell que constrói e instala o ORB-SLAM 3 em seu sistema. O script executa vários comandos, incluindo a construção e instalação de algumas dependências de terceiros.
Na verdade, eu li que pode não funcionar na primeira tentativa, e pode ser necessário executar $ ./build.sh
uma ou duas vezes mais (eu não precisei).
Obtendo o Conjunto de Dados EuRoc para Teste
Para testar o sistema ORB-SLAM 3, precisamos de um conjunto de dados de imagens e poses de câmera do mundo real. Nesta seção, vamos baixar e preparar o conjunto de dados EuRoc, que é um conjunto de dados popular para testar sistemas de SLAM visual.
cd ~ mkdir -p Datasets/EuRoc cd Datasets/EuRoc/ wget -c http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_hall/MH_01_easy/MH_01_easy.zip mkdir MH01 unzip MH_01_easy.zip -d MH01/
Aqui, temos um segmento de código que ilustra como baixar e preparar o conjunto de dados EuRoc para testar o ORB-SLAM 3. O primeiro comando altera o diretório atual para o diretório inicial do usuário. O segundo comando cria um novo diretório chamado “Datasets/EuRoc” no diretório inicial do usuário. O terceiro comando altera o diretório atual para o diretório recém-criado “Datasets/EuRoc”. O quarto comando baixa o arquivo “MH01easy.zip” do site do conjunto de dados EuRoc. O quinto comando cria um novo diretório chamado “MH01” no diretório atual. O sexto comando descompacta o arquivo baixado no diretório recém-criado “MH01”. Este segmento de código é necessário para obter e preparar o conjunto de dados EuRoc para testar o ORB-SLAM 3.
$ cd ~/Dev/ORB_SLAM3 $ ./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml ~/Datasets/EuRoc/MH01 ./
Como podemos ver no código acima, este comando executa o sistema ORB-SLAM 3 no conjunto de dados EuRoc. O primeiro comando altera o diretório atual para o diretório da base de código ORB-SLAM 3. O segundo comando executa o exemplo “mono_euroc”, que é um sistema de SLAM visual monocular projetado para funcionar com o conjunto de dados EuRoc. O terceiro comando especifica o caminho para o arquivo de vocabulário ORB. O quarto comando especifica o caminho para o arquivo de configuração do conjunto de dados EuRoc. O quinto comando especifica o caminho para o diretório do conjunto de dados EuRoc. O sexto comando especifica o caminho para o diretório de saída. Este comando é necessário para testar o sistema ORB-SLAM 3 no conjunto de dados EuRoc.
Resultados e Conclusão
O ORB-SLAM 3 oferece resultados técnicos notáveis, fornecendo uma solução abrangente para o problema SLAM. Em nosso caso, durante o processo de execução, a biblioteca exibe uma janela que mostra a sequência de imagens do conjunto de dados EuRoc e rastreia as características em tempo real. Essas características, também conhecidas como pontos de interesse, são representadas por pequenos rastreadores verdes que se movem com a cena conforme a câmera se move.
Além disso, o ORB-SLAM 3 cria uma nuvem de pontos 3D que representa o mapa do ambiente. Essa nuvem de pontos é gerada a partir das características extraídas das imagens e permite a visualização e análise do espaço mapeado. Embora o ORB-SLAM 3 não gere diretamente uma malha 3D a partir dessa nuvem de pontos, as informações obtidas podem ser facilmente exportadas e processadas por outras ferramentas para criar uma malha tridimensional do ambiente.
Outro recurso importante é a capacidade de visualizar a trajetória estimada da câmera em tempo real. O ORB-SLAM3 fornece uma janela separada que exibe a trajetória da câmera e o mapa de covisibilidade dos quadros-chave, permitindo ao usuário acompanhar o progresso do algoritmo e avaliar a precisão da localização em relação ao ambiente.
Em resumo, o ORB-SLAM3 oferece uma solução robusta e precisa de SLAM visual e visual-inercial, fornecendo informações valiosas sobre o ambiente e o movimento do sensor. A biblioteca exibe características rastreadas, gera uma nuvem de pontos 3D e permite a visualização da trajetória da câmera, facilitando a análise e aplicação desses dados em diversos contextos e projetos.