새소식

SLAM

3D Mapping을 위한 고성능 프레임워크 GLIM : 1. 설치 및 도커

  • -

https://github.com/koide3/glim

 

GitHub - koide3/glim: GLIM: versatile and extensible range-based 3D localization and mapping framework

GLIM: versatile and extensible range-based 3D localization and mapping framework - koide3/glim

github.com

 

https://arxiv.org/abs/2202.00242

 

Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping

This paper presents a real-time 3D mapping framework based on global matching cost minimization and LiDAR-IMU tight coupling. The proposed framework comprises a preprocessing module and three estimation modules: odometry estimation, local mapping, and glob

arxiv.org

 

LiDAR-Inertial Mapping

 

LiDAR-Intertial Mapping은 라이다와 IMU를 이용해서 정밀한 3D 환경 지도를 생성하는 기술이다. 매핑 과정에서는 먼저 LiDAR가 수집한 포인트 클라우드 데이터와 IMU의 관성 데이터를 시간 동기화 하여 통합하고, 이후 스캔 매칭 알고리즘을 통해 연속된 스캔 간의 상대적인 변환 (Rotation과 Translation)을 계산하고, IMU 데이터를 통해 이를 보정한다. 

전역 최적화 단계에서는 모든 스캔과 IMU 측정값을 고려하여 Factor graph를 구성하고, 이를 최적화하여 전체적으로 일관된 맵을 생성한다. 이 과정에서 Loop closing을 통해 누적된 오차를 줄이고 맵의 전역적 일관성을 보장한다. 

GLIM은 2022년 ICRA에서 발표된 "Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping", 2024년 Arxiv에 공개된 "GLIM : 3D Range-Inertial Localization and Mapping with GPU-Accelerated Scan Matching Factors"에서 소개되는 기술을 사용할 수 있도록 해 주는 오픈소스 패키지이다. 

 

About GLIM

 

GLIM은 3D 매핑을 위한 프레임워크이다. 주요 특징은 다음과 같다. 

  • 정확도
    • Direct Multi-scan registration based on factor graph
    • GPU 가속 지원
  • 손쉬운 사용
    • interactive map correction interface 제공
    • 매핑 실패를 수동으로 수정하고 결과를 쉽게 개선 가능
  • 다양한 센서 지원
    • Velodyne
    • Livox
    • Intel Realsense
    • Azuer Kinect
  • 확장성 
    • 매핑 프로세스 내부 상태에 접근 가능
    • 추가 제약 조건을 Factor graph에 삽입 가능
    • glim_ext를 통해 루프 감지
  • 시스템 요구 사항
    • Ubuntu 22.04 / 24.04
    • CUDA 12.2 / 12.5
    • Nvidia Jetson Orin
  • 주요 Dependency
    • Eigen, OpenCV, GTSAM, gtsam_points
    • (Optional) CUDA, OpenMP, ROS/ROS2

 

GLIM using Docker


우선 도커를 설치한다. 

# install Docker on Ubuntu 18.04

sudo apt-get update

# HTTPS를 통해 저장소를 사용할 수 있도록 패키지 설치
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# Docker의 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# Docker의 공식 apt 저장소 추가
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

sudo apt-get update

# Docker 설치
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

# Docker 서비스 시작 및 부팅 시 자동 실행 설정
sudo systemctl start docker
sudo systemctl enable docker

GLIM은 Docker Hub에서 두 가지 버전으로 제공된다.

  • ROS 1 : koide3/glim_ros1
  • ROS 2 : koide3/glim_ros2

그래서 도커에서 GLIM을 사용하기 위해서는 다음과 같은 과정을 거친다.

# ROS1
# gpu 사용하지 않는 버전
sudo docker pull koide3/glim_ros1:noetic

# ROS 토픽을 호스트와 공유하기

sudo docker run \
    -it \
    --net=host \
    --ipc=host \
    --pid=host \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v $(realpath config):/glim/config \
    koide3/glim_ros1:noetic \

 

내가 사용하고 있는 장비의 사양은 다음과 같다. 그래픽카드가 없다. 

  • Intel NUC
  • Ubuntu 18.04, ROS1
  • Livox 360 3D LiDAR

 

도커를 켜고 안에 들어가 보면 다음과 같이 생겼다. 

root@nuc-NUC12WSKi7:~/catkin_ws/src/glim# ls
CMakeLists.txt  README.md  config  docs     mkdocs.yml   src
LICENSE         cmake      docker  include  package.xml  thirdparty


/catkin_ws/src/glim/config/config_ros.json 내부에서 ros topic 이름을 정하도록 되어 있다. 

  "glim_ros": {
    // Backend modules
    "enable_local_mapping": true,
    "enable_global_mapping": true,
    // Points config
    "keep_raw_points": false,
    // IMU config
    "imu_time_offset": 0.0,
    "points_time_offset": 0.0,
    "acc_scale": 1.0,
    // TF config
    "imu_frame_id": "imu",
    "lidar_frame_id": "lidar",
    "base_frame_id": "",
    "odom_frame_id": "odom",
    "map_frame_id": "map",
    "publish_imu2lidar": true,
    "tf_time_offset": 1e-6,
    // Extension modules
    "extension_modules": [
      "libmemory_monitor.so",
      "libstandard_viewer.so",
      "librviz_viewer.so"
      // "libimu_validator.so"
    ],
    // Topics
    "imu_topic": "/os_cloud_node/imu",
    "points_topic": "/os_cloud_node/points",
    "image_topic": "/image"
  }

 

config를 확인하고 rosrun 을 했는데 다음과 같은 에러가 뜬다. 

root@nuc-NUC12WSKi7:~/catkin_ws# rosrun glim_ros glim_rosnode

...
remove factor: x352 x353
remove factor: x353
factors:201 fixed:18446744073709551415 values:0 stamps:0
terminate called after throwing an instance of 'std::out_of_range'
  what():  Requested variable 'x355' is not in this VectorValues.
Aborted (core dumped)

# /src/gtsam_points/optimizers/incremental_fixed_lag_smoother_ext_with_fallback.cpp

 

이 에러는 보통 GTSAM 라이브러리를 사용하는 과정에서 Factor Graph 변수 제거에서 문제가 있을 때 발생한다고 한다. 그러나 이런 설명으로는 대체 내가 뭘 잘못 했는지 알 수가 없다. 

[rospack] Error: package 'glim_ext' not found

이런 에러도 뜬다.

 

*12.30 수정

$ ros2 bag info os1_128_01_downsampled

Files:             os1_128_01_downsampled.db3
Bag size:          492.6 MiB
Storage id:        sqlite3
Duration:          115.210s
Start:             Jul 14 2022 16:23:08.177 (1657783388.177)
End:               Jul 14 2022 16:25:03.387 (1657783503.387)
Messages:          12679
Topic information: Topic: /tf_static | Type: tf2_msgs/msg/TFMessage | Count: 1 | Serialization Format: cdr
                   Topic: /os_cloud_node/imu | Type: sensor_msgs/msg/Imu | Count: 11525 | Serialization Format: cdr
                   Topic: /os_cloud_node/points | Type: sensor_msgs/msg/PointCloud2 | Count: 1153 | Serialization Format: cdr

1. ROS2 도커는 문제 없이 잘 된다. 
2. Bag 파일은 로컬 컴퓨터가 Humble이 아닐 경우 도커에 같이 띄워서 도커 내부에서 Play 해야 한다. 

docker run \
>   -it \
>   --rm \
>   --net=host \
>   --ipc=host \
>   --pid=host \
>   --gpus all \
>   -e DISPLAY=$DISPLAY \
>   -v /tmp/.X11-unix:/tmp/.X11-unix \
>   -e ROS_DOMAIN_ID=0 \
>   -v $(realpath config):/glim/config \
>   -v $(realpath ~/Downloads/os1_128_01_downsampled):/data/os1_128_01_downsampled \
>   koide3/glim_ros2:humble_cuda12.2 \
>   /bin/bash
root@ubuntuurl-System-Product-Name:~/ros2_ws/src/glim# ros2 run glim_ros glim_rosnode

https://youtu.be/wS8CFmWmxEk

*12.31

ROS1,ROS2 도커 둘 다 아무 문제 없음... 

아무래도 no-gpu로 사용할 때 도커 내부 config를 잘못 수정해서 그런 듯 싶다. 그래픽카드 사용하는 버전은 아무 문제 없이 쉽게 사용 가능함. 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.