자료실

제목라이다를 활용한 SLAM (LOAM)2024-05-14 11:29
작성자 Level 10

라이다를 활용한 SLAM

(LOAM)

 

이 글은 LiDAR(Light Detection and Ranging) 기반으로 SLAM 하는 방법을 간략히 설명한다. 

슬램은 임의의 위치에서 상대적 거리를 측정할 수 있는 센서를 이용해 실시간으로 지도를 생성하는 기술이다. 

이 기술은 무인자율차 등 실시간으로 2, 3차원 지도를 생성해야 할 때 사용한다. 

 

[크기변환]01.bmp
 
실시간 SLAM(Simultaneous localization and mapping) 기반 3D 맵(LOAM)

 

 

모바일 SLAM 결과(한국건설기술연구원 일산 건물)

이 글에서 SLAM을 활용해 보기 위해서 저가의 VLP-16 벨로다인 센서를 사용한다. 
참고로, 이 방법은 우분투 ROS 환경에서 실행된다. 
여기서 사용하는 환경은 ROS melodic 버전을 사용하였으며, NVIDIA TX2, 오드로이드 우분투 18.04 기반으로 TEST 하였다
(SLAM은 많은 계산시간이 필요하므로, NVIDIA TX와 같이 가능한 성능 좋은 컴퓨터를 사용하는 것이 좋다). 
이 경우에는 장치 소형화를 위해 부득이하게 오드로이드를 사용했다). 

 

 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SLAM 동작 방식

 

SLAM은 다음과 같은 단계로 스캔된 포인트 클라우드 장면(Scene)을 정합(registration)한다. 


1. 각 장면 별 특징(feature) 계산

보통 각 장면에서 스캔된 데이터 PCD에는 불변인 특징점이 존재한다.

 

예를 들어, 특정 곡률을 가진 포인트, 평면 포인트 클라우드 등이 그것이다. 

포인트 클라우드 스캔 특징이 있다면 이를 특징으로 사용하면 된다.

 

 

2. 각 장면 별 유사 특징 매칭

서로 같은 최소 3개 특징을 찾아 매칭할 수 있으면 다음과 같은 매칭 좌표변환행렬 MCT를 만들 수 있다. 

각 장면별 획득된 MCT는 Odometry 데이타를 포함한다.

 


3. 장면 정합
각 장면의 매칭 좌표변환행렬을 얻으면, 이를 장면의 포인트 클라우드에 적용한다.

이로써 한 좌표계로 각 장면의 데이터가 정합된다. 

이를 실시간으로 처리해야 하기 때문에 계산 성능이 좋은 장치를 사용해야 한다.

 

다음은 SLAM의 대표적 알고리즘 중 하나인 ICP를 이용한 실내 공간 스캔 데이터 정합 알고리즘이다.

 

ICP 기반 정합 행렬 계산 알고리즘(Yun-Ting Wang etc, 2018)

 

 

 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

LOAM

https://github.com/laboshinl/loam_velodyne 


선 SLAM 에서 잘 알려진 LOAM(Laser Odometry and Mapping) 방식 SLAM을 만들어보자.

다음과 같이 github에서 소스코드를 받고, 순서대로 빌드해 본다(링크1, 링크2 참고). 


$ cd ~/catkin_ws/src/
$ git clone https://github.com/laboshinl/loam_velodyne.git
$ cd ~/catkin_ws
$ catkin_make -DCMAKE_BUILD_TYPE=Release
$ source ~/catkin_ws/devel/setup.bash 

 

03(0).png

참고로, 오드로이드, 라즈베리파이 같이 램 용량이 적은 컴퓨터에서는 컴파일 에러가 발생한다. 

이 경우, 부록에 설명된 방법대로 스왑 용량을 설정해 컴파일 빌드하면 된다 

(컴파일이 몇시간 걸릴 수 있다). 


이제 roscore를 실행하고, 다음 명령을 실행한다.
roslaunch loam_velodyne loam_velodyne.launch

 

[크기변환]04.png
  실행된 ROS node 토픽(rqt_graph)

 


LOAM SLAM을 이용해 회사 사무실을 LiDAR로 스캔해 본 결과는 다음과 같다. 
점군 밀도가 밀집되어 있는 벽체가 진하게 표시되어 구분되는 것을 확인할 수 있다. 

[크기변환]05.png

[크기변환]06.png

[크기변환]07.png

[크기변환]09.png
SLAM 스캔 결과(건설연 본관 2동 3층)


점군이 모여있는 부분은 회사에 설치된 파티션이고, 그 외에 점들이 흩어져 있는 부분들은 천장 및 바닥이다. 
파티션의 경계선은 뚜렷하게 표시된 맵이 생성되지만, 아직 좌표계, 캘리브레이션, IMU 등을 제대로 설정하지 않은 상황이라, SLAM 맵 정확도가 높지는 않아 보인다. 
또한, 창 쪽 유리가 반사되어 노이즈가 생기는 것을 확인할 수 있다. 

SLAM 점군과 측량장비(GLM100C)와 측정값 간의 차이는 높이 2미터에서 1-0.5m 정도이다.
정확도는 좀 더 다양한 방법으로 확인할 필요가 있어보인다.


1차 SLAM 테스트


2차 SLAM 테스트

 
3차 SLAM 테스트(ODROID)


4차 SLAM 테스트(NVIDIA TX2로 테스트. IMU연결 안함. SLAM 맵 깨지는 현상이 덜함)

SLAM은 IMU 센서 유무에 따라 테스트해보았다.

두 경우 모두 급격한 회전이나 이동에 오차가 발생하는 것을 확인할 수 있다 (이 문제는 성능 낮은 저가 임베디드 보드 사용과 관련 있을 수 있다).

가능한 SLAM이 예측 가능한 방향으로 부드럽게 천천히 이동하는 것이 제일 품질이 좋다.

 

단, IMU 센서가 없는 경우 급격한 회전이나 이동시 오차가 상대적으로 더 많았으며, 정합 대상을 잃어버리면서 스캐닝되는 문제가 좀 더 빈번히 발생한다.

이렇게 정합이 안되고 발산하는 문제는 SLAM 기술의 일반적인 문제로 알려져 있다 (상용 SLAM 측량 기술도 동일한 문제가 발생한다).

그러므로 현재 기술은 아직 SLAM을 이용해 스캔하는 방법이 결과물에 나쁜 영향을 줄 수도 있다. 


참고로, VLP-16의 스캔 수직범위는 크지 않아, 360도 스캔을 위해서는 스캐너를 회전시켜야 한다.

 

아래 영상은 LiDAR를 회전시켜 360도로 점군을 획득해 맵을 생성하는 예이다. 

 


LOAM SLAM

SLAM 결과를 저장하려면 다음과 같이 토픽명을 지정하고 ROSBAG 명령어로 토픽 데이터를 저장하면 된다.
rosbag record -o out /laser_cloud_surround 


만약, PCD 포맷으로 변환하려면, 아래 명령을 이용해 [input bag]에 저장된 .bag파일명을 지정해 준다.
rosrun pcl_ros bag_to_pcd [input bag] /laser_cloud_surround pcd 


생성된 pcd파일은 다음과 같이 CloudCompare 프로그램으로 확인할 수 있다. 

[크기변환]11.jpeg
[크기변환]12.jpeg
[크기변환]13.jpeg
저장된 SLAM 정합 결과(CloudCompare)

참고로, 다음 명령을 이용해 미리 획득된 데이터를 플레이하거나 읽을 수 있다.
rosbag play ~/Downloads/velodyne.bag 
roslaunch velodyne_pointcloud VLP16_points.launch pcap:="$HOME/Downloads/velodyne.pcap"
 
LOAM동작을 이해하기 위해 소스코드를 UML로 역설계한다.

14.jpeg
LOAM SLAM UML

아울로 ROS NODE간 토픽 그래프를 RQT_GRAPH 명령을 이용해 확인해 본다.
ROS NODE 토픽 그래프

구조와 소스코드를 분석해 보면 다음과 같은 순서로 SLAM데이터를 계산하고 있는 것을 알 수 있다.

1. velodyne node: 스캔 후 point cloud 데이터 획득
2. multi scan registration node: 스캔된 데이터에서 곡률 기반 특징점(모서리, 평면) 생성
3. laser odometry: 이전 스캔 데이터에서 생성된 특징점을 기반으로 현재 스캔 데이터의 매특징점과 비교해 주행괘적(odometry)을 계산
4. laser mapping: 주행괘적을 이용해 스캔 데이터를 보정해 정합함. 만약, IMU 센서가 있는 경우, /imu/data에서 얻은 데이터를 이용해 데이터 보정함

LOAM은 특징점 계산에 많은 계산 시간이 필요하다.
이런 이유로 원칙적으로 NVIDIA TX2 이상의 임베디드 보드가 필요하다.
 
Scroll to Top