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 때문에 애를 많이 먹었다!!!!! (컴퓨터 부술 뻔)
이와 관련해 내가 도움받았던 자료들을 공유해 놓겠다.
실행 같은 경우에는 기본적으로 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을 동작시킨 것이기 떄문에 영상자체의 흔들림, 빛번짐, 기타 노이즈 이슈가 크게 작용하는 거 같다.
이러한 것들을 보정하기 위해 좀 더 알아봐야할 것 같다!