Linear Algebra
🗓️

ORB - SLAM2 동작 시켜 보기

생성일
2022/03/22 01:41
태그
orb-slam
visual slam
bundle-adjustment

ORB - SLAM이 뭔가요?

orb-slam2는 real-time으로 동작하는 monocular, stereo, rgb-d 카메라용 slam library입니다.

카메라의 trajectory를 계산하고 sparse하게 3d reconstruction을 수행합니다. 일반적으로 카메라의 feature를 기반으로 맵을 형성합니다. ORB- SLAM의 경우 여러 가지 형태로 동작시켜 볼 수 있는데, 가장 먼저 데이터셋에 대하여 잘 동작하는지 살펴보고 실제 상황에서 동작시켜 봅니다.
ORB - SLAM 알고리즘의 파이프라인은 논문을 읽어본 뒤 다른 포스팅에서 따로 업로드 해 보도록 하겠습니다!

어떤 데이터셋을 사용할까요?

보통 SLAM, Odometry 관련한 task에서 성능을 비교할 때 사용하는 데이터셋은 크게 3가지입니다. KITTI, TUM, EuRoC 이 3가지 데이터셋이 어떤 형태인지, 어떤 차이점을 가지는 지 알고 싶은분들은 아래 paper를 참고 바랍니다.
ORB SLAM을 통해 해볼수 있는 것들은 아래와 같습니다.
KITTI dataset 이용해 localization과 mapping 실행해보기 → Stereo, Monocular
TUM dataset 이용해서 해보기 → RGB-D (RGB image + depth information), Monocular
EuRoC dataset 이용해서 해보기 → Stereo, Monocular
이 외에도 여러가지 데이터셋으로 돌려볼 수 있고, 자기가 직접 만든 데이터셋도 이용할 수 있습니다.

설치 및 실행 과정

위에 업로드 한 orb-slam2 github를 이용해 설치하였는데, 그대로 따라 했는데도 오류가 굉장히 많아서 고생을 많이 했다. 아마 필요로 하는 라이브러리가 많고 (Pangolin, OpenCV, Eigen3, DBoW2, g2o) 각 라이브러리마다 이 알고리즘에 호환되는 버전이 달라 애를 많이 먹었다. 다행이 워낙 유명한 알고리즘이라 그런지 설치 issue에 대한 여러 정보들이 인터넷상에 많아 참조하면서 설치할 수 있었다. 나는 특히 Pangolin, 이 visualization tool 때문에 애를 많이 먹었다!!!!! (컴퓨터 부술 뻔)
이와 관련해 내가 도움받았던 자료들을 공유해 놓겠다.
Ubuntu 20.04 安装 ORB_SLAM2_cgnerds的博客-CSDN博客
从 官网地址下载 最新稳定版并解压缩,安装脚本如下。 注:不用下载最新master版,编译的时候有错误,v0.6稳定版则没有问题。 如果弹出窗口并显示如下正方体,则表示安装成功。 从 官网 下载OpenCV 3的最新版本的源码,这里是3.4.15。 正常编译命令如下: cd ORB_SLAM2 chmod +x build.sh ./build.sh 如果遇到以下错误,请按照下面的提示修改。 这里需要将 ORB_SLAM2/include/LoopClosing.h::47 处的 修改为 需要添加头文件 需要添加此句的文件如下: 编译完成后会在ORB_SLAM2/Examples文件夹下生成各种可执行文件。 从 TUM官网下载数据集,这里下载的是第一个,即fr1/xyz,大小为0.47G,解压缩后名称为rgbd_dataset_freiburg1_xyz。 这里我在ORB_SLAM2下创建了一个名为 datasets 的文件夹,并使用 ln -s 命令创建了上述文件夹的软连接(可以避免VSCode之类的IDE加载太慢),如下所示: 之后即可参照官网示例运行单目Demo。 /Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml datasets/rgbd_dataset_freiburg1_xyz python2 和 pip2 sudo add-apt-repository universe sudo apt update sudo apt install python2 curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py sudo python2 get-pip.py pip2 --version pip2 安装插件 关联RGB图像和深度图像 下载脚本 associate.py ,在数据集文件夹打开终端,并执行如下命令 python2 associate.py rgb.txt depth.txt > associations.txt 如果程序正常执行,即可生成 associations.txt 文件。 Demo运行 ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml datasets/rgbd_dataset_freiburg1_xyz datasets/rgbd_dataset_freiburg1_xyz/associations.txt Pangolin 安装测试 Installation & Examination (Ubuntu 20.04) Ubuntu18.04 ORB_SLAM2的安装、配置、运行SLAM单目实例
실행 같은 경우에는 기본적으로 orb-slam2 공식 깃허브를 이용해서 동작시켰고 웹캠 예제의 경우 위에 제시된 블로그의 글을 참고해 작동시켰다. 단 실제 이미지의 경우 내가 가지고 있는 카메라를 캘리브레이션 한 뒤에 알고리즘을 돌려하지만 일단 돌려보고 싶어서 tum datasets의 calibrated 된 결과를 일단 사용했다. 후에 캘리브레이션 과정 까지 거친후에 결과를 비교해 볼 것이다.
#KITTI ./Examples/Stereo/stereo_kitti Vocabulary/ORBvoc.txt Examples/Stereo/KITTI04-12.yaml /home/minje/dataset/kitti/sequences/04 ./Examples/Stereo/stereo_kitti Vocabulary/ORBvoc.txt Examples/Stereo/KITTI00-02.yaml /home/minje/dataset/kitti/sequences/00 #TUM ./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml /home/minje/dataset/tum/rgbd_dataset_freiburg1_teddy #live image ./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt ./Examples/Monocular/TUM1.yaml
Bash
복사

데이터셋을 이용한 slam 결과 확인해보기

1. KITTI datasets

일단 기본적으로 feature 정보가 많은 실외 환경이어서 그런지 잘 동작했다.
이 알고리즘의 경우 slam 알고리즘이기 때문에 당연히 loop closure 기능이 들어가 있다.
루프 폐쇄 검출(loop closure detection)이란 로봇의 이동 궤적상에서 현재의 위치가 이전에 방문했던 위치인지를 판단하는 것을 말한다. 검출된 결과를 환경 맵 최적화 단계에서 제약조건으로 활용하도록 하여 SLAM 알고리즘의 오차 문제를 해결합니다.

Loop Closure 하기 전

맵을 살펴보면 검정색으로 표시 된 부분이 이미 차량이 지나오면서 맵을 만든 것이고 빨간색으로 표현된 부분이 다른 곳을 들렀다가 다시 왔던 곳으로 돌아가는 형태이다. 바로 전에 들렸던 곳과 완전히 일치하게 맵이 만들어지면 좋겠지만, 센서 데이터가 어느정도의 오차를 가지고 있으므로 똑같은 곳으로 이동해도 길이 일치하지 않게 된다. 이럴 때 사용하는 것이 바로 Loop Closure 알고리즘이다.

Loop Closure 하고 난 후

Loop Closure를 실행하게 되면
Loop detected! Local Mapping STOP Local Mapping RELEASE Starting Global Bundle Adjustment Global Bundle Adjustment finished Updating map ... Local Mapping STOP Local Mapping RELEASE Map updated!
Bash
복사
위와 같은 형태로 뜨는 것을 볼수 있다. 쉽게 설명하면,
Loop detected! → 여기 아까 왔던 데 같은데?
Local Mapping STOP/ RELEASE → 잠깐만 맵 만드는 거 멈춰 보자, 해야할 게 있거든(오차 보정)
Starting Global Bundle Adjustment → 아까 왔던 데인데 길이 안맞거든? 최적화 해서 오차를 줄이자!
Global Bundle Adjustment finished → 오차 보정 끝! 이제 길이 맞네!!
Updating map → 맵 상에서 업데이트 했어!

2. TUM datasets

3. EuRoC datasts

Live Input 넣어보기

학교 내부의 일자 길을 쭉 이동시켜 보았는데 실내환경 (하얀 벽이 많음) 이 그렇게 좋지 않아 feature 찾기에 애를 먹었다. 그래도 비교적 잘 동작하는 것을 확인할 수 있었다.

결과 분석

kitti dataset의 경우 feature 가 많은 야외 환경이어서 그런지 feature matching 수도 많고 맵도 정확하게 나오는거 같다.
하지만 tum 데이터셋 중 실내 데이터셋, 또는 제 웹캠으로 동작시키는 실내를 촬영할 경우 잘 동작하지 않았다. 예를들면 feature 개수가 부족한 환경을 만나면 mapping을 중단하고 relocalizaton을 진행하게 되고 이 과정이 꽤 오래 걸리는 현상이 발생하였다.
이러한 현상이 나타나는 이유를 보니 크게 3가지 인거 같다!
1.
실내 환경에서 절대적인 features의 수가 부족하다.
2.
Calibration이 정확히 되지 않은 상태에서 실험한 것이기 때문에 initialization 과정이 오래 걸린다
3.
실제 손으로 들고 slam을 동작시킨 것이기 떄문에 영상자체의 흔들림, 빛번짐, 기타 노이즈 이슈가 크게 작용하는 거 같다.
이러한 것들을 보정하기 위해 좀 더 알아봐야할 것 같다!