[SLAM] 21. Feature based SLAM의 역사

happy_quokka·2023년 11월 29일
0

SLAM

목록 보기
22/28

1. MonoSLAM

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

3D landmark의 위치를 찾는 방법

  1. 한 시점에서 보이는 2D keypoints를 optical center를 기준으로 ray를 그린다
  2. 3D point는 ray 위의 어딘가에 있을 것이다 (uniform distribution으로 일단 준다)
  3. 다른 뷰에서 점점 보면서 EKF로 필터링하면서 점차 3D point의 위치가 가우시안으로 바뀌어간다
  4. 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

  1. 모든 이미지는 tracking thread로 들어온다
  2. 이미지에서 feature를 뽑아서 map을 tracking 한다
  3. select submap & nearest keyframe
  4. 새로운 keyframe 인지 판다
    • yes -> mapping 진행
    • no -> map 그려준다

PTAM Mapping

  1. 새로운 점들에 대해서 triangulation을 진행 -> 새 landmark 추가
  2. calculate SSO : error 계산
  3. BA 진행 -> map point를 조금 더 정확한 곳에 찍어주고 pose도 보정

3. Visual-SLAM, why filter?

  • 필터 별로 좋지도 않은데 왜 쓰는가!?!?
  • 수식적, 실험적으로 probabilistic graphical inference(BA방법 의미, 그래프 최적화) 가 filtering 방법보다 효과적이다
    • EKF/PF 보다 BA가 더 좋다
  • 동일한 정확도를 얻기 위해 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
      • 현재의 key frame이 loop인가?
    • 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

0개의 댓글