Usando a Câmera OAK-D-Pro com ORB-SLAM2 para Mapeamento Denso

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.

Tags: ORB-SLAM2 OAK-D-Pro SLAM mapeamento denso Calibração de Câmera

Publicado em 6-20 22:50