Visual SLAM - overview

JunseoMin·2024년 9월 21일

VisualSLAM

목록 보기
2/3
post-thumbnail

Introduction

SLAM과 visual SLAM에 관해 가볍게(?) 내용을 정리한 포스트 입니다.

What is SLAM?

SLAM은 무엇일까요? 약어라서 감이 안잡힐 수도있고, 이 글을 읽는다면 이미 알고있을 경우가 많을것 같긴 합니다. 하지만 짧은 지식들을 전달하고자 한번 설명을 해보자면 SLAM은 Simultanious Localization and Mapping의 약어 입니다. 직역해보자면 동시적 위치추정 및 지도작성이 되지요.

로봇이 어떤 task를 수행할때, 특히 사람이 접근하기 어렵거나 혹은 귀찮거나 등등의 상황에서 로봇은 자신의 위치를 특정한다면 해당 task를 수월하게 혹은 수행이 가능하도록 할 수 있는 경우가 많이 있습니다(우주 탐사, 배달로봇 etc...). 이때 해당 위치를 특정하는 것을 localization이라 하고, 위치를 특정하기위한 기준을 만들어놓는것(?) 을 mapping이라 합니다. 지도를 보고 어느 도로에 있는지를 추정하는 느낌이라 보시면 됩니다.

SLAM은 위의 두 과제 localization & mapping을 묶어놓은 것입니다. SLAM을 해내기 위해서 아주 정확한 정보를 주는 센서로, GPS, AR마커 등등의 외부에서 정보를 받을 수 있는 좋은 친구들이 있지만 길거리에 AR마커를 붙여둘 순 없고.. GPS가 실내에서는 작동하지 않는 경우도 많이 있기에, SLAM이라는 문제에서는 LiDAR나 camera같은 로봇에 붙어있는 센서들을 이용해서 문제를 해결하는 것을 목표로 진행합니다. 특히 저는 이 시리즈에서 camera를 이용한 SLAM, Visual SLAM에 대해 포스트를 할 예정입니다.

Visual SLAM이니만큼, camera에 대해 알아보도록 하겠습니다.


Camera

여러가지 camera가 존재합니다. 단안카메라, 양안카메라, RGB-D카메라 등등의 카메라가 존재하지요. 지금은 단안 카메라, 양안카메라(stereo camera), RGB-D카메라에 대해 설명하고 넘어가도록 하겠습니다.(앞으로 양안카메라는 stereo camera로 부르도록 하겠습니다...)

단안카메라

단안 카메라는 옛~날에 핸드폰에 붙어있던 카메라를 생각하면 될 것 같아요.

요런 친구들이 단안 카메라였죠. 이름에서 알 수 있듯 이 카메라는 눈인 한개인 카메라 입니다. 단안 카메라로는 이미지를 기억할 수 있고 해당 이미지에서 feature를 뽑아내 볼 수 도 있습니다. 하지만 이런 단안 카메라 에서는 depth정보를 알 수 없습니다.

좀 더 아는 바를 설명하자면(정확하지 않을 수 있음), 우리가 한쪽 눈으로 볼때 원근감이나 가까운 물체는 느리게 이동하고 먼 물체는 빠르게 이동하는 등의 '감'을 느낄 수 있지만 그 '감'이 정확하게 해당 물체의 크기나 거리를 알 수는 없습니다.

SLAM에서는 그런 물체들이 가진 feature나 landmark를 이용하여 현재 위치를 파악하는데 이용하지만, 단안 카메라에서는 한계가 존재하여 학자들께서는 stereo camera나 RGB-D camera를 SLAM에 이용합니다.

Stereo camera (양안 카메라) & RGB-D camera

stereo camera와 RGB-D 카메라는 depth정보를 제공해 줄 수 있는 camera입니다.

stereo camera


stereo카메라는 두개 (혹은 이상의) 단안 camera를 이용하여 두 카메라 사이의 거리(baseline)를
이용하여 거리 정보를 제공합니다.

stereo카메라는 깊이 정보를 제공해 주긴 하지만, 두 카메라사이의 거리를 이용하여 정보를 주는만큼 계산 단계에서 computation문제와 픽셀의 영향을 많이 받는다는 단점이 존재합니다.

RGB-D camera

RGB-D camera는 ToF를 이용하여 depth 정보를 제공해 줍니다. 직접적으로 빛을 쏴 거리를 측정해 주는만큼 위의 stereo camera보다 computation이 적습니다. 하지만 대부분 RGB-D camera는 FOV(Field of View), noise, 투명한 물체 측정 불가 등등의 문제점이 아직 존재한다는 단점이 있습니다.

이런 센서들의 불확실성과 한계들로 인해 SLAM에는 많은 문제들이 남아있지만 (그렇다고 알고있습니다..) 해당 문제들을 연구자 분들께서 연구하여 꽤 좋은 성능을 가진 SLAM알고리즘들이 많이 제시되었습니다.


Visual SLAM Framework

자율주행을 위한 Visual SLAM책에서 사용된 그림들입니다.

전체적인 Visual SLAM의 module과 각 module의 기능에 대해 설명하도록 하겠습니다.

정확한 설명이 아닌 rough한 설명이고, 전체 process에 이런게 있구나 정도로 이해하면 될 것 같습니다. 사용되는 모듈들과 간단한 설명들은 밑과 같습니다.

  1. sensor input & prerocessing: 센서 입력을 받고 전처리를 진행함 ( 동기화 하는 경우도 있음)

  2. Visual Odometry (frontend): 인접한 몇가지의 scene을 이용하여 local map을 형성함.

  3. Filters optimization (backend): 위의 Visual Odometry(VO)를 이용하여 전역적인 궤도와 지도를 생성함.

  4. LoopClosing: backend과정에서 성능 향상을 위해 사용되는 부분

  5. Reconstruction: 지도 생성

Visual Odometry (VO)

VO는 연속된 두개 이상의 이미지들을 이용하여 카메라의 움직임을 측정하는 부분입니다.

위의 두 사진을 보면 left -> right로 이동할때 카메라가 오른쪽으로 이동했다는 것을 우리는 '감' 으로 이해할 수 있습니다. 이때 우리는 visual odometry(이하 VO)를 이용했다고 할 수 있는데 VO에서는 전역적인 이동을 생각하지 않고, 인접한 몇개의 secne에서의 움직임을 나타낼 수 있습니다.

사실 정확하게 VO가 계산된다면 이 단계에서 SLAM을 해결했다고 볼 수도 있을것 같습니다(정확하지 않음). 하지만 VO를 구하는 과정에서 어떤 noise가 발생한다면 해당 nosie가 누적되어 전체적인 map이나 이동과정이 일관되지 않을 수 있지요. 이런 noise를 줄이고 일관된, 조금더 valid한 map을 만들기위해 사용되는 과정이 backend과정입니다.

Filters optimization (Backend)

일반적으로 상태 추정의 관점에서 SLAM의 문제를 backend optimization문제라고 한다고 합니다. VO를 연산하는 과정에 있어서 결과들 간의 noise누적으로 인한 drift나 VO의 신뢰도 문제들을 backend에서 MAP(maximaum a posteriori) 등 을 이용하여 해결하고자 합니다.

Backend에서는 filter와 non-linear optimization을 이용하여 위의 문제들을 해결합니다.

MAP관련 포스트 해당 포스트에 MAP에 관한 내용이 정리되어 있습니다..!

Loop Closure

Loop Closure는 이전에 도달한 위치를 이용하여 backend단계에서 더 좋은 성능을 발휘하도록 도와주는 모듈을 의미합니다.

VO에서 drift가 발생하여 정확하지 않은 정보가 backend에 도달할 경우, 이전에 지났던 위치들에서 보정하여 전체 map이 보다 정확하도록 도울 수 있습니다. 멀어지거나 틀어진만큼 보정해주는 방식으로 말이죠. 결국 이미지 데이터의 유사성을 파악하는데 이용합니다.

Reconstruction(Mapping)

Reconstruction단계에서는 인지된 결과, VO를 바탕으로 map을 형성합니다. map의 종류로는 metric map, topology map등이 있습니다.

metric map

metric map은 sparse map과 dense map으로 나누어집니다.

sparse map은 map에서 로봇과 특정한 위치를 나타낼 수 있는 landmark를 기준으로 특정한 점들을 이용하여 map을 구성하는 것을 목표로 합니다.

반대로, dense map은 모든 정보들을 이용하여 구성하는 것을 목표로 합니다. 주로 voxel을 이용하여 구성합니다.

Topology map

topology map은 map의 각 요소들 간의 관계를 중심으로 map을 구성합니다. graph형태로 구성되어있고, 각 노드간의 연결성만 집중하여 나타냅니다.


SLAM의 수학적 공식화

SLAM 기초 포스트 해당 포스트에 SLAM의 공식화에 관한 설명이 적힌 논문 리뷰가 작성되어 있습니다..!!

SLAM문제를 해결하기 위해 일반적인 공식화 내용을 담았습니다.

SLAM은 motion model과 observation model로 나눌 수 있습니다. motion model은 로봇의 위치와 자세에 관한 model이고, observation model은 어떤 위치에서의 관측에 관한 model입니다.

Motion model

우선 수식부터 적고 이야기를 시작하겠습니다.

xk=f(xk1,uk,wk)x_k = f(x_{k-1},u_k,w_k)

로봇은 시간을 기준으로 움직입니다. 이때 특정한 시간을 kk라 하고 해당 시간에서의 움직임 입력을 uku_k, 입력에 따라 발생할 수 있는 noise를 wkw_k라고 하겠습니다. 그럼 로봇의 위치와 자세를 나타내는건 이전 위치 및 자세 xk1x_{k-1} 에서 uku_k 만큼 이동한것에 noise가 추가된 형태라고 볼 수 있습니다.

위의 그림에서 uu들이 의미하는 바와 실제 위치 xx 그리고 그차이를 ww라 보시면 됩니다.

Observation model

zk,j=h(yj,xk,vk,j)z_{k,j} = h(y_j,x_k,v_{k,j})

위 관찰모델이 의미하는 것은 특정 위치 xkx_k에서 어떤 랜드마크 yjy_j를 볼때 vk,jv_{k,j}의 noise와 함께 관찰된 정보 zk,jz_{k,j}가 나타난 다는 것을 의미합니다.

위의 두 모델에서 obserbation model이 의미하는것은 mapping에 관한, motion model이 의미하는 것은 localization에 관한 문제를 모델링한것입니다. 어떤 정확한 함수f,hf,h가 아닌 일반적인 함수를 의미하도록 설명한 것이고 해당 함수를 센서에 맞게 작성하여 실제 값에 가깝도록 error를 최소화 하도록 하는것이 목표 입니다.

두 방정식의 특징(선형/비선형, 가우시안/비 가우시안 등등) 에 따라 어떤 형식의 kalman filter혹은 graph optimization등등의 방법을 이용하여 문제를 해결하고자 합니다.


이 포스트 에서는 SLAM에 대한 전체적인 이해와 모듈 및 센서에 대한 간단한 설명이 적혀져있고, 이 뒤로 c++를 이용한 모듈 구현 및 Visual SLAM설명에 대해 작성할 예정입니다.

오류가 꽤나 많을 수 있으니 주의하고 확인하면서 읽어주시면 감사하겠습니다!

profile
아니야 뭘 또 수정해

0개의 댓글