O processo de instalação segue completamente o código de fonte aberto oficial. Não detalharemos os passos específicos de instalação:
GitHub - raulmur/ORB_SLAM2: SLAM em Tempo Real para Câmeras Monoculares, Estereoscópicas e RGB-D, com Detecção de Laço e Recomposição de Localização
II. Problemas Encontrados durante a Compilação
1. Erro de compilação: usleep não foi declarado neste escopo
Este erro é causado pela falta de arquivos de cabeçalho. Vários arquivos estão sem o cabeçalho necessário. Localize esses arquivos através das mensagens de erro e adicione:
#include <unistd.h>
2. Pangolin não pôde ser encontrado porque a dependência Eigen3 não foi encontrada
Este é um problema de versão do Pangolin. Não é necessário reinstalar o Pangolin e o Eigen. Modifique o CMakeLists.txt da seguinte forma: adicione NO_MODULE após find_package(Eigen3 REQUIRED)
find_package(Eigen3 REQUIRED NO_MODULE)
Em geral, não foram encontrados muitos problemas significativos.
III. Calibração da Câmera
Para executar o algoritmo ORB-SLAM2, são necessários os parâmetros calibrados da câmera. Realizei a calibração seguindo o método de um blogueiro e modifiquei o arquivo de parâmetros. Referências:
Usando câmera estérea OAK-D para mapeamento de nuvem de pontos com ORB-SLAM2
Implementação da instância estérea ORB-SLAM2 com câmera OAK-D
A seguir estão meus parâmetros de execução:
%YAML:1.0
#--------------------------------------------------------------------------------------------
# Parâmetros da Câmera. Ajuste conforme necessário!
#--------------------------------------------------------------------------------------------
# Parâmetros de calibração e distorção da câmera (OpenCV)
Camera.fx: 804.9215698242188
Camera.fy: 804.9215698242188
Camera.cx: 640.6663818359375
Camera.cy: 362.4100036621094
Camera.k1: 0
Camera.k2: 0
Camera.p1: 0
Camera.p2: 0
Camera.width: 1280
Camera.height: 720
# Quadros por segundo da câmera
Camera.fps: 20.0
# linha base estérea vezes fx
Camera.bf: 60.438729354619866
# Ordem de cor das imagens (0: BGR, 1: RGB. É ignorado se as imagens são em tons de cinza)
Camera.RGB: 1
# Limiar Próximo/Longe. Vezes da linha base.
ThDepth: 35
#--------------------------------------------------------------------------------------------
# Retificação Estérea. Apenas se você precisar pré-retificar as imagens.
# Camera.fx, .fy, etc devem ser os mesmos que em LEFT.P
#--------------------------------------------------------------------------------------------
LEFT.height: 720
LEFT.width: 1280
LEFT.D: !!opencv-matrix
rows: 1
cols: 5
dt: d
data: [-9.900439262390137, 96.50916290283203, 0.0009822448482736945, -0.00023291604884434491]
LEFT.K: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [804.9215698242188, 0.0, 640.6663818359375, 0.0, 804.9215698242188, 362.4100036621094, 0.0, 0.0, 1.0]
LEFT.R: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [0.9999611377716064, -0.006486319005489349, -0.005967340432107449, 0.006491821724921465, 0.9999785423278809, 0.0009032952948473394, 0.005961353424936533, -0.0009419990819878876, 0.9999817609786987]
LEFT.P: !!opencv-matrix
rows: 3
cols: 4
dt: d
data: [804.9215698242188, 0.0, 640.6663818359375, 60.438729354619866, 0.0, 804.9215698242188, 362.4100036621094, 0.0, 0.0, 0.0, 1.0, 0.0]
RIGHT.height: 720
RIGHT.width: 1280
RIGHT.D: !!opencv-matrix
rows: 1
cols: 5
dt: d
data: [-9.900439262390137, 96.50916290283203, 0.0009822448482736945, -0.00023291604884434491]
RIGHT.K: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [806.0142211914062, 0.0, 664.4835205078125, 0.0, 806.0142211914062, 370.78265380859375, 0.0, 0.0, 1.0]
RIGHT.R: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [0.9999005794525146, -0.005074762273579836, 0.013157090172171593, 0.005086900200694799, 0.9999866485595703, -0.0008892129990272224, -0.013152401894330978, 0.0009560533799231052, 0.9999130368232727]
RIGHT.P: !!opencv-matrix
rows: 3
cols: 4
dt: d
data: [806.0142211914062, 0.0, 664.4835205078125, 60.438729354619866, 0.0, 806.0142211914062, 370.78265380859375, 0.0, 0.0, 0.0, 1.0, 0.0]
#--------------------------------------------------------------------------------------------
# Parâmetros ORB
#--------------------------------------------------------------------------------------------
# Extrator ORB: Número de recursos por imagem
ORBextractor.nFeatures: 1200
# Extrator ORB: Fator de escala entre níveis na pirâmide de escala
ORBextractor.scaleFactor: 1.2
# Extrator ORB: Número de níveis na pirâmide de escala
ORBextractor.nLevels: 8
# Extrator ORB: Limiar FAST
# A imagem é dividida em uma grade. Em cada célula, pontos FAST são extraídos impondo uma resposta mínima.
# Primeiro, impomos iniThFAST. Se nenhum canto for detectado, impomos um valor menor minThFAST
# Você pode diminuir esses valores se suas imagens tiverem baixo contraste
ORBextractor.iniThFAST: 20
ORBextractor.minThFAST: 7
#--------------------------------------------------------------------------------------------
# Parâmetros do Visualizador
#--------------------------------------------------------------------------------------------
Viewer.KeyFrameSize: 0.05
Viewer.KeyFrameLineWidth: 1
Viewer.GraphLineWidth: 0.9
Viewer.PointSize: 2
Viewer.CameraSize: 0.08
Viewer.CameraLineWidth: 3
Viewer.ViewpointX: 0
Viewer.ViewpointY: -0.7
Viewer.ViewpointZ: -1.8
Viewer.ViewpointF: 500
IV. Execução do Sistema
1. Execução da câmera usando depthai-ros
O tutorial específico também refere-se ao site oficial da OAK China:
cd seu_workspace
source devel/setup.bash
roslaunch depthai_examples stereo_node.launch
2. Execução do algoritmo orb-slam2
Inicialmente executei o modo de mapeamento estéreo.
3. Resultados da execução
Os resultados obtidos foram apenas satisfatórios, persistindo problemas de perda fácil de pontos de特征. Acredito que a calibração ainda precisa de melhorias.
V. Versão aprimorada do algoritmo ORB-SLAM2
Esta versão apresenta melhores resultados, com menor perda de pontos e funcionalidade de salvamento do mapa. O processo de instalação e execução é idêntico ao da versão oficial:
GitHub - BoomFan/ORB_SLAM2: SLAM em Tempo Real para Câmeras Monoculares, Estereoscópicas e RGB-D, com Detecção de Laço e Recomposição de Localização
Resultados da execução
VI. Mapeamento Denso
Usando o algoritmo do Dr. Gao Xiang, o processo específico de instalação refere-se a este tutorial:
Compilação do mapeamento denso do ORB-SLAM2 do Dr. Gao Xiang (adicionando mapa de nuvem de pontos em tempo real + salvamento de mapa de nuvem de pontos)
Após instalar o algoritmo, a execução com conjuntos de dados funcionou corretamente, com os seguintes resultados:
No entanto, ao executar com a câmera OAK em modo RGB, não foi gerada nenhuma nuvem de pontos. Este problema ainda está em investigação.