Introduction to Visual SLAM From Theory to Practice (0)

yeonsoo·2022년 11월 22일
0


SLAM이라는 분야가 워낙 여러 연구분야를 다 갖다붙인 합성물같은 특성을 가지다보니 단일 연구분야로서는 꽤 광범위한 배경지식을 요구한다. 그래서 SPARK Lab에서 공개한 SLAM 라이브러리인 Kimera를 처음 보았을 때 SLAM 라이브러리가 가질 수 있는 가장 알맞은 이름이라며 감탄했던 기억이 있다. 가능한 모든 것을 조합해 어떻게든 작동하게 만드는 모습이 “안되면 되게 하라” 라는 공학정신을 그대로 보여주는 듯 한데, 이런 점이 SLAM이라는 분야의 매력이 아닌가 생각한다.
카메라 센서의 가격적인 면이나 접근성의 경쟁력 덕분에 여러 고기능 센서들의 등장과 유행에도 불구하고 Visual SLAM은 확고한 파이를 유지하고 있는데 (사실 정확히는 pure Visual SLAM보다는 Visual Inertial SLAM 쪽이 대세이긴 하지만), Visual SLAM의 경우 컴퓨터 비전부터 카메라 기하학, 선형대수와 최적화 이론 등 여러 파트에 대한 기본적인 이해를 필요로 하고, 입문자의 입장에서는 어떤 요소가 필요하고 어느 깊이의 이해가 필요한지 갈피를 잡기가 쉽지 않다.

나 또한 회사에서 Visual SLAM 기술 개발을 계속 맡고 있고 논문도 썼지만서도 광활한 배경 이론의 필드를 헤매며 쌓아올린 지식이 여전히 빈공간이 많은 모래성 같다는 찝찝함을 지우기 힘들었다. 그러던 와중 오로지 Visual SLAM이라는 주제로 한정해 그 안에서 활용되는 모든 개념을 딱 그만큼의 범위로 집약해놓은 좋은 요약서를 발견하게 되어 한 번 이론적인 토대를 재점검하고 재구조화하는 시간을 가지기로 했다. 동시에 같은 분야를 공부하는 분들께도 참고 자료로 활용이 되었으면 하는 마음에 혼자 읽고 이해하는데 그치지 않고 열심히 포스팅을 해보려고 한다. 얼마나 걸릴지 정확히는 모르겠지만, 꾸준히 업로드 하다보면 언젠가 마지막 장을 넘길거라 생각하면서 첫 포스트 시작!

아래는 Xiang Gao와 Tao Zhang의 <Introduction to Visual SLAM>을 읽고 번역정리+추가적인 코멘트를 단 내용이다.
말은 가능하면 간소화하고, 이론적으로 더 참고할만한 부분은 추가적인 코멘트를 넣었음.
저자에 의해 모든 자료가 무료 배포되었음. 아래 링크 참고
📘 영어판 도서 파일: https://github.com/gaoxiang12/slambook-en
📂 practice 코드: https://github.com/gaoxiang12/slambook2

0. 서문

0.1 이 책은 무슨 내용을 다루고 있을까❓

  • SLAM (Simultaneous Localization and Mapping)
    : 특정 센서들을 갖춘 로봇(또는 움직이는 강체)이 사전 정보 (priori information) 없이 자신을 둘러싼 주변 환경을 모델링하고, 동시에 그 환경 속에서 자신의 모션을 추정하는 작업을 의미한다. 그 중에서도 카메라 센서를 메인으로 사용하여 이를 수행하는 경우를 Visual SLAM 이라고 한다.

일단, 위 설명에서 나타나듯이 SLAM은 기본적으로 localization과 map building 이라는 두 가지 문제를 동시에 푸는 것을 목표로 한다. 즉, 센서 자신의 위치를 추정하면서 동시에 자신을 둘러싼 환경에 대한 모델을 추정하는 것 까지 해결해야 하는 것이다. 이를 위해서는 센서 데이터에 대한 상당한 지식이 필요하다. 여러 다른 센서는 그들만의 특정한 형태로 외부세계를 관측하는데, 이를 활용하기 위해서는 각기 다른 종류의 관측치들을 해석하는 각각의 접근법을 알아야만 한다. 여기에 더해 아무런 사전정보도 주어지지 않는다는 기본 가정과 실시간성을 만족해야한다는 점이 SLAM의 까다로운 부분이다. visual SLAM의 경우 우리는 연속적인 이미지 세트(=비디오)를 가지고 경로와 맵을 추정해나가야한다.

말만 들으면 어느정도 직관적인 문제로 보이기도 한다. 우리가 낯선 환경에 입장하게 되었을 때 하는 게 똑같은 일 아닌가? 문제는, 우리가 프로그램을 작성해서 컴퓨터가 그 똑같은 일을 하게 할 수 있냐는 것이다. 컴퓨터 비전이 막 탄생했을 때, 사람들은 언젠가는 컴퓨터가 인간처럼 행동할거라- 세상을 보고, 관찰하고, 주변 환경을 이해하는- 생각했고, 처음에는 이것이 그리 불가능하거나 어려운 목표처럼 여겨지지 않았다. 하지만 연구가 진행되면 될수록 드러나는 사실은 컴퓨터가 인간의 사고를 흉내내는 것은 절대 쉬운 일이 아니라는 것이었다. 꽃, 나무, 벌레, 새, 동물들은 컴퓨터에서는 너무나 다르게 기록되었다: 그것들은 컴퓨터 안에서는 그냥 숫자로 이루어진 행렬일 뿐이었다. 컴퓨터가 이미지의 내용을 이해하도록 만드는 것은 우리 사람이 그 숫자 덩어리를 이해하는 것 만큼이나 어려운 일이었다. 하지만 몇십 년에 걸친 고군분투 끝에 연구자들은 드디어 성공의 실마리를 잡기 시작했다. 인공지능(AI)과 머신러닝(ML) 기술에 힘입어 컴퓨터가 물체, 얼굴, 목소리, 텍스트를 조금씩 인식할 수 있게 된 것이다 (물론 우리 사람의 사고과정과는 여전히 다르지만).

한편으론, 거의 30년에 달하는 발전 과정을 거치며 SLAM에서도 카메라가 자신의 움직임을 파악하고 현재 위치를 알 수 있게 되기 시작했다. 연구자들은 성공적으로 여러 다양한 실시간 SLAM 시스템을 설계하였고, 그들 중 일부는 심지어 실시간 내에 3차원 공간 재구성까지도 수행한다. 더 좋은 소식은 근 몇년 새 SLAM에 관련된 적용 분야가 엄청나게 넓어졌다는 점이다. 로봇 청소기, 자율주행차, 무인항공기(UAVs), 가상현실(VR), 증강현실(AR) 등등.. SLAM은 현재에 와서 너무나 중요한 연구분야가 되었다.

21세기 이후 visual SLAM은 이론과 실제적인 부분 모두에서 상당한 변화와 혁신을 겪었으며 점차 실험실에서 실제 세계로 이동하고 있다. 하지만 동시에 SLAM 관련 기초 자료는 여전히 매우 부족해 SLAM의 매력에 빠져든 입문자들이 마땅한 가이드가 없어 고생하는 안타까운 광경을 많이 보아왔다. SLAM의 이론적 프레임워크는 많은 시간을 지나며 이제 완전히 자리를 잡았지만, 전체적인 SLAM 시스템을 구현하는 것은 여전히 매우 어렵고, 높은 수준의 전문 지식을 필요로 한다. 이 분야를 처음 접하는 연구자들은 상당한 양의 산재된 지식을 이 책, 저 책 뒤적이며 조각맞추기를 하듯이 공부하고, 정말 필요한 핵심 내용에 접근하기 위해 멀리서부터 돌아오는 수고를 하는 경우가 많다. 이 책은 visual SLAM에서 쓰이는 모든 기술을 체계적으로 설명한다.

SLAM의 이론적 배경과 시스템의 구조, 주류로 쓰이는 다양한 모듈들에 대한 설명을 제공하며, 동시에 이 모든 것에 대한 실습 파트를 구성해놓았다. 이 책에서 소개하는 모든 필수 알고리즘은 독자들이 직접 실험해보면서 보다 깊이 있는 이해를 할 수 있도록 바로 돌아가는 코드와 함께 제공된다. Visual SLAM은 결국 실제 응용을 위한 기술이므로 수학 이론을 구경하고 이해하는 것은 아름다울 순 있지만 결국 이것을 코드로 변환할 수 없다면 모든 이론은 뜬구름에 불과하다. 우리는 실습이 진정한 지식(그리고 진정한 사랑)을 가져온다고 믿는다! 알고리즘으로 양 손을 더럽힌 후에야 당신은 진정으로 SLAM을 이해했고 SLAM과 사랑에 빠졌다고 주장할 수 있을 것이다. SLAM의 긴 역사에서 등장한 모든 알고리즘과 그 변형에 대한 완전한 소개는 매우 어려울 뿐 아니라 사실 불필요하다. 우리는 SLAM 트리의 줄기를 보여주되 복잡하고 이상한 모양의 쓸데없는 잎은 생략하는 것이 효율적이라고 생각한다. 이 책의 목표는 SLAM 입문자가 자격을 갖춘 연구원 또는 개발자로 빠르게 성장할 수 있도록 만들어주는 것이다. 그렇지만, 이미 경험이 풍부한 SLAM 연구자라도 이 책은 익숙하지 않은 영역을 조명하고 새로운 통찰력을 제공하는 역할을 할 수 있을 것이다.

0.2 이 책을 어떻게 활용하는 것이 좋을까❓

이 책은 마치 강의와 같이 구성되어있다. 각 lecture는 논리적 순서에 따라 하나의 특정 주제를 설명하며, 각 장은 이론 파트와 실습 파트로 이루어져있다. 이론파트에서는 알고리즘을 이해하기 위한 필수 수학 개념을 대부분의 수학교재와 같은 definition / theorem / inference 형식이 아닌 서술형식으로 따라가기 쉽게 소개하고, 실습 파트에서는 코드 제공과 함께 각 부분의 의미를 설명하고 여러 실험 결과를 논의해 볼 것이다. 실습 이라는 단어가 제목에 보인다면, 바로 컴퓨터를 켜고 함께 프로그래밍을 해 볼 것을 추천한다.
책은 크게 두 파트로 나뉜다.

  • 기초적인 수학 개념에 집중하는 part 1
  1. 서문 (지금 읽고 있는 부분): 책의 내용과 구조를 설명
  2. Lecture 1: SLAM 시스템에 대한 전반적인 설명. 전형적인 SLAM 시스템을 이루는 각 모듈을 살펴본다. 실습 파트에서는 리눅스 환경에서의 기본적인 C++ 프로그래밍과 IDE 활용을 소개한다.
  3. Lecture 2: 3D 공간 상에서 rigid body의 모션을 다룬다. 회전 행렬, 쿼터니언, 오일러각을 배우고, 실습 파트에서는 Eigen 라이브러리를 소개한다.
  4. Lecture 3: Lie group과 Lie 대수를 살펴본다. 처음 들어봤더라도 걱정하지 말 것. Lie 그룹의 기본을 배우고, Sophus를 통해 그들을 다루는 법을 배울 것이다.
  5. Lecture 4: 핀홀 카메라 모델과 컴퓨터 내에서 이미지가 어떻게 표현되는지를 배운다. OpenCV를 사용해 카메라의 intrinsic / extrinsic parameter를 찾고, PCL을 통해 depth 정보를 이용해 point cloud를 생성해본다.
  6. Lecture 5: 비선형 최적화 (상태 추정을 포함한), 최소자승, 그리고 가우스-뉴턴법이나 Levenburg-Marquardt method와 같은 gradient descent 방법에 대해 살펴본다. Ceres와 g2o 라이브러리를 이용해 curve-fitting 실습을 진행한다.
  • VO에서 시작하여 SLAM에 직접적으로 쓰이는 알고리즘들을 다루는 part 2
  1. Lecture 6: VO에서의 대세인 feature 기반 visual odometry에 대해 배운다. feature extraction과 matching, 에피폴라 기하학, Perspective-n-Point(PnP) 알고리즘, Iterative Closest Point(ICP) 알고리즘, Bundle Adjustment(BA) 등등을 살펴본다. 이 알고리즘들을 OpenCV에서 호출하거나, Ceres, g2o를 이용해 커스텀 최적화 문제를 설계함으로써 구현해본다.
  2. Lecture 7: direct(또는 intensity 기반) VO에 대해 살펴본다. direct method와 optical flow의 원리에 대해 배우게 된다. 실습 파트에서는 single-layer / multi-layer optical flow를 작성하고 two-view VO에 대해 direct method를 구현한다.
  3. Lecture 8: 백엔드 최적화. Bundle Adjustment에 대해 자세히 논의하고 sparse한 구조와 그것에 상응하는 그래프 모델 간의 관계를 보인다. 실습 파트에서는 같은 BA 문제를 Ceres와 g2o를 이용해 각각 구현해 볼 것이다.
  4. Lecture 9: 백엔드 최적화의 포즈 그래프에 대한 내용을 다룬다. 포즈 그래프는 BA를 위한 좀 더 간단한 표현법으로, 모든 맵 포인트를 키프레임 간의 constraint로 변환해 해석한다. g2o를 활용해 포즈 그래프를 최적화해본다.
  5. Lecture 10: Bag-of-Word(BoW) 방식을 중점으로 하여 loop closure detection에 대해 설명한다. DBoW3를 이용해 이미지로부터 dictionary를 학습하고 비디오 내에서 loop를 탐지해 볼 것이다.
  6. Lectuer 11: map building. 단안 SLAM에서 어떻게 픽셀의 깂이값을 추정하는지, 그리고 그 추정치가 왜 믿을만하지 않은지 설명한다. 단안 깊이 추정과 비교했을 때, RGB-D 카메라를 이용해 dense map을 구축하는건 훨씬 쉽다. 실습에서는 단안 이미지로부터 에피폴라 라인 서치와 패치 매칭을 통해 깊이를 추정하고, 이를 이용해 point cloud map을 구축해보고, 여기에 더해 RGB-D 데이터를 이용해 octagonal treemap을 구성해 볼 것이다.
  7. Lecture 12: 스테레오 VO를 위한 실습 챕터. 지금까지 배운 내용을 활용하여 프레임과 맵포인트 관리를 어떻게 할 지, 키프레임 선정은 어떻게 할 지, 최적화 컨트롤은 어떻게 할 지를 생각해보며 VO 프레임워크를 짜본다.
  8. Lecture 13: 현재 존재하는 오픈소스 SLAM 프로젝트들을 소개하고 앞으로의 개발 방향에 대하여 논의한다.

마지막으로, 지금 위의 얘기가 무슨 말인지 전혀 이해하지 못하겠다면.. 축하한다! 이 책은 당신을 위한 것이다.

0.3 대상 독자

이 책은 SLAM을 배우고자 하는 학생들과 연구자들을 위한 책으로, 독자들은 어느 정도의 특정 전제조건은 만족하여야 한다. 우리는 다음의 지식은 독자들이 이미 갖추고 있을 것으로 예상하고 내용을 전개한다:

  • 미적분학, 선형대수, 확률 이론. 최소한 벡터랑 행렬이 뭔지, 미적분의 의미가 무엇인지는 알아야 한다. 이 이상의 수학적 지식은 책에서 어느정도 설명을 제공한다.
  • 기본적인 C++ 프로그래밍. SLAM 개발의 주 언어는 C++이다. 기본 내용과 문법에 익숙할 필요가 있다. 클래스가 무엇인지, STL이 무엇인지, 템플릿 클래스는 어떻게 사용하는지 등..
  • 리눅스 기초. 제공되는 코드 또한 리눅스 기반이며, 우리는 SLAM 연구를 위해서는 리눅스를 사용하는 것이 백번 낫다고 강력히 주장한다. 이 책을 따라가다보면 여러분도 이 의견에 동의하게 될 것이라 생각한다. 윈도우 관련 이슈는 질문하지 말길 바란다. 독자들은 엄청난 리눅스 스킬을 갖출 필요는 없지만, 최소한 터미널을 켜고 코드가 있는 디렉토리로 이동할 줄은 알아야 한다.
profile
to be enterprising

0개의 댓글