[SLAM] 22. Direct SLAM의 역사
1. Feature-based SLAM vs Direct SLAM
Feature-based SLAM의 특징
- local feature를 뽑는데 많은 시간과 자원을 사용한다
- corner와 같은 local feature를 뽑고 이를 기반으로 camera pose와 map point(landmark)를 연산
- 반대로 생각해보면 무조건 local feature를 뽑아야지만 camera pose와 map point(landmark)를 계산할 수 있다
- local feature를 뽑는게 불필요한 과정일지도..?
- map이 항상 sparse하게 나타난다
- corner와 같이 point feature를 뽑게 되는 경우
- map에서 충분한 정보를 얻을 수 없다
- keyframe에서만 mapping을 할 수 있다
- 매 프레임마다 keypoint를 찾고 triangulation하고 BA하는데 너무 많은 시간이 걸리기 때문에 keyframe에서만 mapping을 수행
- Feature-based SLAM의 한계점
- feature-less인 환경에서는 작동할 수 없다
- feature가 없는 곳? 코너가 없는 곳, 하얀 곳, 복도, 바다 위 등
- feature-based SLAM에는 한계점이 분명하다
hopes and dreams of robotics field
- faster camera localization and mapping
- feature-based SLAM는 충분히 빠르지 않다
- 실시간 드론 제어 : perception이 빨라야한다
- AR : 빠른 tracking이 요구되는 분야
- denser map이 필요
- feature-less environment
- office 복도, 공장 바닥 등의 경우에서도 작동하는 SLAM이 필요하다
- ~2010년의 HW
- CPU clock 증가
- RAM 용량 증가
- video camer sensor 품질이 좋아졌다
- GPGPU(GPU를 활용한 프로그램) 등장
- feature를 뽑은 이유가 이미지 전체를 계산하기에는 데이터가 너무 많아서 실시간이 힘들겠다고 생각했기 때문이다.
- 하지만 HW의 발전으로인해 굳이 feature를 뽑아야하는가에 대해 의문
- feature를 뽑지 않고 이미지 데이터 자체(entire image)를 활용하자는 연구 시작
Feature-based SLAM vs Direct SLAM

feature-based
- 2개의 이미지 input (t-1 시점, t 시점)
- feature 추출 & 매칭 (SIFT / SURF / ORB)
- track
- map point를 reprojection한 후 reprojection error를 최소화하는 camera pose와 landmark를 구한다
- map
- matching된 feature를 가지고 triangular를 만들어내서 map point 보정
Direct
- 2개의 이미지 (feature안 뽑고 바로 사용)
- track
- (조명이 같다는 전제하에) 두 이미지 사이의 relative motion(R, t)이 어떻게 되어야 밝기값이 그대로 mapping되는가를 계산
- 이것을 photometric error라고 한다
- photo(빛) + metric(측량)
- map
- relative motion을 구하면 픽셀들의 depth를 구할 수 있다
- depth map을 만들 수 있다
- 이미지 전체를 사용하면 전체에 대한 depth map이 나오고 line만 추출해서 사용하면 semi-dense depth map이 나온다
Direct SLAM
- direct method == direct photometric method
- 특징
- feature map 방식보다 정확하고 robust (속도는 느릴 수 있다)
- 이미지 전체를 사용하면 feature만 사용하는 것보다 사용하는 pixel의 정보가 많기 때문
- 카메라간의 relative motion(camera baseline) 작을수록 알고리즘이 빠르게 convergence(수렴)
- 따라서 카메라 fps가 높을수록 더 빠르게 작동한다
- 2010년 이후부터 카메라 fps가 빨라졌다
2. Direct SLAMs
DTAM
- Dense Tracking and Mapping in real-time
- PTAM의 프레임워크를 사용하되 feature를 뽑지 않고 전체 이미지를 사용하는 방식으로 바꾼 것
- keyframe의 전체 이미지에 대해 최적화
- dense map이 생성된다
- tracking은 매 frame마다
- mapping은 keyframe에서만
- feature-less 환경에서도 작동
- 이미지 전체를 사용하고 이미지 밝기값을 사용하기 때문
- motion blur에 강인
- 전체 이미지를 사용하기 때문 (데이터가 많아서 일부는 무시할 수 있다)
- GPU 사용 필요
- dense map이 유용하다 + depth도 최적화에 활용가능하면 매우 유용
- dense map이 중요하지 이미지 전체를 사용하는 것이 중요한게 아니다
- RGB-D 카메라를 사용하여 dense depth map을 얻어서 사용하기 시작
LSD-SLAM
- first large-scale VSLAM
- Line Segment Detector
- 이미지에서 edge, line을 찾는 방법
- line을 특징으로 사용하지 않고 line 주변의 픽셀들을 가지고 카메라 pose 최적화 진행
- 이때 similarity transform(7DoF)을 구한다 -> large-scale 가능
- scale factor까지 최적화하기 때문에 scale drift가 나타나지 않기 때문
- semi-dense mapping으로 GPU가 아닌 CPU 사용
- 단점 : 조명의 변화에 not robust
- direct 방식이 빛의 밝기값을 가지고 최적화하는데 전제 조건이 두 프레임 간의 밝기값이 동일하다이기 때문에 급작스러운 밝기 변화가 발생하면 tracking 실패
- direct 방식은 loop closure를 어떻게? 최근까지 해결되지 못했다
- feature을 뽑아서 loop closure 수행
SVO
- Semi-direct monocular Visual Odometry
- feature, direct 방식 둘다 사용
- FAST corner feature 추출 + feature의 patch를 direct 방식으로 tracking하여 pose 추정
- keyframe에 sliding window BA 적용 -> map point, pose 보정
- SLAM이 아니기 때문에 global optimization, loop closure는 없다
- 빠르다
- i7에서 400fps까지
- ORB의 경우 i7에서 30FPS였다
- 드론을 위한 방식
- 바닥을 보고 있는 카메라로 드론 위치 추정
- 바닥이 평평하다는 전제로 homography 기반으로 위치 추정
SVO2
- monocular / multi camera / fisheye camera 지원
- depth 추정 알고리즘 개선
- loop closure나 BA가 없다
DSO
- Direct Sparse Odometry
- feature 방식 완전히 제거
- sliding widow photometric BA 방식 소개
- 7개의 keyframe을 가지고 photometric error를 기반으로 sliding window BA
- loop closure 사용하지 않는다 -> odometry
- 하지만 ORB SLAM보다 정확하게 결과가 나온다
- point를 direct 방식으로 추출, gradient 변화가 큰 곳들을 기반으로 픽셀들에 대해 sparse하게 photometric opimization

- drift가 없다면 쓰레기통이 일치해야하지만 drift가 존재
- drift가 있지만 굉장히 큰 거리를 돌았고 z축에도 error가 생겼을 수 있는데 drift가 매우 적다

- LSD-SLAM과 ORB-SLAM은 rotation drift가 커서 90도로 꺾어야하는데 더 많이 꺾었다.
- ORB-SLAM의 경우 drift가 커서 원점으로 도착했음에도 반밖에 안왔다고 생각
- ORB-SLAM은 rotation drift가 매우 크기 때문에 loop closure가 나타나야 정확한 SLAM이다
DSO-variants
- stereo DSO, LDSO, VI-DSO
- DSO도 SURF를 사용하여 loop closure를 할 수 있다 -> SLAM이 될 수 있다
- VI-DSO : imu도 포함
- DSO의 단점
- baseline이 갑작스러운 motion으로 인해 크게 변하면 convergence(수렴)하기 어렵다
- 하지만 이 motion을 imu가 보정해 주면 더 정확하다
Variants in Direct methods
- Sparse vs Semi-dense vs Dense

- 정확도 / 속도의 tradeoff
- 최적화를 했을 때 주어진 시간 안에 정확한 값에 도달한다라는 점이 중요
- frame 간의 baseline(거리)가 크지 않을 때 -> 3개 모두 좋은 convergence를 보여준다
- frame 간의 거리가 커지면 -> sparse가 먼저 떨어지지만 나머지도 결국 convergence가 안좋아진다
- 그러면 frame 거리에 제한을 두고 (fps 증가 또는 robot의 속도 감소) 사용한다
- 이때는 sparse를 사용하는것이 계산 효율성이 좋다
- 즉, frame간의 거리를 줄이고 가벼운 알고리즘을 사용하자 -> sparse
- 그래서 direct의 발전도 dense의 DTAM에서 점차 semi-dense에서 sparse로 바뀌었다
정리 (direct methods)
- DTAM : dense map
- LSD-SLAM : semi-dense
- SVO, SVO2 : 하이브리드 방식 / 빠르다
- DSO : loop closure 없이도 잘된다
- stero DSO, LDSO, VI-DSO : DSO의 변형
- 요즘은 딥러닝과 photometric를 섞어서 좀 더 안정적인 deep direct SLAM을 할 수 있을지 연구 -> DVSO, D3Vo, MonoRec, GN-Net, LM-Net 등
- GN-Net, LM-Net : direct에서 loop closure를 할 수 있는 방법을 만들어주는데 단순히 이미지 비교를 하는 것이 아니라 조명, 날씨, 낮밤, 형태가 바뀌었을 때에도 적용가능