본문 바로가기

입문 SLAM 14강 (번역)

입문 Visual SLAM 14강 : 1장. 선행지식

Preface

이 문서는 중국어 원서인 “입문 Visual SLAM 이론에서 연습까지 14 강(视觉SLAM十四讲 从理论到实践)” 책의  원저자로부터 한글 번역 허가를 받고 구글 번역기를 이용하여 작성된 문서입니다. 본 문서는 아래의 Contribution을 특징으로 합니다.

 

  • 중국어 전공 서적을 구글 번역기를 이용해 한글로 초벌 번역했습니다.
  • 초벌 번역 후 매끄럽지 않은 문장은 문맥에 맞게 수정되었습니다. 
  • 문서 내용 중 참고할만한 웹문서를 코멘트로 추가했습니다.  
  • SLAM 연구에서 주로 사용되는 용어는 한글로 번역된 용어보다 주로 사용되는 영어로 된 용어 그대로 표시하였습니다.

그럼에도 불구하고 부정확하거나 매끄럽지 않은 부분이 있을 수 있습니다. 그런 부분은 코멘트로 제안해주시면 반영하도록 노력하겠습니다. 또한 읽으시다가 잘 이해가 가지 않는 부분도 코멘트로 질문해주시면 답변해드리도록 하겠습니다.

 

번역 참가자: 

신동원 ( 광주과학기술원 박사과정)

김선호 ( VIRNECT 선임연구원)

조원재 ( 일본국립농업기술혁신공학센터 연구원)

장형기 ( Imperial College London 석사과정)

박준영 ( 광주과학기술원 석사과정)

 

2018년 10월 1일

신동원 드림


제1장. 선행지식 

1.1 이 책의 내용

  이 책은 Visual SLAM을 소개하는 책이며, Visual SLAM을 주제로 한 최초의 우리나라 서적 일 것입니다.

  갑작스럽지만 한 가지 질문을 던져보죠..

 

SLAM은 무엇일까요? 

 

  SLAM이란 Simultaneous Localization and Mapping의 약자로 "동시적 위치 추정 및 지도 제작"으로 번역됩니다 [1]. 이는 주변 환경에 대한 사전 정보가 없는 상황에서 특정한 센서를 이용해, 이동 중에 환경의 모델을 확립하고 자신의 움직임을 추정합니다. 여기서 활용하는 센서가 주로 카메라인 경우 이를 "Visual SLAM"이라고 합니다.

  이 책의 주제는 Visual SLAM입니다. 여기에서는 의도적으로 많은 정의를 한 문장에 넣었으며 이를 통해 독자가 더 명확한 개념을 갖기를 바랍니다. 우선, SLAM의 목적은 "localization"과 "mapping"의 두 가지 문제를 해결하는 것입니다. 다시 말하면, 센서 자체의 위치를 추정하면서 동시에 주변 환경의 모델을 수립하는 것이 필요합니다. 그러면 이 문제를 어떻게 해결할 수 있을까요? SLAM 문제에서는 센서 정보에 대한 이해를 필요로 합니다. 센서는 특정 형태로 외부 세계를 관찰할 수 있지만 이러한 관찰을 활용하는 구체적인 접근 방식은 일반적으로 다릅니다. 그리고 왜 이 문제가 이와 같은 책 전체를 활용하여 토론할 가치가 있는 것일까요? 그 이유는 SLAM이 어렵기 때문입니다. 특히 사전 지식 없이 SLAM을 실시간으로 수행하려는 경우에 그렇습니다. Visual SLAM에 대해 이야기할 때 우리는 비디오와 같은 연속적인 이미지 시퀀스를 기반으로 궤적과 맵을 추정 해야 합니다.

  우리 인간이 낯선 환경에 들어가면 우리도 똑같은 일 (연속적인 이미지 시퀀스를 기반으로 궤적과 맵을 추정하는 것)을하지 않습니까? 여기서 문제는 우리가 이러한 일련의 과정들을 프로그램으로 작성하고 컴퓨터가 그렇게 하도록 만들 수 있는지입니다.

  초기의 컴퓨터 비전 연구에서 사람들은 언젠가 컴퓨터가 인간처럼 보고 눈으로 세상을 관찰하고 주변의 물건을 이해하며 미지의 세계를 탐험할 것이라고 상상했습니다. 알려지지 않은 영역을 탐색하는 능력은 아름답고 낭만적인 꿈이며, 이 문제에 대해 밤낮으로 노력하는 수많은 연구자들을 끌어들였습니다 [2]. 우리는 이것이 어렵지 않다고 생각했지만, 그 진전은 기대했던 것만큼 부드럽지 않았습니다. 우리 인간의 시신경계가 눈 앞에 펼쳐진 장면을 뇌에 기록하고 처리하는 방법과는 달리 컴퓨터에서 처리하는 방식이 매우 다릅니다. 컴퓨터가 이미지의 내용을 이해하도록 하는 것은 우리가 숫자를 이해하게 하는 것만 큼 어렵습니다.  우리는 이미지를 이해하는 방법이나 컴퓨터가 세상을 이해하고 탐구하는 방법을 알지 못했습니다. 그래서 우리는 오랫동안 혼란스러워했습니다. 수십 년의 시간이 지난 후, 인공 지능과 기계 학습 기술을 통해 컴퓨터는 우리가 사용하는 방식과 다르지만 점차 객체, 얼굴, 소리 등을 식별할 수 있게 되었습니다.

  다른 한편, SLAM에 대한 연구 개발이 30년이 지나고 나서야 카메라는 조금씩 자신의 움직임과 위치를 인식할 수 있게 되었습니다. 하지만 이 방식은 여전히 우리 인간의 방법과는 큰 갭이 존재합니다. 연구자들은 다양한 실시간 SLAM 알고리즘을 성공적으로 구축했으며 그러한 알고리즘 중 일부는 빠르게 자신의 위치를 추적할 수 있게 되었고, 실시간으로 3D 재구성을 수행할 수도 있게 되었습니다.

  이것은 정말로 어렵지만 우리는 큰 진전을 이루었습니다. 더 흥미진진한 점은 최근 몇 년 사이에 과학 기술 발전에 따라 SLAM과 관련된 수많은 응용 지점이 등장했습니다. 센서의 위치를 파악하는 것은 다음과 같은 여러 영역에서 매우 유용할 수 있습니다. 예를 들어 실내 청소 로봇과 모바일 로봇을 배치하고 현장에 자율 차량을 배치하며 공중 무인 항공기를 배치하며 가상현실과 증강 현실 장치를 구동합니다. SLAM은 매우 중요합니다. SLAM 없이는 청소 로봇이 방에서 자율적으로 움직일 수 없으며, 목적 없이 돌아다니는 것만으로 청소 로봇은 우리가 반드시 청소해야 하는 특정 방에 정확하게 도달할 수 없으며 가상현실 게임도 의자에 앉아서 즐기는 것 외에는 할 수 없게 될 것입니다. 이러한 혁신제품들이 우리의 실생활에서 나타날 수 없다는 것은 아주 불행한 일입니다. 오늘날의 연구자 및 개발자는 SLAM 기술의 중요성을 인식하고 있습니다. SLAM은 거의 30 년의 연구 역사를 지니고 있으며 로봇 및 컴퓨터 비전 분야에서 활발히 연구되고 있는 주제입니다. 21세기 이래로 카메라 센서를 중심으로 한 Visual SLAM 기술은 이론과 실습 모두에서 큰 변화와 혁신을 겪었으며 실험실 연구에서 시장 응용으로 점차 옮겨 가고 있습니다. 하지만 우리나라에서 SLAM과 관련된 서적은 여전히 부족하고 SLAM 기술에 관심이 있는 많은 초보자는 갈 길이 없다는 사실을 알고 유감스럽게 생각합니다. SLAM의 이론적인 기반은 많이 성숙했지만 실제적인 구현은 여전히 복잡하고 기술적인 한계점이 높습니다. 이 분야를 처음 접하는 연구자들은 상당한 양의 흩어져있는 지식을 배우는 데 오랜 시간을 소비해야 하며 실제 핵심 SLAM 기술에 가까워지기 위해 여러 차례 우회해야 하는 경우가 많았습니다.

  이 책은 Visual SLAM 기술을 체계적으로 설명합니다. 우리는 그것이 SLAM 기술 학습에 대한 어려움을 (적어도 부분적으로) 해결해주길 바랍니다. 이 책에서는 SLAM의 이론적 배경, 시스템 아키텍처 및 다양한 주류 모듈에 대해 자세히 설명합니다. 동시에 우리는 실습을 강조합니다. 이 책에 소개된 모든 필수 알고리즘은 독자가 보다 심층적인 이해에 도달할 수 있도록 직접 테스트할 수 있는 실행 가능한 코드와 함께 제공됩니다. 결국 Visual SLAM은 실제 응용 프로그램을 위한 기술입니다. 수학적 이론은 아름답지만 코드로 변환할 수 없다면 공중에 떠있는 허상처럼 실제적인 영향을 주지 않습니다. 우리는 실천이 진정한 지식을 가져온다고 믿습니다. 알고리즘을 실제로 구현해보며 SLAM을 진정으로 이해하고 SLAM 연구와 사랑에 빠졌다고 주장할 수 있습니다.

  1986 년에 소개된 이래로 SLAM기술은 로봇 분야에서 뜨거운 이슈로 떠올랐습니다 [3]. SLAM 개발의 역사에서 모든 알고리즘과 변종을 완벽하게 기술하는 것은 매우 어렵고 불필요합니다. 이 책은 투영 기하학, 컴퓨터 비전, 상태 추정 이론, Lie 군, Lie 대수학 등과 같은 SLAM에 관련된 배경 지식을 소개하면서 SLAM의 핵심 아이디어를 공유하고 그 외의 불필요한 부분은 생략합니다. 우리는 이 접근법이 효과적이라고 믿습니다. 독자가 주요 흐름의 본질을 마스터할 수 있다면 세밀하고 복잡한 State-of-the-Art의 연구들을 탐색할 수 있는 능력은 자연스럽게 따라올 것이라고 믿습니다. 따라서 우리의 목표는 SLAM 초심자가 이 책을 읽음으로써 이 분야의 최첨단을 탐구할 수 있는 연구자로 빠르게 성장할 수 있도록 하는 것입니다. 반면에 SLAM 분야의 통달한 연구자 일지라도 이 책에는 SLAM 분야에서 생각해볼 만한 도전적인 문제들을 소개하면서 연구에 대한 새로운 통찰력을 줄 수 있습니다.

  현재 SLAM 관련 서적은 주로 Probabilistic robotics [4], Multiple View Geometry in Computer Vision [2], State Estimation for Robotics: A Matrix-Lie-Group Approach [5]이 있습니다. 이 책들은 내용이 풍부하며 알차면서 심도 깊은 내용을 포함하고 있어서 SLAM 연구자들 위한 바이블입니다. 그러나 여기에는 두 가지 중요한 쟁점이 있습니다. 첫 번째로 이 책의 목적은 기본 이론들을 소개하는 것이며 SLAM은 그 응용 프로그램 중 하나 일뿐입니다. 따라서 이 책들은 SLAM 전용 책이 아니라고 할 수 있습니다. 두 번째로 이 책들의 내용은 수학적 이론에 편향되어 있으며 기본적으로 프로그래밍 구현과 관련이 없기 때문에 독자들이 책에서 배운 지식을 구현하려고 할 때 여전히 어려움이 남아있게 됩니다. 우리는 "자신의 손으로 알고리즘과 매개 변수를 코딩, 디버깅 및 파라미터 조정을 통한 후에만 문제에 대한 진정한 이해를 이야기할 수 있다"라고 생각합니다.

  이 책은 SLAM의 역사, 이론, 알고리즘 및 연구 주제들을 소개하고 전체 SLAM 시스템을 시각적 주행 거리 측정, 백엔드 최적화, 맵 구축 및 루프 폐쇄 감지와 같은 여러 모듈로 분해하여 설명합니다. 우리는 독자들과 함께 이 모듈의 핵심 부분을 조금씩 구현하고, 어떤 상황에서 효과적인지, 무언가가 잘못되었을 때를 탐색하고, 모든 사람들이 자신의 컴퓨터에서 코드를 실행하도록 유도할 것입니다. 필요한 수학적 이론과 많은 프로그래밍 지식에 노출될 것이며 Eigen, OpenCV, PCL, g2o, Ceres 및 기타 라이브러리를 사용하여 Linux 운영 체제에서의 사용법을 익힐 것입니다. 

  우리는 이 책을 지루한 이론적 책으로 쓰고 싶지 않습니다. 기술 서적은 엄격하고 신뢰할 만하지만 엄격함은 고정관념을 의미하지 않습니다. 뛰어난 기술 서적은 생생하고 재미있고 이해하기 쉬워야 합니다. 여러분이 이 SLAM이라는 새로운 기술에 관심이 있는 한,  이 책을 통해 SLAM을 공부함으로써 그 과정은 확실히 보상받을 것입니다! SLAM과 관련된 이론 지식을 습득하게 되고 프로그래밍 기술도 크게 향상될 것입니다. 내가 여러분과 함께 연구하고 있다는 느낌을 갖게 될 것입니다. 그것이 제가 바라는 바입니다. 이 과정에서 연구의 즐거움을 발견하고 "약간의 노력을 통해 원활하게 동작하는 것을 보는"느낌을 좋아하기를 바랍니다.

  자, 이제 더이상 이야기는 그만하고 시작해 봅시다! SLAM과 함께 행복한 여행을 기원합니다!

1.2 이 책을 보는 방법

  이 책의 제목은 "입문 Visual SLAM 14강"입니다. 이름에서 알 수 있듯이 내용을 교실에서 공부하는 것과 같은 강의로 구성합니다. 각 강의는 논리적 순서로 구성된 하나의 특정 주제에 중점을 둡니다. 각 장에는 이론적 부분과 실제 구현 부분이 모두 포함되며 일반적으로 이론적인 부분이 먼저 나옵니다. 우리는 대부분의 수학적 교과서와 같은 정의, 정리, 추론 접근 방식이 아니라 대부분의 경우 알고리즘을 이해하는 데 필수적인 수학 지식을 소개합니다. 실제 구현 부분에서는 코드를 제공하고 다양한 구성 요소의 의미를 논의하고 몇 가지 실험 결과를 보여줍니다. 따라서 제목에 연습이라는 단어가 포함된 챕터가 나오면 컴퓨터를 켜고 우리와 함께 즐겁게 프로그래밍을 시작해야 합니다.

  이 책은 두 부분으로 나눌 수 있습니다. 첫 번째 부분은 주로 다음과 같이 기본적인 수학 지식에 중점을 둡니다.

 

  • 제1강은 이 서적의 기본 정보를 소개하는 서문으로, 책의 내용과 구조에 대해 설명합니다.
  • 제2강은 SLAM 시스템의 개요를 설명합니다. 전형적인 SLAM 시스템의 각 모듈을 설명하고 수행할 작업과 수행 방법을 설명합니다. 실습 부분에서는 Linux 환경의 기본 C 프로그래밍과 IDE 사용을 소개합니다.
  • 제3강에서는 3차원 공간에서의 강체 변환을 소개합니다. 회전 행렬, 쿼터니언, 오일러 각에 대해 배우고 Eigen 라이브러리를 사용하여 연습합니다.
  • 제4강은 Lie 군과 Lie 대수에 대해서 소개합니다. 비록 당신이 지금 Lie 대수를 이해하지 못한다고 해도 괜찮습니다. Lie 대수의 정의와 사용법을 배우고 Sophus 라이브러리를 사용하여 연습합니다.
  • 제5강에서는 핀홀 카메라 모델과 컴퓨터에서의 이미지 표현을 소개합니다. OpenCV 라이브러리를 사용하여 카메라의 내부 및 외부 파라미터를 계산하고 PCL (Point Cloud Library) 라이브러리를 통해 깊이 정보를 사용하여 포인트 클라우드를 생성합니다.
  • 제6강에서는 상태 추정, 최소 제곱 문제 및 그래디언트 디센트 방법을 비롯한 비선형 최적화를 소개합니다. 커브 피팅에 Ceres 및 g2o 라이브러리를 사용하여 연습합니다. 

두 번째 부분은 본격적인 SLAM 기술에 대한 내용입니다. 첫 번째 부분에서 설명한 수학적 이론을 사용하여 Visual SLAM의 각 모듈이 어떻게 작동하는지 설명합니다.

 

  • 제7강에서는 특징점 기반의 visual odometry를 다룹니다. 이 강에서는 특징점 추출 및 매칭, 에피폴라 기하학 제약 조건의 계산, Perspective-n-Points 및 Iterative Closest Points, Bundle Adjustment를 비롯한 많은 내용을 포함합니다. 실습에서는 이러한 방법을 사용하여 두 이미지 간의 움직임을 추정합니다.
  • 제8강은 direct method 기반의 visual odometry를 다룹니다. Optical flow 및 direct method를 익히고 실습에서는 단층 및 다층 Optical flow와 direct method를 활용하여 two-view visual odometry를 구현할 것입니다.
  • 제9강은 백엔드 최적화에 대해서 다룹니다. Bundle Adjustment에 대해서 자세히 논의하고 Sparse structure와 그래프 모델 사이의 관계에 대해서 소개합니다. Bundle Adjustment문제를 풀기 위해 Ceres와 g2o 라이브러리를 이용해 실험하고 비교합니다.
  • 제10강은 백엔드 최적화에서 포즈 그래프에 대해 다룹니다. 포즈 그래프는 Bundle Adjustment보다 간결한 표현 방법으로 모든 맵 포인트를 키프레임 간의 제약 조건으로 변환합니다. 실습에서는 g2o 라이브러리를 사용하여 포즈 그래프를 최적화합니다.
  • 제11강은 루프 폐쇄 검출로 주로 bag-of-word 메서드를 기반으로 루프백 탐지를 소개합니다. DBoW3 라이브러리를 사용하여 사전 교육 프로그램과 루프백 탐지 프로그램을 작성합니다.
  • 제12강은 지도 제작에 대해 다룹니다. 우리는 단안 SLAM에서 픽셀의 깊이를 추정하는 방법에 대해 논의하고 이것이 신뢰할 수 없는 이유에 대해 설명합니다. 단안 깊이 추정과 비교하여 RGB-D 카메라로 뎁스 맵을 얻는 것이 훨씬 문제를 쉽게 만듭니다. 단안 이미지에서 깊이를 추정하기 위해 에피폴라 라인 검색 및 패치 매칭을 위한 프로그램을 작성한 다음 RGB-D 데이터에서 포인트 클라우드 맵과 OctoMap을 작성합니다.
  • 제13강은 Stereo Visual Odometry에 대해 다룹니다. 이전에 배운 지식을 통합하여 Visual odometry 프레임워크를 직접 구축하고 프레임 및 맵 포인트 관리, 키 프레임 선택 및 최적화 제어와 같은 문제를 해결합니다.
  • 제14강은 현재 오픈 소스 SLAM 프로젝트와 그 미래 방향에 초점을 두고 있습니다. 우리는 이전 장들을 읽은 후에, 당신이 SLAM의 원리를 보다 쉽게 이해하고 새로운 아이디어를 구현할 수 있을 것이라고 믿습니다.

  마지막으로, 우리가 말하는 내용을 전혀 이해하지 못한다면 축하합니다! 이 책은 당신에게 적합합니다!

1.3 코드

  이 책의 모든 소스 코드는 다음의 GitHub 저장소에서 호스팅 됩니다.

 

https://github.com/gaoxiang12/slambook2

 

gaoxiang12/slambook

Contribute to gaoxiang12/slambook development by creating an account on GitHub.

github.com

  독자는 이 소스를 언제든지 볼 수 있도록 다운로드할 것을 강력히 권장합니다. 코드는 챕터로 나누어집니다. 예를 들어, 일곱 번째 강좌의 내용은 ch7 폴더에 배치됩니다. 또한 책에 사용된 일부 작은 라이브러리는 3rdparty 폴더에 압축 패키지로 저장됩니다. OpenCV와 같은 대형 라이브러리의 경우 처음 설치될 때 설치 방법을 소개합니다. 코드에 대한 질문이 있으면 GitHub의 Issues 버튼을 클릭하여 질문을 제출하십시오. 실제로 코드에 문제가 있는 경우 적시에 수정하겠습니다. Git 사용에 익숙하지 않은 경우 오른쪽에 있는 다운로드 버튼을 클릭하여 압축 파일을 로컬 드라이브에 다운로드할 수도 있습니다.

1.4 예상되는 독자

  이 책은 SLAM에 관심이 있는 학생과 연구원을 대상으로 합니다. 책을 읽으려면 특정 토대가 필요하며 다음 지식이 있다고 가정합니다.

 

  • 미적분, 선형 대수, 확률 이론. 이것들은 대부분의 독자들이 학부 과정에서 배우는 기본적인 수학적 지식입니다. 최소한 행렬과 벡터가 무엇인지, 그리고 미분과 통합을 통해 의미하는 바를 이해해야 합니다. 더 많은 고급 수학적 지식이 필요한 경우 계속 진행하면서이 책에서 소개하겠습니다.
  • 기본 C 프로그래밍. C를 주요 프로그래밍 언어로 사용할 것이므로 독자는 최소한 기본 개념과 구문에 익숙해지는 것이 좋습니다. 예를 들어, 클래스가 무엇인지, C 표준 라이브러리를 사용하는 방법, 템플릿 클래스를 사용하는 방법 등을 알아야 합니다. 우리는 특별한 기법을 사용하지 않기 위해 최선을 다할 것이지만 실제로는 특정 상황에서 이를 피할 수는 없습니다. 또한 C 11 표준 중 일부를 채택할 예정이지만 필요한 경우 설명하도록 하겠습니다.
  • 리눅스 기초. 우리의 개발 환경은 Windows가 아닌 Linux이며 Linux에서만 소스 프로그램을 제공하며 Windows에서 개발 방법을 소개하지는 않습니다. 우리는 SLAM 연구자들에게 리눅스를 마스터하는 것이 필수적이라고 생각합니다. 이 책에 대한 지식을 배우고 나면, 당신도 우리와 같은 생각을 가질 것이라고 믿습니다. 리눅스에서의 다양한 라이브러리 설정은 매우 편리하며, 이 과정에서 리눅스의 편리함을 깨닫게 될 것입니다. 독자가 전에 리눅스를 사용해본 적이 없다면 리눅스 교과서를 찾아 조금 배우는 것이 가장 좋습니다. 우리는 독자가 고급 리눅스 운영 기술을 가지도록 요구하지는 않지만, 독자들이 적어도 "터미널을 열고 코드 디렉터리를 입력하는 방법"을 알기를 바랍니다. 이 강의에는 Linux 지식 자체 테스트 문제가 몇 가지 있습니다. 자체 테스트 질문에 대한 답을 알고 있으면 이 책의 코드를 읽는 데 아무런 문제가 없습니다.

  SLAM에 관심이 있지만 위에서 설명한 지식이 없는 독자는 이 책을 이해하기 어려울 수도 있습니다. C ++의 기초를 이해하지 못한다면 C ++ Primer Plus와 같은 책을 추천합니다. 관련 수학 지식이 없는 경우 관련 수학 교과서를 먼저 읽는 것이 좋습니다. 그럼에도 불구하고 학부 과정을 마친 대부분의 독자는 필요한 수학적 배경을 가지고 있어야 합니다. 코드와 관련해서는 직접 입력하고 매개 변수를 조정하여 출력에 미치는 영향을 확인하는 데 시간을 할애하는 것이 좋습니다. 이것은 매우 도움이 될 것입니다.

  이 책은 SLAM 관련 강좌의 교과서 또는 과외 자습 교재로 사용할 수 있습니다.

1.5 스타일 관례

  이 책은 수학적 이론과 프로그래밍 구현을 모두 다룹니다. 따라서 읽기의 편의를 위해 다른 레이아웃을 사용하여 내용을 구분합니다.

 

1. 수식이 별도로 나열되며 중요한 수식도 오른쪽에 번호가 매겨져 있습니다

스칼라 값은 기울임 꼴 문자 (예: a)를 사용하고, 벡터 및 행렬은 굵은 기울임 꼴 (예 : a, A)을 사용합니다. 중간이 비어있는 굵은 글자는 실수 집합 $\mathbb{R}$, 정수 집합 $\mathbb{Z}$와 같은 특수 세트를 나타냅니다. Lie 대수는 $\mathfrak{se}(3)$ 와 같은 고딕을 사용합니다.

 

2. 프로그램 코드는 왼쪽에 줄 번호가 있는 더 작은 글꼴 크기를 사용하여 박스 처리됩니다. 프로그램이 길면 박스가 다음 페이지로 계속됩니다.

3. 코드 블록이 너무 길거나 이전에 나열된 코드와 함께 반복되는 부분이 많이 포함된 경우 전체를 나열하는 것은 적절하지 않습니다. 우리는 코드의 중요한 부분만 제공하고 나머지는 (part) 으로 표시합니다. 따라서 독자는 이 책을 더 잘 이해하기 위해 GitHub에서 모든 소스 코드를 다운로드하고  실제로 연습을 해보는 것이 좋습니다.

 

4. 조판으로 인해 책에 표시된 코드가 GitHub의 코드와 약간 다를 수 있습니다. 그런 경우에는 GitHub의 코드를 참조하십시오.

 

5. 우리가 사용하는 각 라이브러리는 처음 나타날 때 더 자세한 설명을 가지지 만 이후 사용에서는 설명하지 않습니다. 따라서 독자는 책의 내용을 장 순서로 읽는 것이 좋습니다.

 

6. 이 강좌의 요약은 각 강의 시작 부분에 나열되며 마지막에는 요약 및 연습 문제가 있습니다. 인용된 참고 문헌은 이 책의 끝에 나와 있습니다.

 

7. 앞에 별표가 있는 장은 선택 사항이며 독자는 자신의 관심사에 따라 읽을 수 있습니다. 이를 건너뛰더라도 다음 장의 이해를 방해하지 않습니다.

 

8. 본문의 중요한 내용은 굵은 글씨 또는 이탤릭체로 표시되어 있습니다.

 

9. 우리가 설계 한 대부분의 실습은 체험적인 측면이 큽니다. 이들을 이해한다고 해서 전체 라이브러리 사용에 대해 이미 잘 알고 있는 것은 아닙니다. 따라서 이 책에서 자주 사용되는 라이브러리에 대해 자세히 알아보기 위해서는 시간을 조금 더 할애하는 것이 좋습니다.

 

10. 이 책의 연습 문제와 참고 문헌들은 추가 자료를 검색해야 할 수도 있으므로 검색 엔진 사용법을 배워야 합니다.

1.6 감사 인사

  이 책의 온라인 영어 버전은 현재 공개되어 있으며 오픈 소스입니다.

  이 책을 쓰는 과정에서 많은 문서와 논문이 참조되었습니다. 수학에 대한 이론적 지식의 대부분은 나의 원래 창작물이 아니라 이전 연구의 결과입니다. 실험 디자인의 작은 부분은 다양한 오픈 소스 코드 데모 프로그램에서 나왔지만 대부분은 직접 작성했습니다. 또한, 출판된 저널이나 학회 논문에서 가져온 일부 사진이 본문에 언급되어 있습니다. 원본 또는 인터넷의 설명되지 않은 이미지는 나열되지 않습니다. 다른 사람의 사진 저작권을 침해하고 싶지 않습니다. 독자가 문제를 발견하면 저에게 연락하여 수정하십시오.

  Github 또는 이메일 (gao.xiang.thu@gmail.com)을 통해 저에게 연락해주세요.

 

연습문제 

1. 선형 방정식 Ax= b 있다고 가정해봅시다. A, b를 알고 있다고 가정하는 경우 이때 어떻게 x를 구할 수 있을까요? 그리고 유일한 해 x를 구하기 위해서 A b의 요구 사항은 무엇입니까? (힌트 : A b의 랭크를 확인해봅시다.)

 

2. 가우시안 분포란 무엇입니까? 가우시안 분포의 1차원 형태는 어떻게 생겼나요? 2차원 형식은 어떻게 생겼나요?

 

3. C ++에서의 클래스를 알고 있습니까? STL을 아십니까? 그들을 사용해본 적이 있습니까?

 

4. C ++ 프로그램은 어떻게 작성하나요? 

 

5. C++11 표준을 알고 있습니까? 그중 들었거나 사용하신 새로운 기능은 무엇입니까? 다른 표준이 있습니까?

 

6. 리눅스를 아십니까? Ubuntu와 같은 인기 있는 배포판 (Android 제외) 중 하나 이상을 사용했습니까?

 

7. 리눅스 디렉터리 구조는 어떻게 구성되어있나요? ls, cat 등 기본 리눅스 명령을 알고 있습니까?

 

8. 우분투에서 소프트웨어를 설치하는 방법 (소프트웨어 센터를 열지 않고)? 소프트웨어는 어디에 설치되어 있습니까? 퍼지 소프트웨어 이름만 알고 있는 경우 (예 : 이름에 고유 이름이 있는 라이브러리를 설치하려는 경우) 어떻게 설치해야 합니까?

Ubuntu에서 소프트웨어를 설치하는 방법이 어떻게 되나요 (소프트웨어 센터를 사용하지 않고)? 일반적으로 소프트웨어가 설치되는 디렉터리는 어디인가요? 소프트웨어의 대략적인 이름만 알고 있는 경우 (예 : 이름에 "Eigen"라는 단어가 포함된 라이브러리를 설치하려는 경우) 검색 방법은 무엇입니까?

 

9. * Vim을 배우는 데 한 시간을 투자하십시오. 조만간 사용할 것입니다. 터미널로 vimtutor 명령을 입력하고 그 내용을 읽을 수 있습니다. 이 책을 배우는 과정에서 코드를 편집하는 데 사용할 수 있는 한 매우 능숙하게 작동할 필요는 없습니다. 지금은 플러그인에 시간을 낭비하지 마십시오. vim을 IDE로 바꾸려고 하지 마십시오. 이 책에서는 텍스트 편집에만 사용합니다.