이 글은 카메라 사진만으로 3차원 SLAM을 수행하여, 공간 모델을 생성하는 Visual SLAM의 대표적인 알고리즘인 ORB SLAM3를 설치, 빌드하고 사용하는 방법을 간략히 설명한다. 이 기술은 카메라 비전기반으로 동작하는 자율주행장비, 네비게이션, 3차원 공간정보 생성 등에 사용할 수 있다.
ORB-SLAM 실행 결과
참고로, Visual SLAM 알고리즘은 영상의 각 프레임 이미지에서 고유의 특징점(Feature)을 얻는 것부터 시작된다. 각 프레임에서 동일한 특징점들에서 카메라의 위치와 방향을 추정한다. 다수의 동일한 특징점들로부터 카메라의 위치와 방향을 얻은 후, 이를 역으로 이용해, 각 프레임의 이미지 정보와 특징점 정보를 이용해 포인트 클라우드 맵을 생성할 수 있다. 이 과정에서 계산기하학, 복잡한 수치해석이 사용된다. 다음 그림은 이 과정을 보여준다.
특징점 기반 Visual SLAM 알고리즘(상세)
개발 환경 설치
다음과 같이 개발 환경을 미리 설치한다.
1. Ubuntu 20.04 설치
여기를 참고해, 우분투 운영체제를 먼저 설치한다.
2. OpenCV 설치
git clone https://github.com/opencv/opencv/
git clone https://github.com/opencv/opencv_contrib/
mkdir opencv/build/
cd opencv/build/
cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
make -j8
sudo make install
git clone https://github.com/opencv/opencv/
git clone https://github.com/opencv/opencv_contrib/
mkdir opencv/build/
cd opencv/build/
cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
make -j8
sudo make install
3. Pangolin 설치
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build
cd build
cmake ..
cmake --build .
4. ORB_SLAM3 설치
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3
cd ORB_SLAM3
chmod +x build.sh
./build.sh
이때 다음과 같은 메이크 에러가 발생할 수 있다.
/home/ktw/Projects/ORB_SLAM3/src/CameraModels/KannalaBrandt8.cpp:534:41: error: no match for ‘operator/’ (operand types are ‘cv::Matx<float, 3, 1>’ and ‘float’)
...
/home/ktw/Projects/ORB_SLAM3/src/LocalMapping.cc:628:49: error: no match for ‘operator/’ (operand types are ‘cv::Matx<float, 3, 1>’ and ‘float’)
이는 OpenCV 행렬 계산 operator / 연산자가 누락되어 발생한 것이므로, 아래와 같이 에러가 발생한 파일을 편집해, 연산자 구현을 추가해 준다. 그리고 다시 빌드한다.
// Fix by Taewook Kang.
namespace cv
{
template<typename _Tp, int m, int n> static inline
Matx<_Tp, m, n> operator / (const Matx<_Tp, m, n> &a, float alpha)
{
return Matx<_Tp, m, n>(a, 1.f / alpha, Matx_ScaleOp());
}
}
그럼, 다음과 같이 ORB_SLAM3를 성공적으로 빌드할 수 있을 것이다.
ORB SLAM3 실행하기
우선 다음 테스트 영상 이미지 데이터를 다운로드 받는다. 참고로, 다른 테스트 파일은 여기를 방문해 다운로드할 수 있다. 이 테스트 영상은 영상 이미지와 관성 센서 데이터가 기록되어 있다.
압축파일을 폴더에 해제한다. 그리고, 아래 파일을 편집한다.
Examples\euroc_examples.sh
euroc_examples.sh 파일 내 아래 데이터셋 경로를 압축 해제한 폴더로 설정후 저장한다.
pathDatasetEuroc='/home/ktw/Projects/ORB_SLAM3/data''
참고로, 다운로드 받은 데이터셋은 MH_03이므로, 다음과 같이 해당 예제 실행 부분만 실행되도록 euroc_examples.sh 파일을 편집한다.
#!/bin/bash
pathDatasetEuroc='/home/ktw/Projects/ORB_SLAM3/data' #Example, it is necesary to change it by the dataset path
#------------------------------------
# Monocular Examples
# echo "Launching MH01 with Monocular sensor"
# ./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml "$pathDatasetEuroc"/MH01 ./Monocular/EuRoC_TimeStamps/MH01.txt dataset-MH01_mono
# echo "Launching MH02 with Monocular sensor"
# ./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml "$pathDatasetEuroc"/MH02 ./Monocular/EuRoC_TimeStamps/MH02.txt dataset-MH02_mono
echo "Launching MH03 with Monocular sensor"
./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml "$pathDatasetEuroc"/MH03 ./Monocular/EuRoC_TimeStamps/MH03.txt dataset-MH03_mono
이제 euroc_examples.sh 을 실행한다. 그럼, 다음과 같은 Visual SLAM 결과를 얻을 수 있다.
스테레오 이미지에서 SLAM테스트를 위해 아래 명령을 실행한다.
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/
cd ..
cd ..
./Examples/Stereo/stereo_euroc ./Vocabulary/ORBvoc.txt ./Examples/Stereo/EuRoC.yaml ./Datasets/EuRoc/MH01 ./Examples/Stereo/EuRoC_TimeStamps/MH01.txt dataset-MH01_stereo
결과는 다음과 같이 잘 동작되는 것을 확인할 수 있다.
참고로, 스테레오 이미지에서 SLAM 처리는 다음과 같이 ROS(Robot Operating System)를 이용해 실행할 수 있다.
rosrun ORB_SLAM3 Stereo PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE ONLINE_RECTIFICATION
아래는 다양한 영상 데이터에서 SLAM으로 3차원 데이터 생성 테스트한 것이다.
아울러, 다음 영상같이 생성된 맵에서 밀집(Dense) 포인트 클라우드를 생성할 수 있다.
레퍼런스
- OpenCV installation
- SLAM evaluation by KITTI
- ORB SLAM3 and Tutorials
- Dense Visual SLAM
- LSD-slam and ORB-slam2, a literature based explanation
- VIsual Tracking And MappINg with Extremely Dense Feature Points
- Pseudo-LiDAR++: Accurate Depth for 3D Object Detection in Autonomous Driving
- Deep Stereo Geometry Network for 3D Object Detection (CVPR 2020)
- Dual CNN Approach For Depth Estimation
- MonoDepth
- V-SLAM using ZED running under Nvidia TX2. current algorithm is ORB_SLAM2 with RGB-D input
- Running ORB-SLAM3 with ZED2 always appears error. #620
- 3D Simultaneous Localization and Mapping
Dense Point Cloud Reconstruction
ORB SLAM with ZED
댓글 없음:
댓글 쓰기