Xiang Gao, Tao Zhang 저자의 'Introduction to Visual SLAM from Theory to Practice' 책을 통해 SLAM에 대해 공부한 내용을 기록하고자 한다.
책의 내용은 주로 'SLAM의 기초 이론', 'system architecture', 'mainstream module'을 다룬다.
포스팅에는 기초 이론만 다룰 것이며, 실습을 해보고 싶다면 다음 github를 참조하자.
https://github.com/gaoxiang12/slambook2
목차
SLAM이란?
SLAM은 Simultaneous Localization And Mapping의 약자이다. 로봇 등의 움직이는 물체에 센서를 장착하여 priori information (사전 지식) 없이 움직임을 예측하고, 주변 환경의 모델(설명)을 구축한다.
이때, 만약 물체에 장착된 센서가 카메라라면, 이것을 Visual SLAM이라 한다.
SLAM을 real-time으로, prior knowledge 없이 해내는 것은 특히 어렵다. Visual SLAM에서는 연속적인 이미지(비디오)를 통해 경로와 맵을 예측할 필요 있다.
AI와 ML 기술을 활용한 Computer Vision이 발전함으로써 컴퓨터가 object, face 등을 이해하기 시작했다.
반면에 SLAM 분야에서는 카메라가 스스로의 움직임과 위치를 알아내기 시작했으나, 컴퓨터와 사람 간의 인식 능력 차이가 크다. 사람은 그들의 위치를 알 수 있고(측위, localization), 실시간으로 3차원 장면을 이해할 수 있으나, 컴퓨터에게 이를 적용하기는 매우 어렵다.
그래도 최근들어 우수한 발전이 이루어지고 있는데, 특히 mobile robot, self-driving car, Unmanned Aerial Vehicles (UAVs), VR, AR 등 SLAM 관련 application이 아주 많이 나타나고 있다.
SLAM은 Robotics와 Computer Vision 두 분야에서 동시에 핫한 주제로 떠오르고 있다. 또한 SLAM의 이론적인 framework는 충분히 발전되었으나 실생활에서의 적용에 있어 도전적인 부분이 많다.
다룰 내용
먼저 SLAM 기본 이론을 다룰 것이다. 여기에는 3D geometry, Computer Vision, State Estimation Theory, Lie Group/Lie Algebra 등이 속한다.
특히 3D geometry의 경우 SLAM 분야가 아니더라도 연구실에서 다루는 분야인 3D Vision의 기초이기도 하므로 꼭 숙지해둘 필요가 있을 것이다.
이 책은 특히 Visual SLAM을 집중적으로 다룬다.
Contents
책은 아래와 같은 목차를 갖는다. 이중 선택적으로 중요하고 기초적인 내용들만 다루어볼 것이다.
- Fundamental Knowledge
- Introduction to SLAM
- modules of typical SLAM system
- [Implementation] basic C++ programming in Linux
- 3D Rigid Body Motion
- rotation matrices, quaternions, Euler angles
- [Implementation] Eigen library
- Lie Group and Lie Algebra
- basics of Lie group
- [Implementation] Sophus
- Cameras and Images
- pinhole camera model, image expression in computer
- [Implementation] OpenCV, PCL(Point Cloud Library)
- Nonlinear Optimization
- state estimation, least squares, gradient descent methods, Gauss-Newton and Levenburg-Marquardt method
- [Implementation] curve-fitting problem, Ceres library, g2o library
- Introduction to SLAM
- SLAM Technologies
- Visual Odometry
- feature-based VO, feature extraction and matching, epipolar geometry calculation, PnP algorithm, ICP algorithm, BA algorithm (with OpenCV, Ceres, g2o)
- direct (intensity-based) VO, optical flow principle and the direct method
- Filters and Optimization Approaches
- backend optimization, BA (detail), sparse structure and the corresponding graph model (with Ceres, g2o)
- pose graph in backend optimization (with g2o)
- Loop Closure
- bag-of-word (BoW) based method (with DBoW3)
- Dense Reconstruction
- map building
- Practice: Stereo Visual Odometry
- Discussions and Outlook
- current(2021) open-source SLAM projects and future development direction
- Gaussian Distribution
- Matrix Derivatives
- Visual Odometry
그리고 책에 포함된 모든 소스코드는 다음 깃허브를 참조하자.
https://github.com/gaoxiang12/slambook2
Localization과 Map Building
어떤 로봇이 자동으로 움직인다고 가정하자. 이때 효과적인 navigation system이 없다면 로봇은 행동의 목표(타겟)가 뭔지도 모른 채 의미없이 돌아다닐 거나, 벽에 부딪혀 사고가 일어날 수도 있다.
이러한 Navigation System은 두 가지 중요한 질문을 통해 이루어진다.
- Were am I? - 측위 (Localization), 로봇이 스스로의 위치를 파악하는 것을 말한다.
- What is the surrounding environment Like? - Map Building, 외부 환경을 인식하는 것을 말한다.
센서 종류에 따른 측위
이를 위해서는 기본적으로 센서가 필요할 것이다.
센서는 크게 완전히 로봇에 내장된 non-intrusive sensor와 외부 환경에 영향을 받는 intrusive sensor 두 가지 종류로 나누어 볼 수 있다.
Intrusive sensor는 간단하고 효과적인 방법을 통해 직접적으로 로봇의 위치를 조작할 수 있다. 하지만 이러한 센서를 사용한 로봇은 특정 환경에만 제약적으로 사용이 가능할 것이다.
예를 들어 GPS 센서는 쉽게 측위가 가능하지만, 터널이나 실내 상황에서는 사용이 불가능하다.
반면 레이저 스캐너, wheel encoder, IMU 등의 non-intrusive sensor는 간접적인 물리량을 측정하기 때문에 측위를 위해 복잡한 과정이 필요하지만, 어떤 외부 상황(특히 전혀 모르는 새로운 환경)에서든 정확한 측위를 할 수 있는 알고리즘만 있다면 사용이 가능하다.
따라서 해당 연구 분야에서는 이를 self-localization이라 부른다.
SLAM에서 다루는 문제에서는 unknown environment를 중요하게 생각한다. 따라서 portable한 non-intrusive sensor를 사용하는 것이 주요 연구 주제이다. 특히 Visual SLAM의 경우 카메라를 다루는 데 집중한다.
Cameras
카메라는 크게 Monocular, Stereo, RGB-D 3가지 종류로 나뉜다.
직관적으로, Monocular Camera는 카메라 센서를 하나 사용하고, Stereo는 두 개를, RGB-D는 color image와 depth(카메라와 씬 사이의 거리) 정보까지 알아내는 카메라이다.
Visual SLAM에서 위 카메라 이외에 panorama camera, event camera 등을 사용한 연구가 이루어지고 있으나, 아직 mainstream은 아니다.
세 종류의 카메라의 특징을 각각 살펴보자.
Monocular Camera
Monocular Camera는 카메라 센서를 하나만 사용한다. 따라서 구조가 매우 단순하고, 값이 싸다는 장점이 있다.
그리고 output data는 '사진'이다. 그렇다면 사진 한 장으로 무엇을 할 수 있을까?
사진은 본질적으로 scene을 카메라의 imaging plane 위로 projection한 결과이다. 즉, 3차원 세계를 2차원 형태로 반영한 것이다. 여기서 하나의 차원 정보를 잃게 되는데, 이 정보를 depth(distance)라 한다. SLAM에서 이 depth 정보는 매우 중요하다.
Monocular Camera로 얻은 2D 이미지를 통해 3D 구조를 알고싶을 때에는 카메라의 view angle을 바꿔주어야 한다.
이와 비슷하게, Monocular SLAM에서는 scene의 구조를 이해하기 위해 카메라를 이동시켜 motion, distance, object의 size 등을 예측한다.
우리는 카메라가 오른쪽으로 움직이면 물체는 왼쪽으로 움직이고, 카메라에 가까운 물체가 먼 물체보다 빨리 움직이는 것을 알고 있다. 이를 '카메라가 움직일 때, 물체들의 움직임이 pixel disparity를 일으킨다'고 한다. 이러한 disparity를 수학적으로 계산하여 object가 얼마나 떨어져있는지 계산할 수 있다.
하지만, 이렇게 구한 object들이 얼마나 떨어져있는지의 값들은 상대적인 값일 뿐이다. 실제 Scene에서 물체들의 사이즈가 똑같은 factor로 커진다면, monocular camera로 얻은 이미지는 같은 모습일 것이다.
이는 Monocular SLAM으로부터 예측한 경로나 맵은 실제 경로나 맵에 어떠한 factor에 따라 달라질 것임을 나타낸다. 이것을 'scale'이라 하며, 이러한 Monocular SLAM의 특성을 scale ambiguity라 한다.
Stereo Cameras and RGB-D Cameras
이 두 카메라를 사용하는 목적은 object와 카메라 간의 거리를 측정하는 것, 즉 Monocular camera의 단점을 극복하는 것이다.
Depth(distance)를 알게 되면 하나의 frame으로부터 Scene의 3D 구조를 얻을 수 있다.
Stereo Camera
Stereo Camera는 monocular camera 두 개로 구성된다. 원리는 사람이 두 눈으로 물체 간 거리를 파악하는 원리와 같다.
두 카메라 간의 거리인 baseline을 통해 아래와 같은 방법으로 각 픽셀의 3D Position을 계산한다.
위 예시를 보면, 왼쪽 사진(by left camera)과 가운데 사진(by right camera)을 통해 depth image를 만들어낸 것을 볼 수있다.
Stereo Camera는 각 픽셀에 대한 depth를 추정해야하기 때문에 Baseline length가 길수록 멀리까지 측정이 가능하고, computational power가 많이 든다. 이에 따라 autonomous vehicle에 연결된 stereo camera는 매우 크다.
또한, stereo camera는 다른 센서가 필요 없이 두 카메라에서의 이미지를 비교하여 depth를 계산하므로, indoor와 outdoor environment 어디서든 사용이 가능하다는 특징을 갖는다.
이러한 stereo camera (또는 multi-camera systems)의 단점은 설정 또는 캘리브레이션 과정이 복잡하다는 것이다. 또한 stereo matching과 disparity(불일치) calculation에 있어 리소스를 매우 많이 필요로 하여 real-time depth map 제작 시 GPU나 FPGA 등의 장치가 필요하다.
RGB-D camera (Depth Camera)
RGB-D camera는 적외선이나 ToF(Time-of-Flight) 원리를 사용하여 depth를 구한다.
stereo camera의 계산량 문제 때문에 물리적인 센서를 새로 고안한 것인데, 대부분의 RGB-D 카메라는 좁은 measurement range, noisy data, 작은 field of view, 햇빛의 영향을 크게 받음, 투명한 물질을 센싱할 수 없음 등의 문제를 안고 있다.
따라서 SLAM에서 RGB-D 카메라는 실내 환경에서 주로 사용한다.
Classical Visual SLAM Framework
간단하게 전통적인 SLAM의 framework를 살펴보자.
Main stream을 간단히 설명하자면 다음과 같다.
- Sensor Data Acquisition : Visual SLAM에서 이 과정은 카메라 이미지를 얻고, 전처리하는 과정을 말한다. 움직이는 로봇에서는 motor encoder와 IMU 센서 값도 얻고, synchronization하는 과정도 포함한다.
- Visual Odometry (VO) : VO task는 인접한 frame (ego-motion) 간에 카메라가 어떻게 이동했는지를 추정하고, rough한 local map을 만든다. VO는 frontend 과정이라고도 한다.
- Backend Filtering/Optimization : backend는 서로 다른 time step에서의 카메라 포즈와 loop closing 결과를 받아 optimization을 적용하여 최적화된 trajectory와 map을 만든다. VO(frontend) 다음 과정이므로 backend라고 부른다.
- Loop Closing : Loop Closing은 accumulate된 drift를 줄이기 위해 로봇이 이전 위치로 돌아갔는지를 결정하여 backend에서의 optimization에 정보를 제공한다. 여기서 drift problem이란, VO에서 오차가 지속적으로 발생하는데 이것이 쌓여 발생하는 문제를 말한다.
- Reconstruction : 추정한 카메라 trajectory에 따라 task에 따른 map을 구성한다.
이러한 framework와 알고리즘은 기본적으로 완성되었고, 몇몇 vision, robotics 라이브러리에 필수적인 함수를 제공했다.
이 알고리즘에 따라 real-time localization과 정적 환경에서의 mapping을 수행하는 visual SLAM system을 구축했다.
따라서 아주 제한적인 환경(고정된 lighting condition, no human interface 등)에서는 visual SLAM 문제는 기본적으로 해결되었다.
Visual Odometry
Visual Odometry는 인접 이미지 프레임 사이의 카메라의 움직임이며, 가장 간단한 경우는 연속적인 이미지 사이의 움직임일 것이다.
이러한 카메라의 움직임을 모든 두 연속된 프레임 사이에서 추정하고 연결한다면 이것이 robot의 trajectory를 구성하고 localization problem을 해결하는 키가 될 것이다.
다음 그림을 보자.
오른쪽 사진은 왼쪽 이미지를 찍은 이후 카메라가 왼쪽으로 약간 회전한 상태임을 예측해볼 수 있다.
사람은 이와 같이 그 동안의 경험을 기반으로 쉽게 추정을 할 수 있지만, 컴퓨터로 이 추정을 하기엔 이러한 직관을 설명하기가 매우 어렵다.
만약 카메라가 얼마나 translation(평행 이동)과 rotation(회전) 했는지 알아야 한다면, 사람의 직관은 수학적 계산에 특화되어있지는 않으므로 정량적인 값을 바로 추정하기는 힘들다.
하지만 컴퓨터의 경우, 숫자로 이동이 묘사되기 때문에 사람의 직관보다는 계산해내기 쉬울 것이다.
그렇다면 어떻게 움직임을 정량적으로 표현할 수 있을까?
카메라의 움직임을 정량적으로 알기 위해서는 먼저 카메라와 spatial point 사이의 gemoetric relationship을 이해해야 한다.
Accumulative Drift
Visual Odometry는 분명히 Visual SLAM 문제를 해결하는 핵심 기술이다. 하지만, VO만 사용하는 것은 accumulative drift를 야기한다. drift의 사전적 의미는 '표류하다'로, 오류가 누적되어 경로 추적이 제대로 되지 않음을 의미한다.
이는 VO가 (단순한 경우에서) 오직 연속된 '두 장'의 이미지 사이에서 카메라의 움직임만 추정하기 때문이다. 이를 time step에 따라 연결시키는데, 각 time step에서 발생한 오류가 다음 VO 적용 시 그대로 적용되어 오류가 계속해서 쌓이게 되는 것이다. 이에 따라 결국 아래 그림과 같이 부정확한 추정을 하게될 것이다.
이러한 accumulated drift problem을 해결하기 위한 방법은 다음과 같다.
- Backend Optimization (Backend)
- Optimization을 통해 구현
- Loop Closing
- 로봇이 이전 위치로 돌아갈지를 감지하여 backend optimization에서 이 정보를 활용하여 전체적인 경로의 모양(shape)을 수정하도록 해준다.
Noises
하지만, 실제로는 아주 비싼 센서라 할지라도 어느 정도의 noise(error)가 존재한다. 게다가, 센서의 성능은 자기장, 온도 등 주변 환경에 따라 영향을 받는다.
따라서 이미지로부터 카메라 움직임을 추정하기 위해서는 다음을 고려해주어야 한다.
- 추정 과정에서 얼마나 많은 noise가 발생하는가?
- 다음 time step에 얼마나 해당 noise가 전달되는가?
- 현재 추정에 대한 신뢰도가 어느 정도인가?
Backend Optimization 과정에서 noise가 포함된 데이터를 입력받아 추정을 할 때의 문제를 해결해주고, uncertainty를 계산한다. (이때 추정하는 것은 로봇의 trajectory와 environment map이다.)
하지만, SLAM framework의 Visual Odometry 과정은 frontend로, backend에서 최적화될 데이터와 초기값을 제공한다. 이 때는 오직 데이터 자체를 다룬다.
따라서 SLAM framework 중 Visual Odometry 과정은 image feature extraction and matching과 같은 Cmputer Vision 주제와 관련이 깊은 반면, backend 과정은 state estimation 분야와 관련이 깊다.
Loop Closing
Loop Closing(Loop Closure Detection)은 주로 SLAM에서 위치 추정의 drifting problem을 해결한다.
Loop Closing의 원리는 다음과 같다.
로봇이 어느 정도 움직인 후, 제자리로 돌아왔다고 가정하자. drift로 인해 추정 결과는 origin으로 되돌아오지 않을 수도 있다.
여기서 만약 로봇이 origin으로 돌아왔다는 것을 알도록 하는 방법이 있다면, 추정된 location을 origin으로 당겨옴으로써 drift를 제거할 수 있다.
Visual Loop Detection
Loop Closing은 localization과 map building 둘 다에 밀접한 관련이 있다. 사실 맵을 구축하는 목적은 로봇이 갔던 곳을 알기 위해서이다. 이에 따라 Loop Closing을 구현하기 위해서는 로봇이 이전에 방문했던 곳을 알도록 할 필요가 있다. 이를 Loop detection이라 한다.
예를 들어, robot의 시작점에 marker(QR code 등으로)를 둔다. 만약 이 marker가 보인다면 로봇이 시작점으로 돌아왔음을 알 수 있다. 하지만 marker는 본질적으로 intrusive sensor이므로 환경의 영향을 많이 받는다.
따라서 marker보다는 nonintrusive sensor를 사용하여 image 자체를 통해 Loop Closing을 구하는 것이 바람직할 것이다. 즉, image의 similarity를 감지하여 이전에 방문했는지를 확인하는 것이다. 이렇게 두 이미지의 similarity를 계산하는 알고리즘을 visual loop detection이라 한다.
Loop를 감지하면 그 결과를 통해 backend optimization algorithm에서 trajectory와 map을 조정할 것이다. 따라서 충분히 reliable한 loop detection이 주어져야 cumulative errors를 제거할 수 있고, 일관성 있는 trajectory 및 map을 얻을 수 있을 것이다.
Mapping
Mapping이란, map building과 같은 의미로, 지도를 구축한다는 의미이다. 같은 환경에 대한 지도를 구축한다고 해도, 그 표현 방식과 적용할 application에 따라 다음과 같은 다양한 map이 있을 수 있다.
이전에 언급한 VO, backend optimization, loop closing과 달리 Map building은 특별한 알고리즘이 없다. SLAM에서 어떻게 적용되는가에 따라 map의 형태가 매우 다양하기 때문이다.
일반적으로, 크게 'metrical maps', 'topological maps'로 나뉜다.
Metric Maps
Metric Map은 지도 상의 물체의 정확한 metrical location을 강조한다.
Metric Map은 또다시 sparse한지, dense한지에 따라 분류된다.
먼저 Sparse metric map은 scene을 compact한 형식으로 나타내며, 모든 물체를 표현하지는 않는다.
예를 들어, 자율주행에서 도로 scene에 대한 sparse map을 구성한다면, 차선과 교통 표지판 등의 주요 landmark만 골라 표현할 것이다.
반면에 Dense metric map은 scene에 보이는 모든 물체를 표현한다. 보통 2D metric map은 해상도에 따라 2d grid로, 3D metric map은 voxel grid로 이루어진다. 여기서 작은 grid는 occupied(물체 있음), not occupied(물체 없음), unknown(모름)과 같이 세 가지의 state를 가질 수 있다.
Localization에서는 sparse map으로 충분할 수 있으나, navigation에서는 모든 object를 감지하여 충돌을 피해야 하므로 dense map이 주로 쓰인다.
Topological Maps
위에서 언급한 metrical map은 상대적으로 정확한데 비해, topological map은 map의 구성 요소 간의 관계를 강조한다.
따라서 topological map은 그래프로 구현되는 경우가 많다. 그래프의 node는 element, edge는 두 element 간의 관계성(연결되었는지 아닌지)을 나타내는 것이다.
따라서 주어진 환경의 복잡한 구조(정밀한 location, detail 등)를 표현하기에는 적합하지 않고, toppological map을 통해 navigation, path planning 등의 task에서 node, edge를 어떻게 구성할 것인지 등에 대한 해결해야 할 문제가 많다.
최근댓글