SP-SLAM

 

SP-SLAM의 source code는 아래 github에 공개되어 있습니다.

https://github.com/hxxmin/SP-SLAM

 

GitHub - hxxmin/SP-SLAM: SP-SLAM: Surface-Point Simultaneous Localization and Mapping

SP-SLAM: Surface-Point Simultaneous Localization and Mapping - hxxmin/SP-SLAM

github.com

논문의 출처는 다음과 같습니다.

https://ieeexplore.ieee.org/document/9591241

 

나중에 다시 보기 위해 작성한 글입니다.

혹시라도 잘못된 내용이 있다면 댓글 남겨주시면 감사하겠습니다 : )

1. Introduction

이 논문에서는 low texture 환경에서도 안정적인 SLAM이 가능한 방법을 제안한다.

이런 문제를 해결하기 위해 환경에서 평면 정보를 추출하고 이를 적용하려는 연구는 많이 이루어졌다.

하지만 real-world는 보통 평평하지 않고, 그런 환경에 대응하기 위해 많은 매개변수와 모델이 필요할 수 있다.

 

저자는 여기에 surfel이라는 아이디어를 도입한다.

Surfel은 표면을 작은 원의 집합으로 분해하고 환경의 모양을 나타낸다.

따라서 모양에 집중하기 때문에 low texture 환경이나 조명 변화와 같은 질감 변화에 대응 가능하여 약점을 극복한다.

Surfel만 사용하는 것은 오히려 복잡한 환경에 대응하기 힘들다는 점도 있다.

예시로 책장을 설명한다.

책장의 책 표면이 굉장히 울퉁불퉁 하기 때문에 surfel로 깊이 측정이 부정확할 수 있다.

 

이렇게 저자는 SP-SLAM을 제안한다.

keypoint와 surfel은 각각 환경의 texture와 shape를 이용하기 위해 추출된다.

나중에 실험결과에서도 나오겠지만 각자의 단점을 서로 보완해 주면서 복잡한 환경을 표현한다.

 

SLAM에 최초로 Surfel을 도입해서 이와 관련된 새로운 수식을 정의하며 문제를 해결해 나간다.

 

소스코드는 위 깃허브에 C++로 오픈되어있다.

3. System Overview

fig. 2. SP-SLAM의 프레임 워크

전체적인 시스템은 ORB-SLAM2에서 영감을 받아 front-end와 back-end를 구성한다.

 

front-end에서는 새로운 이미지가 들어오면 feature를 뽑고 맵에 있는 feature와 비교하여 camera tracking을 진행한다.

이전 keyframe과 현재 이미지를 비교하여 keyframe selection을 진행한다.

keyframe이 선정되면 Surfel을 추출한다.

 

back-end에서는 BA(bundle adjustment)를 사용하여 keyframe의 trajectory와 map을 동시에 추정한다.

새로운 keyframe에서 추출한 surfel 특징은 map의 surfel과 association을 진행한다.

새로운 feature로 판단되면 map에 등록한다.

이러한 과정 이후 BA를 진행하여 keyframe의 pose와 map points, map surfel의 위치가 모두 최적화된다.

4. SP-SLAM: FRONT-END

A. Camera Tracking

기존의 알고리즘은 feature만을 pose tracking에 사용했다.

마찬가지로 여기서도 feature만을 사용한다.

surfel과 feature를 동시에 사용하게 되면 오히려 성능 저하가 생기기 때문이다.

관련 내용은 뒤쪽 실험부분에 나와있다.

 

feature는 ORB를 사용했다.

feature를 뽑은 후 map에 있는 feature와 비교한다.

만약 연관되는 게 발견되면 map points들이 motion-only BA를 위해 project 된다.

 

motion-only BA에서는 reprojection error를 사용한다.

reprojection error

camera tracking이 완료되면 keyframe으로 선정할지 말지 고민한다.

keyframe의 선정 조건은 ORB-SLAM에서 사용한 것을 쓴다.

B. Surfel Extraction

이 논문에서 핵심 내용인 surfel이 등장한다.

현재 이미지가 keyframe으로 결정되었다면 surfel을 추출한다.

Surfel을 추출하는 방법은 여러 가지가 있는 듯하다.

이 논문에서는 "Real-time Scalable Dense Surfel Mapping" 논문에 나오는 superpixel extraction과 같은 방법을 사용한다.

Super pixel은 intensity와 depth image로부터 나온다.

이 super pixel은 large-scale에 적용되었을 때 메모리 사용량, outlier, noise 감소에 효과가 있다고 한다.

SLIC로부터 채택된 k-means접근을 통해 추출된다고 하는데 그게 메인은 아니므로 넘어간다.

 

하나의 surfel은 10개의 파라미터로 구성되어 있다.

 

순서대로 surfel의 position, normal vector, 3 채널 색상, 반지름이다.

그리고 아래와 같이 계산된다.

여기서 w는 super pixel의 집합에 속한 pixel값이다.

 

위에서 depth를 이용하여 찾은 super points를 이용하여 surfel을 만든다고 했다.

super point에 속하는 pixel값 주변을 이용하면 두 개의 벡터가 만들어지고 이를 외적 하면 법선 벡터가 생성된다.

 

이 논문에서 surfel은 작은 영역을 모델링하는 데 사용된다.

주어진 superpixel에 대해 해당하는 surfel이 충분히 평평한지 여부를 결정해야 한다.

왜냐하면 평평하지 않은 경우 매핑을 위해 사용하기 어렵기 때문이다.

평평함을 측정하고 threshold를 넘지 않는 surfel이 feature로 사용된다.

C. Surfel Association

새로운 surfel이 들어오면 기존에 map에 있던 surfel과 association을 진행한다.

이때 두 surfel 간의 거리를 측정하기 위한 surfel distance가 제안된다.

내적을 통해 상대 surfel까지의 수직 거리를 나타내고 이를 평균해 주는 방식이다.

이를 세 가지 threshold를 설정하여 안정적인 surfel을 찾아낸다.

그리고 map에 등록한다.

 

Surfel distance를 구하는 과정이 ICP와 비슷해 보일 수 있지만 이는 저자가 고안한 unique 한 방식이다.

그 이유를 아래와 같이 설명한다.

  1. 두 점 사이가 아니라 두 surfel 사이의 거리를 구함
  2.  ICP에서는 점과 normal vector의 distance를 구하는 반면, 이 논문에서는 두 surfel에서 나오는 normal을 이용함. 
    또한 ICP는 저 관계가 비대칭이며 제안한 방법은 대칭임.
  3. Surfel distance는 두 개의 surfel에만 적용되며 다른 surfel들에
    대해서 합산될 필요가 없다.

5. SP-SLAM: BACK-END

여기에서는 back-end에 대해 설명한다.

새로운 keyframe이 삽입되거나 loop closing이 일어났을 때 비로소 graph를 구성하는 모든 것들이 최적화된다.

구성하는 녀석들은 keyframes, map points, surfels이다.

measurement error를 더하여 최적화하게 된다.

A. Camera-Point Measurement Error

이 에러는 아까 봤던 reprojection error와 거의 비슷하다.

B. Camera-Surfel Measurement Error

여기에서는 두 개의 error term이 존재한다.

  1. Surfel-pd : 두 개의 surfel이 멀리 떨어져 있는 경우 penalizing을 위해
  2. Surfel-normal : 두 개의 surfel의 orientation discrepancy

C. Optimization

LM으로 최적화를 했으며 g20 framework를 섰다. CPU에서 real-time 동작한다고 한다.

최종적으로 error function은 다음과 같고 μ는 모두 더해 1인 가중치에 해당한다.

D. Loop Closure

DBoW2가 루프를 찾는 데 사용되었다.

DBoW2에서는 vacabulary tree로 입력 이미지를 query 해서 이미지 후보군을 찾아낸다.

이 후보군을 geometric 하게 검사해서 최종적으로 query image를 출력해 주는 방식이다.

이렇게 해도 물론 훌륭한 성능을 자랑하지만 feature less 환경에서는 자칫 잘못된 매칭이 나올 수 있다.

 

이를 위해 저자는 DBoW2에서 나온 후보군에 대해 surfel의 관계를 추가적으로 확인하며 성능을 강화한다.

E. Surfel Merging

앞서 최적화 과정에서 포함되지 않은 surfel의 반지름을 추가적으로 fine 튠 해주는 과정이다.

일치하는 두 Surfel의 반지름과 position을 이용하여 반지름이 업데이트된다.

6. Experiment

SP-SLAM은 다양한 벤치마크 데이터셋에서 실험 측정이 되었다.

일부 벤치마크 데이터셋에서는 거의 모든 sequence에서 월등하거나 준수한 성능을 보였다.

 

왜 surfel을 front-end에서 사용하지 않았을까?

이유는 계산 시간이 증가하여 back-end에서 최적화 시간이 충분히 확보되지 못하기 때문이다.

이는 성능 감소로 이어짐을 실험으로 확인했다고 한다.

 

low texture 환경에서 잘 작동함을 확인했다.

 

런타임은 1 frame당 0.105초로 real-time이 가능한 수준이다.

 

Surfel이라는 특징을 도입하여 SLAM의 front-end부터 back-end까지 적용되는 과정이 정말 깔끔하게 설명되어 있어 도움을 많이 받은 논문이다.