[SLAM] 21. Feature based SLAM의 역사
1. MonoSLAM
- 2003년, 초창기 VSLAM
- 실시간으로도 VSLAM이 가능하다는 것을 보여주었다
- 카메라 pose tracking을 실시간으로 할 수 있다
- Incremental SLAM 방식
- extended kalman filter(EKF)를 사용
- map size가 커지면 computational cost도 증가 (방 하나 정도밖에 못한다)
- 모든 3D landmark와 camera pose를 track한다
3D landmark의 위치를 찾는 방법

- 한 시점에서 보이는 2D keypoints를 optical center를 기준으로 ray를 그린다
- 3D point는 ray 위의 어딘가에 있을 것이다 (uniform distribution으로 일단 준다)
- 다른 뷰에서 점점 보면서 EKF로 필터링하면서 점차 3D point의 위치가 가우시안으로 바뀌어간다
- probability distribution을 보고 3D landmark의 위치를 추정한다
- 즉, 2D point는 ray를 만들어주는 수단으로서 방향성을 정해주는것
- feature는 3D landmark 자체가 되는 것
- 전제조건!
- initial map이 생성될 때 무조건 depth를 알고있는 객체가 있어야한다
2. PTAM
- Parallel Tracking and Mapping
- 2007년, dual core 적용
- batch SLAM 방식 -> PTAM이 MonoSLAM을 이겼다
- SLAM 프로세스
- fast tracking + slow mapping
- 2개의 thread에서 나눠서 진행
- 5 point 알고리즘을 사용해서 manual initailization 진행
- monoSLAM은 처음에 GT를 제공해야했지만 PTAM은 필요 없다(처음에 epipolar geometry를 만들기 위해 유저가 2 view을 지정)
- FAST corner 사용 : 빠르다
- keyframe 기반 BA로 map 최적화
- monoSLAM보다 landmark 수가 많다
- 그 의미는 mono의 경우 하나의 point만 잘못 추론해도 전체가 망가질 수 있다
- PTAM은 landmark 수가 많아서 하나가 틀어져도 문제 없다
key-frame이란?
- map을 추론하기 좋은 frame들만 사용하여 BA를 진행한다
- 예를 들어 T0, T2, Tn의 프레임만 가지고도 map을 잘 추론할 수 있다
- 그럼 얼마나 떨어져있는 프레임을 사용해야되는가?
- PTAM 내부에서 정의해준다
- 이전 프레임의 feature의 70%에 새로운 feature가 30%있으면 이 프레임을 keyframe으로 지정한다

PTAM tracking
- 모든 이미지는 tracking thread로 들어온다
- 이미지에서 feature를 뽑아서 map을 tracking 한다
- select submap & nearest keyframe
- 새로운 keyframe 인지 판다
- yes -> mapping 진행
- no -> map 그려준다
PTAM Mapping
- 새로운 점들에 대해서 triangulation을 진행 -> 새 landmark 추가
- calculate SSO : error 계산
- BA 진행 -> map point를 조금 더 정확한 곳에 찍어주고 pose도 보정
3. Visual-SLAM, why filter?
- 필터 별로 좋지도 않은데 왜 쓰는가!?!?
- 수식적, 실험적으로 probabilistic graphical inference(BA방법 의미, 그래프 최적화) 가 filtering 방법보다 효과적이다
- 동일한 정확도를 얻기 위해 filter 방법은 더 많이 돌려야하고 BA는 한번에 batch를 통해 계산 -> BA가 계산량이 더 적다
- 이 이후로 대부분 BA를 사용한다
4. ORB-SLAM
- VSLAM pipeline을 완성시켰다!!
- 실시간으로 돌아간다
- 대부부의 유저케이스에서 작동한다
- tracking, local mapping, loop closure 3개의 thread 사용
- 각각의 thread는 서로 다른 time sync를 가지고 있다
- tracking : 매 프레임마다 (30fps의 경우 33ms 정도)
- local mapping : 100-200ms 마다
- loop closure : 훨씬 오래 걸릴 수 있다
- user input이 필요없다!
- 어떻게 하면 좋은 frame을 얻어서 좋은 map을 얻을 수 있는지 평가하는 방법을 가지고 있다
- 좋은 맵이 아니라면 SLAM은 다시 시작하는 automatic map initialization 방법을 가지고 있다
- reloccalization + global optimization
- reloccalization : 위치를 잃어버린 상태에서 다시 위치를 추정하는 것
- 따라서 global optimization 즉, loop closure가 가능해진다
- ORB feature를 사용하여 효과적
- 내부적으로 2가지 그래프 사용
- co-visibility graph
- essential graph
- 계산 효율성을 위해 상황에 따라 데이터의 수, 속도가 중요한 경우가 다르다
- Bag-og-visual-words를 사용하여 relocalization
- PnP 방법을 사용하여 map을 기반으로 위치를 tracking하고 pose 추출
VSLAM pipeline

- frame -> tracking -> local mapping -> loop closing
- 모든 thread가 공유하는 자원
- map
- place recognition 라이브러리
pipeline 과정
- tracking
- frame 들어온다
- ORB feature 뽑는다
- map initialization : 첫 map 즉 triangulation을 만들어준다
- 다시 frame으로 돌아가서 ORB 뽑는다
- last frame(가장 최근의 keyframe)에 대해 pose 추정
- local map을 tracking한다
- key frame인지 확인
- key frame이라면 key frame을 데이터셋에 넣어준다
- local mapping
- keyframe을 통해 새로운 point 생성
- local BA
- 가장 최근 n개의 key frame (need optimization) 사용
- n 개의 key frame에서의 landmark, pose update
- 이전의 것들은 보정하지 않는다 (이미 보정이 끝났다고 판단)
- loop closing
- loop detection
- loop correctio
- loop인 경우
- loop의 graph를 전부 최적화 -> pose update (landmark는 update 안한다)
efficient ORB feature
- FAST로 빠르게 뽑고
- BRIEF로 빠르게 매칭
- BRIEF는 rotation invariant하지 않다 -> rotated BRIEF 사용
- oriented FAST를 뽑을 때도 multi scale로 뽑는다 -> scale invariant
Automatic initialization
- PTAM에서는 사용자가 2개의 이미지를 골라주어야한다
- 하지만 ORB-SLAM에서는 골라줄 필요없고 내부에서 어떤 solver를 사용할지도 자동으로 골라준다
첫 map 만드는 방법 (2가지)
- homography solver
- coplanar한 points를 구할 때 사용
- planar (평면의) scene에서 map을 만들 때는 이 방법이 더 정확
- fundamental matrix solver
- complex scene (울퉁불퉁한 장면)에서 유리
- 하지마 카메라의 입장에서 어떤 것이 planar하고 complex한지 알 수 없다
- 그래서 둘 다 풀어보고 더 정확한 것을 사용하도록 threshold 정해준다
- 앞 뒤로 움직일 떄는 initailize를 안한다! (좌우인 경우에만 한다)
- 위험한 상황에서는 안한다는 것
- 유용한 기능이다
- SLAM은 initial map을 만들고 나면 이 map에 의존하기 떄문에 잘 만들어야한다. 잘못 만들면 껐다키는 방법밖에 없다
Co-visibility graph / essential graph

- Co-visibility graph
- 동시에 같은 것을 바라보고 있는 것들에 대한 그래프
- key frame들끼리 동일한 landmark를 바라보면 frame들끼리 연관된 data association이 있다
- (b) 그래프
- essential graph
- 정말 중요한 data association이 있는 것들만 남겨둔 것
- (c) 그래프
- data association
- detection에서 찾은 object들이 이전의 frame의 object와 같은 object인지 판단하는 과정
Relocalization via Bag-of-visual-words

- Bag-of-visual-words
- ORB feature들을 clustering하여 비슷한 것들끼리 딥러닝하여 학습시켜 놓은 것
- 과거에는 같은 물체인지 확인하려면 ORB를 뽑아서 모든 feature를 비교해야했다
- 이 방법은 feature를 뽑고 Bag-of-visual-words로 바꾼 후 Bag-of-visual-words를 매칭하면 빠르게 판단할 수 있다
2 steps

- training step
- keypoint를 뽑고 descriptor를 clustering해서 vocabulary 만들어서 tree를 만들어준다
- estimation step
- 이미지가 들어왔을 때 feature를 뽑고 tree-search를 통해 빠르게 탐색하고 매칭할 수 있다
5. ORB-SLAM 2
- 기존의 ORB-SLAM은 monocular 대상
- ORB-SLAM 2는 stereo랑 RGB-D 추가
- 전방 stereo
- 처음부터 depth를 알 수 있다
- matrix K를 알 수 있기 때문에 더 정확하게 SLAM을 할 수 있다
- RGB-D
- 단순히 RGB이미지에서 뽑은 feature의 depth를 초기화하는 용도로 사용
6. ProSLAM

- system 아키텍처가 좋다
- single-thread VSLAM
- modular software architecture
- 이해하기쉽다
- 데이터 구조
- core VSLAM algorithm