[Paper Review] ProSLAM

Dong-Won, Shin
8 min readJan 25, 2018

--

소개

KITTI 데이터 셋에 알고리즘을 적용한 결과

논문: https://arxiv.org/abs/1709.04377
코드저장소: https://gitlab.com/srrg-software/srrg_proslam
테스트영상: https://www.youtube.com/watch?v=Bmig0ASFOY4

기존의 SLAM 방법에 ORB-SLAM2, LSD-SLAM 등이 있지만 복잡도가 높아서 이해하기 어렵다고, 이 논문의 저자들이 ProSLAM은 이해하기 쉽게 만들었다고 주장하네요(하지만 여전히 어렵다는..). C++언어로 주로 작성되었고 OpenCV (기본적인 영상처리), Eigen (선형대수 계산), g2o (그래프 최적화)의 라이브러리를 활용했다고 합니다. ORB-SLAM처럼 피쳐 기반 SLAM이지만 병렬적인 멀티플 쓰레드를 사용하지않고 단일 쓰레드만을 이용하여 실시간의 성능을 구현했다고 합니다.

개요

아래의 그림은 ProSLAM의 전체적인 흐름도를 보여주고 있습니다.

ProSLAM의 전체적인 흐름도

크게 다음의 4가지의 핵심 부분으로 나뉘어 질 수 있습니다.
- Triangulation: 스테레오 영상 쌍을 입력으로 받아서 3차원 점과 그에 해당하는 특징 디스크립터를 생성.
- Incremental motion estimation: 현재 영상 프레임의 변환(회전 및 이동)을 계산.
- Map management: 전체 월드 맵의 일부인 로컬 맵을 생성.
- Relocalization: 현재 로컬 맵이 이전 로컬 맵에 나타난 적이 있는지 탐색하고 그런 제약조건을 활용하여 전체 월드 맵의 정보를 업데이트.
그럼 이제부터 각 부분을 자세히 한번 살펴보도록 하죠.

Triangulation 모듈

Triangulation 모듈의 흐름도

Triangulation 모듈의 목적은 스테레오 카메라로부터의 영상 데이터를 frame 자료 구조로 변환하는 역할을 수행합니다.

첫번째 단계에서는 영상에서 FAST 특징점 검출을 수행하고 Regularization 단계를 수행하는데 이는 왼쪽 영상에서 특징점이 균일하게 분포되도록 일부를 제거하는 역할을 수행합니다. 이 단계에서는 영상을 2차원의 그리드 형태로 나누고 그리드의 각 칸에서 가장 높은 response 값을 가지는 특징점만을 남기고 나머지는 다 제거합니다. Regularization 작업은 왼쪽 영상에만 수행하고 오른쪽 영상에서는 수행하지 않습니다.

다음으로 추출된 특징점에 대해서 BRIEF 디스크립터를 계산합니다. 추출된 디스크립터를 활용해서 스테레오 매칭 쌍(에피폴라 키포인트 매칭 쌍)을 두 영상에서 얻고 수식 (1),(2),(3)을 이용하여 3차원 점을 계산하는 부분까지 수행합니다.

Incremental Motion Estimation (IME)모듈

Incremental motion estimation 모듈의 흐름도

IME 모듈의목적은 이전 프레임과 현재 프레임 사이의 상대적인 모션을 결정하는데 있습니다. 먼저 수식 (4)를 이용하여 이전 프레임으로부터의 프레임 포인트가 현재 프레임의 왼쪽 이미지에 사영됩니다.

이전 프레임의 키포인트가 계산되면 현재 프레임의 왼쪽 이미지에서 디스크립터를 비교하여 이와 관련되는 키포인트를 찾습니다. 이 때 계산속도를 향상시키기 위해 k_P를 중심으로 가지는 정사각영역 내부로 탐색 영역을 제한합니다. 이렇게 모든 키포인트들에 대해서 매칭 쌍을 찾고 나면 두 프레임 사이의 변환(회전 및 이동) 행렬을 계산할수 있게 됩니다. 비선형 최적화 방법인 Gauss-Newton이나 Levenberg–Marquardt 방법을 통해 얻을 수 있습니다.

Map Management

Map management 모듈의 흐름도

맵 관리 모듈은 크게 3개의 주요 작업을 수행합니다.
- Correspondence recovery: 현재 프레임 포인트들의 이전 매칭 집합을 모션 파라미터를 이용하여 획득.
- Landmark optimization: 각 시간에서 랜드마크가 관찰되면 running information filter를 이용하여 보정.
- Local map generation: 회전 및 이동의 변화가 특정 기준치를 넘게 되면 새롭게 로컬 맵을 생성.

Relocalization

Relocalization 모듈은 현재 프레임이 이전에 방문했던 위치인지를 판단하는 루프 폐쇄 판단을 수행합니다. 루프 폐쇄의 여부를 알게되면 이 정보를 제약조건으로 활용하여 월드 맵을 업데이트 할 수 있습니다.

Relocalization 모듈의 흐름도

Relocalization 후보는 로컬 맵 간의 전체 디스크립터 집합을 비교함에 의해서 수행될 수 있습니다. 그러나 그러한 작업은 매우 계산량이 많이 소비될 수 있습니다. 그래서 이 논문에서는 다음과 같은 전략을 사용합니다.
(1) 임의 두개의 로컬 맵이 얼마나 겹쳐지는가를 비교.
(2) 두 로컬맵 간의 유사성 탐색을 수행.
(3) ICP를 이용하여 inlier의 갯수와 average error를 계산.
(4) ICP로부터의 inlier의 숫자가 높고 average error가 낮으면 루프 폐쇄로 판단.
(5) 루프 폐쇄 제약조건을 g2o(general graph optimization)를 이용하여 최적화 수행.

실험결과

실험은 자율주행 분야에서 굉장히 많이 사용되는 KITTI데이터셋과 ​드론에서 촬영된 영상을 포함하는 EuRoC MAV 데이터셋을 활용했습니다. 비교 알고리즘은 LSD-SLAM과 ORB-SLAM2를 선택했습니다.

정확성 측면

정확성 측면에서는 Ground-Truth 카메라 궤적과 비교하여 회전값 에서의 차이(rotation error)와 이동값에서의 차이(translation error)를 그래프로 나타냈습니다.

먼저 KITTI 데이터 셋에 대해서 정확도 비교가 아래 그래프로 나타납니다.

정확성 결과로만 봤을때는 기존의 방법들과 비교해서 비슷한 수준이지만 압도할만한 수준은 아니네요. 이동 에러 측면에서 LSD-SLAM을 11개 중 7번 이기고, ORB-SLAM2를 11번중 3번 이기네요. 회전 에러 측면에서는 LSD-SLAM을 11번 중 2번 이기고, ORB-SLAM2를 11번 중 1번 이깁니다.

다음으로 EuRoC MAV 데이터셋에서는 아래와 같은 표로 회전 에러 결과를 나타냅니다.

여기서도 성능은 비슷하지만 좋지는 않고 압도할만한 수준은 아니네요.

이런 정확성 측면에서 약간 하자가 있는 것은 기존의 다른 방법들이 Bundle adjustment (BA)를 내부적으로 활용하지만 ProSLAM은 그렇지 않다는 것에 기인합니다. 다만 알고리즘 내부의 복잡도를 줄이면서 이정도의 좋은 성능을 내도록 했다는 것에 점수를 주고 싶네요.

시간 복잡도 측면

ProSLAM이 가장 빠르다는 결론을 보여주네요. 하지만 논문에서는 각 알고리즘이 약간 다른 시스템 환경에서 구동되었다는 점을 알려주고 있습니다.
LSD-SLAM: Intel i7–4900MQ CPU(4 cores, 3.8GHz, 8MB cache)
ProSLAM, ORB-SLAM2: Intel i7–4900MQ CPU(4 cores, 3.4GHz, 6MB cache)

결론

기존의 방법인 LSD-SLAM이나 ORB-SLAM2 보다 정확성 측면에서는 약간 떨어지지만 계산 및 시간 복잡도 측면에서는 향상을 이루었습니다. 내부 모듈을 경량화 하여 SLAM 입문용으로 활용하기 좋게 만들었다고 볼수 있습니다. (제 개인적인 견해로는 rendering 부분을 제외한 KinectFusion이 좀더 이해하기 쉬울 것으로 판단..) 어쨋든 소스코드와 논문 모두 자유롭게 접근할수 있으니 SLAM에 관해서 처음 접해보시는 분들은 한번 살펴보시는 것도 좋을 것 같습니다.

Code Review: link
Test Video: (to be updated)

--

--