본 포스트는 공부 목적으로 작성하였습니다.
혹시 보시는 도중 잘못된 부분이나 개선할 부분이 있다면 댓글이나 메일주시면 확인 후 수정하도록 하겠습니다.
해당 포스트는 앞서 pdf 파일로 정리했던 자료를 포스팅한 글입니다.
자세한 내용은 다음 링크를 통해 확인해주세요.
https://www.facebook.com/groups/slamkr/permalink/809268749432771/
본 논문은 6자유도 (
LiDAR 센서는 다른 센서와 비교할 때 상대적으로 거리오차가 매우 작기 때문에 (대략 150m에 +-2.5cm 오차 발생 수준) 다양한 mapping 알고리즘이 연구되었다. LiDAR 센서가 정지한 채로 360 degree 회전을 하는 경우 mapping은 상대적으로 쉬우나 센서가 움직이면서 mapping을 하는 경우 lidar의 위치 및 방향을 계속 추정하면서 mapping을 해야한다. 이러한 문제를 해결하기 위해 기존에 제시된 방법들은 GPS/INS 센서 같은 LiDAR와 독립적인 센서로 LiDAR의 움직임을 추정하거나 wheel encoder를 사용해 로봇의 odometry를 추정하는 방법을 사용했다. 하지만 해당 방법들은 매 루프마다 로봇의 움직임을 누적시키면서 odometry를 추정하므로 드리프트 문제가 발생한다. 이러한 문제점을 해결하기 위해 저자는 LOAM 알고리즘을 개발하였고 드리프트를 최소화하는 것이 목적이므로 loop closure를 사용하지 않았다. 즉, front-ends만 사용하여 실험했다.
LiDAR Hardware

본 논문에서 사용한 센서는 위와 같다. Hokuyo UTM-30LX 센서를 사용하였으며 180도의 FOV를 가지고 0.25 degree의 해상력을 가지며 1초에 40라인씩 스캔이 가능하고 1초에 180 degree 회전이 가능한 센서 모듈이다.

Software System Overview

전반적인 LOAM의 시스템은 위와 같이 구성되어 있다. 이 때 변수의 의미는 다음과 같다.

각 블록의 역할은 다음과 같다.
Lidar Odometry: 2개의 연속적인 Sweeps들을 받아서 relative motion을 계산하는 노드 (10 [hz])
Lidar Mapping: odometry를 바탕으로 계산된 undistorted 포인트클라우드의 offline map을 매칭하는 노드 (1 [hz])
Transform Integration: odometry와 mapping을 바탕으로 로봇의 현재 transform을 계산하는 노드
LiDAR Odometry
LiDAR Odometry는 크게 다음과 같이 3가지 알고리즘으로 구성되어 있다.
1. Feature Point Extraction
2. Finding Feature Point Correspondence
3. Motion Estimation
Feature Point Extraction

회전모터는 180 deg/s의 속도로 회전하고 Hokuyo 센서는 40 [hz] scan rate을 가지므로 2D laser scan과 수직방향의 해상도는 180/40 = 4.5 degree이다. 이 때, feature point는 sharp edge 또는 planar surface에 위치한 포인트로 정의한다.


위와 같이 정의했을 때 Local Surface의 smoothness
해당 공식에 따라 c가 상대적으로 큰 포인트들은 edge feature, 상대적으로 작은 포인트들은 planar feature라고 정의한다. 위 계산을 모두 마치면 다음 과정을 수행한다.
1. 1개의 Laserscan 데이터를 4개의 동일한 subregion으로 분리한 후
2. c 값을 기준으로 points들을 재정렬한다.
3. 하나의 subregion에서는 최대 2 edge points와 4 planer points를 가지도록 설정한다.
4. 임의의 한 점 i 는 c 값이 특정 threshold를 넘는 경우에만 edge point 또는 planar point가 될 수 있도록 설정한다.
c 값을 바탕으로 feature point들을 선정할 때 다음과 같은 경우는 outlier로 분류하여 제외한다.

- laser beam과 거의 평행한 평면 내부의 점인 경우
- 음영지역으로 인해 edge가 아닌 점이 edge로 오인된 경우

Finding Feature Point Correspondence
feature points 간의 상관관계를 계산하기 위해 sweeping 과정을 시간 순으로 표현하면 다음과 같다.

여기서


따라서

최종적으로
edge point

1.
2.
3.
4. 이렇게 구한
5.
공식을 사용해
planar point

1.
2.
3.
4.
5. 이렇게 구한
6.
를 사용해
Motion Estimation
LiDAR 센서는 sweeping 하는 동안 등각속도 운동을 한다고 모델링한다.

따라서 다른 시간대에 받은 센서 데이터를 통해 중간에 생략된 pose transform을 선형보간을 통해 계산할 수 있다. 예를 들어
-
-
-
특정 한 점
선형보간 법칙을 사용해서
-
-
-
-
-
-
-
선형보간 공식들을 사용해서 앞서 사용한
위 두 공식을 벡터화하여 표현하면 다음과 같다.

이 때, 에러 값은 bisquare weight 함수를 통해서 outlier에 강건하도록 설정한다.

지금까지의 LiDAR Odometry 과정을 요약하면 다음과 같다.

LiDAR Mapping
mapping 알고리즘은 10 [hz]로 수행되는 odometry 알고리즘과 달리 매 sweep이 끝나는 순간 (1 [hz] 주기)에 한 번만 수행된다. sweep이 끝날 때마다 odometry는 undistorted 포인트클라우드



-
-
-

feature point를 추출하는 방법은 odometry와 동일하나 odometry보다 10배 많은 feature를 추출한다. (1 [hz]의 속도로 계산이 수행되므로). correspondence를 찾기 위해 현재 위치에서 반경 10 [m]의 포인트클라우드만 사용한다.

-
-
-
위와 같이 정의한 후 eigendecomposition을 수행한다. 이를 수행하는 edge feature는
correspondence를 찾은 뒤에는 odometry 방식과 똑같은 공식을 사용하여

이렇게 계산된
Reference
자료를 공부하면서 같이 참고하면 좋은 링크들을 아래 첨부하였다
1. LeGO-LOAM 관련 블로그 포스팅 by Hyungtae Lim님: https://limhyungtae.github.io/2022-03-27-LeGO-LOAM-Line-by-Line-1.-Introduction/
2. SLAMKR 스터디, LOAM 분석 영상 by Jinyong Jeong님 : https://youtu.be/snPzNmcbCCQ
'Engineering' 카테고리의 다른 글
[SLAM] g2o example 코드 리뷰 (0) | 2022.06.09 |
---|---|
[SLAM] Visual LiDAR Odometry and Mapping (V-LOAM) 논문 리뷰 (0) | 2022.06.08 |
[SLAM] Depth Enhanced Monocular Odometry (DEMO) 논문 리뷰 (0) | 2022.06.08 |
[SLAM] Direct Sparse Odometry (DSO) 논문 및 코드 리뷰 (2) (11) | 2022.06.03 |
[SLAM] Direct Sparse Odometry (DSO) 논문 및 코드 리뷰 (1) (5) | 2022.06.03 |