이 전 포스트에서 다룬 visual SLAM알고리즘 중 ORB SLAM3에 대해 알아보자

Introduction

Visual SLAM과 ORB SLAM3에 대한 간략한 소개와 특징적인 부분들이 나열되어 있다.

Visual SLAM

  • 센서가 내장된 mobile agent에서 map을 만들고, 현재의 pose를 계산하는것.

VO (Visual Odometry)

  • agent의 ego-motion을 계산하는 것.
  • map을 만드는것이 목적이 아님.

BA (Bundle Adjustment)

  • SLAM에서 사용되는 최적화 기법
  • 이동 경로와 관측을 이용하여 여러 bundle을 조정함
  • 더 나은 결과를 얻도록 수정하는것

ORB SLAM
ORB SLAM에서 진행된 3가지 data association에 대한 설명이 나타난다.

Short-term data association: map의 각요소들을 matching 하는 것, VO에서 주로 사용됨.
Mid-term data assiciation: camera 근처의 map elements들을 이용하여 작은 편차를 보정함.
Long-term data assiciation: 위치 인식을 통해 이전에 방문한 elements를 matching 함.

ORB SLAM3
ORB SLAM3에서 향상된 내용과 그 방식에 대한 설명이 나타난다.
multi-map data association

  • BA를 이전 mapping 단계의 elements를 이용하여 정확한 localization에 사용할 수 있도록 함.

A monocular and stereo visual-inertial SLAM system

  • stereo inertial SLAM을 이용하여 public dataset에서 높은 성능을 보이도록 함.

    IMU와 같은 관성센서를 결합하여 SLAM에서의 효과를 높임
    논문에서는 loop없이도 좋은 성능을 보인다고 함

Improved-recall place recongnition

  • 재방문한 위치인식 성능을 향상시킴
  • DBoW2를 이용한 기존의 방법들은 temporal consistancy를 요구하고, geometric consistancy를 이용하여 loop closing에서 오래 걸리는 현상이 발생함
  • 새로운 place recongnition algorithm을 이용하여 더 좋은 성능을 발휘할 수 있도록 함

    place recongnition algorithm
    기존의 DBoW를 이용하는 방법에서 geometric consistancy와 local consistancy를 이용하여 더 좋은 성능을 발휘하도록 함
    맵의 정확도를 약간의 연산량을 더 이용하여 향상시켰다고 함

ORB SLAM Atlas

  • Atlas를 이용하여 아직 이어지지 않은 map을 나타냄.
  • 다른 시간에 만들어진 map을 자연스럽게 합칠 수 있음
  • ORB SLAM3에서는 이전 ORB SLAM에 비해 place recongnition system, visual inertial multi-map system을 public dataset에서 더 좋은 성능을 발휘하도록 함.

An abstract camera representation

  • SLAM 코드를 camera에 상관없이 사용할 수 있도록 구현함

Related Work

Visual SLAM

기존의 ORB SLAM과 여타 Visual SLAM알고리즘들에대한 비교와 개선된 것들이 적혀있음.

  • keyframe-based approach를 통해 몇가지 선택된 프레임들을 통해 map을 추정함.

    cost가 늘어나지만, 더 정확한 map을 얻을 수 있음(feature matches에 비해)
    feature추출 단계에서 cost가 더 발생하는 경우를 주로 두고 설명하는듯 함

기존의 ORB SLAM에선 DBoW2를 이용하여 SLAM을 진행하였지만 ORB SLAM3에서는 새로운 Atlas system을 이용하여 성능을 높였다고 함.


위 표에사 ORB SLAM3와 여타 SLAM알고리즘들의 비교를 볼 수 있음.

Visual inertial SLAM

visual sensor와 내부 센서들을 이용하여 이전의 SLAM이 어려운 상황(texture, motion blur ...)에서 견고한 결과를 보일 수 있다고 한다. ORB SLAM VI에서 visual-inertial SLAM system으로 map을 재사용 하였지만 IMU initialization technique은 너무 느려서 견고함과 정확도가 떨어졌다.

위에서 설명한 short-term, mid-term,long-term을 의미한다.

closed-form solution을 이용해 위의 문제를 해결한다.ORB SLAM3는 ORB SLAM VI에서 stereo-inertial SLAM으로 확장하여 MAP를 기반으로 한 추정을 통해 loop가 없는 상황에서도 더 좋은 성능을 보인다고 한다.

Multi-Map SLAM

filter based multi-map system

  • map initialization이 manual함
  • 다른 submap을 합치는게 불가능한 system

CCM SLAM

  • ORB SLAM에서 사용한 distribute multi-map system을 사용함
  • EuRoC dataset에서 확연히 더 좋은 성능을 발휘함.

ORB SLAM3에서는 VINS-Mono에 비해 EuRoC에서 2.6배 더 정확한 성능을 mid-term data association을 통해 보임. Atlas system또한 DBoW2를 기반으로 함. local BA를 이용하여 map merging, place recongnization, 에 있어서 더 좋은 성능을 보임.

System Overview


ORB SLAM2와 ORB SLAM VI를 기반으로 만든 system으로, multi map, multi session system이 가능하다. pure visual과 visual-inertial mode를 monocular, stereo, RGB-D센서를 fisheye camera model을 사용하여 이용할 수 있다.

fig 1은 system의 전반적인 진행을 보여준다

Atlas

  • multi map representation으로, 연결되어 있지 않은 map들로 이루어져 있다.
  • active map이 있고, 새로운 frame이 추가됨에 따라 계속해서 최적화되고, 커진다.
  • local mapping thread가 관리한다.
  • DBoW2 를 기반으로 설계되었고, relocalizing, loop closing, map merging에 사용된다.

Tracking thread

  • 현재 frame의 pose를 계산함
  • 현재 frame이 keyframe이 되는지를 결정함
  • tracking lost일 경우 tracking thread는 Atlas map에서 relocalize를 진행함
  • relocalize 될 경우 active map을 바꿈
  • scaratch에 의해 active map을 non-active map으로 바꾸고, 새로운 active map이 initalized 된다.

Local mapping thread

  • key frame과 point를 active map에 추가한다.
  • 불필요한 key frame, point를 제거한다.
  • BA를 통해 map을 다듬어 준다
  • inertial의 경우 IMU parameter는 mapping thread에 의해 보정된다.

Loop and map merging thread

  • active map과 atlas map사이의 공통적 요소를 찿아준다.
  • active map에 공통적 요소를 찿으면 loop correction이 진행된다.
  • loop correction이 진행된 후에 BA 가 독립적인 thread에서 시작된다.

Camera Model

ORB SLAM은 pin-hole camera model을 이용하였다. ORB SLAM3의 목표는 cmaera model을 SLAM pipeline에서 추상화 하는 것이다. ORB SLAM3에서는 pin-hole model과 별개로 Kannala-Brandt fisheye model을 제공한다.

Kannala-Brandt model은 fisheye camera를 사용할 수 있도록 하는 model이라 생각하면 될것같다. fisheye model의 왜곡이나 기타 특성을 나타낼 때 사용한다.
fisheye model은 왜곡이 존재하고, pin hole은 왜곡이 거의 없는 정밀한 모델이다.
pinhole는 시야가 fisheye보다는 좁아서 주변상황 인지에는 fish eye가 강점이 있다.

대부분의 computer vision algorithms은 pin-hole camera모델을 사용하는것과 같이 SLAM system또한 대부분 pin-hole모델을 사용한다. fish eye카메라를 이용하면 더빠른 Mapping과 occlusion에 더 강한 장점이 있다고 한다.

해당 챕터에서는 fish eye camera를 사용하기 위한 방법을 다루지만, 이번 포스트에서는 다루지 않도록 했다. (현재 진행중인 프로젝트의 카메라가 fisheye view를 제공하지 않는다...)


Visual-Inertial SLAM

ORB SLAM VI에서 IMU initialization을 빠르게 하는 기술을 적용하고, fisheye와 pin-hole camera에서 모두 좋은 성능을 보이도록 발전시켰다고 한다.

Fundamentals

pure vision SLAM에서는 current camera pose만을 이용하지만, visual inertial SLAM에서는 계산되는 변수가 추가된다. body pose를 Ti=[Ri,pi]T_i = [R_i,p_i]로 나타내고, world frame기준의 속도 viv_i, 가속과 gyroscope biasis bigb^g_i,biab^a_i 를 이용하여 Brownian motion에 따라 밑과 같은 상태벡터로 나타낸다.

Si={Ti,vi,big,bia}S_i = {\{T_i, v_i, b^g_i,b^a_i}\}

IMU센서를 이용하여 ΔRi,i+1\Delta R_{i,i+1},Δvi,i+1\Delta v_{i,i+1},Δpi,i+1\Delta p_{i,i+1}를 공분산 행렬처럼 사용할 수 있다.
밑의 식으로 IMU의 잔차를 정의한다

rτi,i+1=[rΔRi,i+1,rΔvi,i+1,rΔpi,i+1]rΔRi,i+1=Log(ΔRi,i+1TRiTRi+1)rΔvi,i+1=ΔRiT(vi+1vigΔti,i+1)Δvi,i+1rΔpi,i+1=Rit(pjpiviΔti,i+112gΔt2)Δpi,i+1\begin{aligned} &r_{\tau_{i,i+1}} = [r_{\Delta R_{i,i+1}}, r_{\Delta v_{i,i+1}},r_{\Delta p_{i,i+1}}]\\ &r_{\Delta R_{i,i+1}}=Log(\Delta R^T_{i,i+1}R^T_iR_{i+1})\\ &r_{\Delta v_{i,i+1}}=\Delta R^T_i (v_{i+1} - v_i - g\Delta t_{i,i+1}) - \Delta v_{i,i+1}\\ &r_{\Delta p_{i,i+1}}=R^t_i(p_j-p_i -v_i \Delta t_{i,i+1} - \frac{1}{2}g\Delta t^2) - \Delta p_{i,i+1}\\ \end{aligned}

SO(3)R3SO(3) \rightarrow \mathbb{R}^3SO(3)SO(3)회전 행렬을 벡터공간의 실수벡터로 나타내는 변환을 의미한다. 로그매핑을 통해 직관적으로 나타낼 수 있는 변환을 이용한다. 내부 잔차와 함께 reprojection error인 ri,jr_{i,j}, 프레임 iixjx_j위치에 있는 3d point jj 를 이용하면

ri,j=ui,j(TCBTi1xj)r_{i,j}=u_{i,j} - \prod(T_{CB}T^{-1}_i \oplus x_j)

로 나타낼 수 있다. \prod는 대응하는 카메라 모델에 따른 사영 함수이다. ui,ju_{i,j}는 이미지ii point jj의 관측이고, 공분산 행렬 i,j\sum_{i,j}를 갖는다. TCBT_{CB}는 body-imu 로부터 camera의 변환을 나타내고, calibration을 이용해서 \oplus는 실수공간상으로의 변환을 나타낸다.

관측과 transformation을 이용해서 벡터를 실수공간의 벡터로 나타낼 수 있다.


visual-inertial SLAM은 잔차들을 결합하여 최소화 하는 SLAM으로 만들 수 있다. 위의 그림과 같은 형태를 식으로 나타내면 밑과 같다.

minSkˉ,χi=1krτi1,iτi,i+112+j=0l1iKjρHub(ri,ji,j1)\underset{\bar{S_k},\chi} {\min}{\lgroup \sum_{i=1}^{k}||r_{\tau_{i-1,i}}||^2_{\sum^{-1}_{\tau_{i,i+1}}} + \sum^{l-1}_{j=0} \sum_{i\in\mathcal{K}^j}\rho_{Hub}(||r_{i,j}||_{\sum^{-1}_{i,j}}) \rgroup}

위와 같은 식으로 SLAM을 나타낼 수 있다

K\mathcal{K}는 해당 시간의 로봇의 상태에 대해 의미한다.
ρHub\rho_{Hub}는 huber 손실함수를 의미하고, 이상치에 민감하지 않고 큰 잔차를 없에는 역할을 한다
변수와 키 프레임에 대한 정보를 바탕으로 잔차를 최소화하는 변환을 얻어 SLAM에서 센서값과 모델간의 차이를 줄인다

IMU initalization

이 챕터에서는 inertial value의 좋은 초기값을 얻는 과정에 대해 설명한다.

주로 3개의 key insight를 이용하여 빠르고 정확한 initialization을 진행한다.
1. Pure Monocular SLAM은 매우 정확한 초기 맵을 얻을 수 있다.

  • 해당 Visual SLAM의 scale 문제를 해결하면서 IMU의 initialization을 도울 수 있다.

2. scale 의 수렴은 BA대신 최적화 변수를 이용할 때 훨씬 빠른 성능을 보인다.

3. 센서의 불확실성을 IMU initialization단계에서 무시한다.

위의 insight를 기반으로 IMU initialization단계를 센서의 불확실성에 따라 MAP추정 문제처럼 접근하고, 3가지 단계를 이용하여 해결한다.

1) Vision - olny MAP Estimation:

pure monocular SLAM을 2초동안 진행하고 4Hz의 keyframe을 추가한다. 이 기간(2초) 후에 최대 10개의 카메라 pose와 몇백개의 points를 BA를 통해 얻는다. 이 값들은 body reference로 변환되어 trajectory를 얻을 수 있다.

Tˉ0:k=[R,pˉ]0:k\bar{T}_{0:k} = [R,\bar{p}]_{0:k}

bar는 monocular의 경우 최대 변수를 의미한다.

2) Inertial-olny MAP Estimation:
이 단계에서는 최적의 inertial 변수 추정을 목표로 한다. inertial 측정값과 Tˉ0:k\bar{T}_{0:k}의 key frame을 통해 MAP추정 단계를 거친다. 이 inertial 변수들은 inertial-olny state vector에 stack된다.

Yk={s,Rwg,b,vˉ0:k}\mathcal{Y}_k = \{s,R_{wg},b,\bar{v}_{0:k}\}

inertial 측정값인 I0:k\mathcal{I}_{0:k}만 고려하면 된다. 따라서 MAP추정문제에서 posterior distribution은

p(YkI0:k)p(I0:kYk)p(Yk)p(\mathcal{Y}_k|\mathcal{I}_{0:k})\propto p(\mathcal{I}_{0:k}|\mathcal{Y}_k)p(\mathcal{Y}_k)

이를 negatice logarithm과 가우시안 오차추정을 거쳐서 나타내면

Yk=argminYkbb12+i=1krIi1,iIi1,i12\mathcal{Y}_k^* = \underset{\mathcal{Y}_k} {\arg\min} \lgroup ||b||^2_{\sum_b^{-1}} + \sum^k_{i=1}||r_{\mathcal{I}_{i-1,i}}||^2_{\sum_{\mathcal{I}_{i-1,i}}^{-1}} \rgroup

로 나타낼 수 있다. 이 최적화는 밑의 그림처럼 이해할 수 있다.

fundamental에서 나타난 MAP과정과 다르게, 위 식에서는 visual residuals를 포함하지 않고있고, prior residual을 추가하여 IMU biases를 0에 가깝도록 한다.

3) Visual-Inertial MAP Estimation:
위의 식에서 inertial, visual parameter를 얻음으로 이 단계에서는 visual inserial optimization이 가능하다.

위의 그림과 같은 방식으로 진행된다.

ORB SLAM VI에 비해 더 좋은 성능을 보인다고 한다. 하지만 몇가지 경우(slow motion)에는 작동되지 않는 경우가 있다.

Tracking and Mapping

Tracking 단계는 이전 2개의 frame으로 간소화 되어 이루어진다. 이전2개의 프레임 외의 다른 frame들은 고려되지않고, 이전에 추정된 map point들이 변경되지 않는다. Mapping 단계에서는 모든 최적화를 진행하도록 한다. 위의 fundamental에서 나온 최적화 식을 이용하여 진행하고, 최적화가능한 변수로 keyframes 의 sliding window를 사용한다.

Tracking loss가 발생할 경우 15초동안 imu initialization을 진행하여 잘못된 map이 저장되는걸 막는다고 한다.


Map merging and Loop CLosing

이 챕터에서는 long-term data association에 대해 다룬다. ORB SLAM3에서는 새로운 place recongnition algorithm을 이용하는데 EuRoC 환경에서 실험하였을 때 더 좋은 결과를 갖는다고 한다. Atlas의 keyframe에서 match 하는 부분이 발견되면 loop closing이 진행되고, 새로운 keyframe과 pose간의 관계가 발견되면 이것을 local window라 정의한다. 해당 local window를 통해 정확도를 향상시킬 수 있다고 한다.

Place Recognition

Atlas에 있는 몇가지의 keyframe을 이용하여 알고리즘이 진행된다. image window 내의 ORB keypoint와 map point 내의 ORB descriptor간의 비교를 hamming distance를 이용하여 thresholding 한다.

1) DBoW2 candidate keyframes
active keyframe KaK_a에서 Atlas의 DBoW2 database와 가장 유사한 3개의 key frame을 확인한다. 이때 이 후보지점을 KmK_m이라 한다.

2) Local Window
각각의 KmK_m에 대하여 KmK_m을 포함하는 local window와 대응되는 mappoint를 정의한다. DBoW2는 KaK_a에서의 keypoint와 local window keyframe간의 추정되는 match를 보여준다.

3) 3D aligning transformation
RANSAC을 이용하여 KmK_mKaK_a사이의 변환 TamT_{am}을 계산한다. Horn algorithm을 이용하여 3개의 3D-3D변환을 구한다. KaK_aTamT_{am}을 이용하여 사영한 결과를 바탕으로 thresholding 진행 후 error가 적은 값에 vote를 진행하고 thresholding 을 진행한다.

4) Guided matching refinement
local window 내의 모든 map point를 TamT_am을 이용하여 변환하여 KaK_a와 match되는 keypoint를 더 많이 찿도록 한다.

5) Verification in three covisible key frames
위양성을 피하기 위해서 진행된다. 대부분의 정보가 이미 map에 있다는 것을 기반으로 진행된다.

6) VI Gravity direction verification
pitch 와 roll 각도가 threshold보다 작은지 확인을 통해 place recognition을 완성한다.

Visual Map Merging

place recongnition이 multi-map data association을 active map MaM_a의 keyframe KaK_a와 Atlas에 저장된 matching keyframe KmK_m 대해 TamT_{am}과 함께 제공받으면 map merging이 시작된다. 이 과정에서 MmM_m은 tracking thread에서 map duplication을 방지하기 위해 사용된다.

알고리즘은 먼저 welding window(KaK_aKmK_m 사이의 neighbours)에서 merge가 진행되고, 나머지 모든 맵에서 보정이 진행되는 크게 두 단계로 나뉜다
세부적인 진행 과정은 밑과 같다.

1) Welding window assembly
welding window는 KaK_aKmK_m을 모두 포함한다. 해당 과정에서 먼저 KaK_aTmaT_{ma}를 이용하여 MmM_m에 맞는 transformation이 진행된 후에 포함되도록 한다.

2) Merging Maps
MaM_aMmM_m을 합쳐 새로운 active map을 만든다. 중복되는 keypoints를 없에기 위해 각 match마다 MaM_aMmM_m를 비교하여 겹치는 부분을 삭제한다. keyframe들을 edge로 연결하여 map merge가 진행된다.

3) Welding bundle adjustment
MaM_aMmM_m사이의 BA를 통해 map point간 최적화가 진행된다.

4) essential-graph optimization
모든 merge된 map의 essential graph를 이용하여 pose-graph optimization이 실행된다. welding area의 keyframe들은 고정한 상태로 수행하여 전체 맵의 보정이 진행된다.

Visual-Inertial Map Merging

visual inertial map merging은 위의 visaul map merging과 비슷한 방법으로 시행되지만 1),3)단계에서 더 좋은 성능을 위해 수정되었다.

위의 그림을 통해 간단하게 비교해 볼 수 있다.

VI welding assembly
active map에 정보가 충분하다면 MaM_a에 바로 추가하도록하고, 정보가 충분하지 않다면 MaM_a를 정렬한 후에 결합하도록 한다.

VI welding Bundla Adjustment
keyframe KaK_a,KmK_m과 pose,velocity,bias를 이용하며 BA가 진행된다.

Loop Closing

Loop closing correction은 map merging 과 유사하지만 모든 맵이 아닌 place recognization에 의한 2개의 frame이 active map에 포함되는 경우에 일어난다. VI의 경우 항상 진행되는것이 아니라 computing이 과도해지는 것을 막기 위해 일정 threshold를 넘지 않을 경우에만 발생한다.


Atlas에서 GPS를 이용하여 SLAM성능을 높일 수 있을것 같다..
IMU 센서를 이용한 sensor fusion SLAM인 만큼 IMU에 관한 최적화 내용과 활용 방법에 대해서 자세하게 설명되어 있다.
해당 ORB SLAM3의 단점으로는 low-texture환경에서 잘 작동하지 않는다고 한다.
RGB-L SLAM이라는 추가논문이 있는데, 해당 논문을 읽고 적당한 환경을 고려해볼 필요가 있다고 느껴진다.

profile
아니야 뭘 또 수정해

0개의 댓글

Powered by GraphCDN, the GraphQL CDN