LeGO-LOAM은 ground plane의 존재를 이용해 lightweight한 real time 6DOF pose estimation을 했다고 한다.
noise filtering을 위해 segmentation을 해서 보다 robust한 결과를 얻었다고 했다.
computation expense를 줄였지만 성능은 LOAM과 비슷하거나 더 낫다고 했다.
LeGO LOAM의 전제 시스템은 다섯 부분으로 나뉜다.
Segmentation 모듈에서 Point Cloud → Range Image → Segmented Point의 과정을 진행하고 Feature Extration 모듈에서 Segmented Cloud로 부터 Feature를 뽑고 이 feature를 이용해 odometry와 mapping을 하고 두 pose를 integration한다고 한다.
Point Cloud (그림 a)를 1800×16 크기의 range image로 변환하고 range image에서의 pixel value는 point의 sensor로 부터의 euclidean distance로 한다. 그리고 Segmentation 이전에 ground extration을 하고서 segmentation을 한다고 하는데 이 ground extration은 column-wise evaluation방법을 통해서 한다고 하는데 이 방법은 range image 상에서 column-wise slope를 이용해서 threshold 미만이면 ground로 판단해서 ground point들을 뽑아낸다고 했다. 이렇게 ground point들의 index를 제외한 나머지 range image에서 image-based segmentation을 한다. 여기서 robustness를 위해 point 갯수가 30개 미만인 segment들은 사용하지 않는다. 이 결과로 segmented point과 groud point (그림 b)를 얻는다.
앞에서 추출한 segmented point와 ground point에서 feature를 뽑는 과정이다. LOAM에서와 같은 smoothness를 정의해서 사용한다.
는 range image상에서 같은 row에 있는 연속적인 point를 사용하였고 LeGO-LOAM 구현 코드에서는 앞뒤로 5개의 point를 사용하였다. 그리고 이 smoothness를 가지고 edge와 planar를 구분한다. (자세한것은 LOAM에서의 설명 참조)
다른 점은 edge point로 판별되었지만 ground point일 경우는 feature로 사용하지 않으며
60°씩 6개의 sub-image로 나눠서 edge 와 planar point들을 뽑는다. 는 6개의 sub image에 있는 모든 feature들의 set이며 는 각각의 sub image에 존재하는 feature들의 set이며 는 각각 2, 4, 40, 80으로 정했다. feature extracion을 통해 얻은 feature들은 위의 그림 c와 d에 나타나 있다.
Lidar odometry 모듈에서는 두 개의 연속된 scan 사이의 transformation을 feature들간의 correspondence를 이용해서 구한다. 이를 위해서는 와 사이에서 correspondence를 구하고 이를 optimizaion 해야한다.
Label Matching
matching의 효율성을 위해서 모든 feature를 match에 이용하는것이 아니라 segmented point에서는 와 사이의 correspondence만 찾고 ground point에서는 와 사이의 correspondence만 LOAM에서와 같은 방식으로 찾는다.
Two-step LM Optimization
optimization에서도 속도의 효율성을 높이기 위해서 6-DOF의 transform 를 한번에 optimization하는 것이 아니라 두 개의 단계로 나눠서 optimization을 진행한다.
1.를 ground plane을 이용하여 즉 와 사이의 correspondence의 distance를 줄이는 방향으로 optimization 한다.
2.를 사이의 distance를 줄이는 방향으로 optimization을 한다.
그리고 각각의 과정에서 optimize하는 parameter외의 나머지 parameter는 constraint로 삼아서 optimize한다.
이렇게 하는 이유는 ground plane만 사용해도 를 optimize할 수 있으므로 parameter를 3개씩 나눠서 optimization을 진행해도 optimization이 가능하며 parameter수를 줄이면 LM알고리즘의 특성상 search space가 작아지기 때문에 6개의 한번에 optimization하는것보다 3개씩 두개의 과정으로 나누어 optimization하는것이 더 빠르기 때문이다. 이 방법이 accruracy를 높이는데에 도움이 되었을 뿐만 아니라 실제로 35%정도의 computation time이 줄었다고 한다.
Lidar Mapping
Lidar Mapping 모듈은 낮은 빈도로 돌아가지만 pose transformation을 refine하기 위해 의 feature들을 주변의 point cloud map 과 matching하고 L-M 알고리즘을 사용하여 transformaion을 구하는 모듈이다.
LeGO-LOAM에서는 LOAM과는 달리 point cloud map을 저장할때 feature set {}도 같이 저장한다. 여기서 = {{}, ... , {}}라고 하면 각각의 에 대응하는 pose를 연결짓는 식으로 저장을 한다. 이로 부터 을 얻는 방법은 두 가지가 있다.
현재 pose를 기준으로 저장된 feature들 중에서 주변 100m 이내에 있는 모든 pose들의 feature들을 불러오고 이 모든 feature들을 각 pose로 transform하고 합쳐서 surrounding map 을 얻는다.
LeGO-LOAM을 pose-graph SLAM하고 통합해서 사용한다고 하면 sensor의 pose는 graph의 node로, feature set {} 은 각 node의 measurement로 모델링 할 수 있다. 그리고 lidar mapping의 pose estimation drift가 매우 작으므로 단기적으로는 pose의 drift가 없다는 가정하에 최근의 개의 pose 즉{{}, ... , {}} 을 사용해 을 만든다.
그리고 odometry와 같은 방식으로 correspondence를 생성한 후에 L-M optimization을 해서 transform을 얻는다. 여기에 추가적으로 loop closure detection을 해서 ICP와 같은 registration을 통해 추가적인 contraint를 얻으면 drift를 줄일 수 있을 것이라 한다.
출처 : https://dreambreaker-ds.tistory.com/entry/LOAM-Lego-LOAM