You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
C_LIO (Compact LiDAR-Inertial Odometry) is an evolution of DLIO (Direct LiDAR-Inertial Odometry) by the UCLA VECTR Lab. While DLIO provides a lightweight, real-time LIO frontend with continuous-time motion correction, C_LIO builds on top of it into a complete, production-ready SLAM system:
Backend pose graph — LIO-SAM-style iSAM2 with loop closure (distance + Scan Context++) and optional GPS factors running in a separate process, so pose-graph correction never starves the real-time odometry pipeline
Appearance-based auto localization — Scan Context++ relocalization for automatic initial pose estimation from a prior map, plus continuous Bayesian global alignment and two-stage submap localization for GPS-denied environments
Multiple registration backends — six interchangeable backends (gicp, ndt, robust_icp, and their CUDA counterparts) unified under a single align() API, selectable at runtime for both odometry and loop closure
Pluggable fusion engine — switchable IMU/scan-match fusion strategies (geometric observer, Kalman filter, error-state EKF) with a pose safety gate that rejects physically implausible results
CUDA acceleration — GPU kernels for deskewing, voxel filtering, GICP/RobustICP/NDT registration, and nearest-neighbor search; automatic CPU fallback when CUDA is absent
Keyframe database (KFDB) — persistent appearance descriptors and body-frame scans saved to disk for session-to-session relocalization
Occupancy grid, multi-sensor support, composable ROS 2 nodes, and more
Features
Feature
Description
CUDA Acceleration
GPU backends for registration (GICP/NDT/RobustICP), preprocessing (deskew + voxel filter), and nearest-neighbor search. Auto-detected at build time; CPU fallback when CUDA is absent
LIO-SAM opt runs in a separate process (nice -n 10) to prevent heavy ICP/GTSAM work from starving the real-time odometry pipeline. Map accumulation now lives inside OdomNode (the old standalone MapNode was merged in).
CUDA Toolkit (optional) — enables GPU registration/preprocessing; CPU fallback if absent
ndt_cuda_ros2 (optional) — enables the ndt_cuda registration method
sudo apt install libomp-dev libpcl-dev libeigen3-dev ros-humble-pcl-ros ros-humble-libg2o
# GTSAM: build from source or install via PPA# CUDA Toolkit: install via NVIDIA repo if GPU acceleration is desired
Build
cd<your_ws># Build ndt_cuda_ros2 first if the ndt_cuda method is needed:
colcon build --packages-select ndt_cuda_ros2 c_lio
source install/setup.bash
CUDA is enabled automatically when CUDAToolkit is found (C_LIO_HAS_CUDA). The ndt_cuda method is enabled only when ndt_cuda_ros2 is also found (C_LIO_HAS_NDT_CUDA); the two are decoupled so a broken ndt_cuda_ros2 build does not disable C_LIO's own CUDA kernels. Build messages report which mode was selected.
map/tf_source (in c_lio.yaml) decides who publishes map->odom: odom (OdomNode) or lio_sam_opt. Do not override it in lio_sam_map_optimization.yaml, or both nodes will publish TF and cause jumping.
Sensor Support
Auto-detected from point cloud fields:
Sensor
Field
Detection
Ouster
t
Nanosecond offset
Velodyne
time
Relative seconds
Hesai
timestamp (> 1e6)
Absolute seconds
Robosense
timestamp (< 1e6)
Relative seconds
Livox
timestamp (> 1e14)
Nanoseconds epoch
Published Topics
Topic
Type
Description
c_lio/odom_node/odom
nav_msgs/Odometry
Odometry estimate
c_lio/odom_node/pose
geometry_msgs/PoseStamped
Current pose
c_lio/odom_node/path
nav_msgs/Path
Trajectory path
c_lio/odom_node/pointcloud/deskewed
sensor_msgs/PointCloud2
Deskewed scan
c_lio/odom_node/pointcloud/deskewed_raw
sensor_msgs/PointCloud2
Deskewed scan (pre-voxel)
c_lio/odom_node/pointcloud/keyframe
sensor_msgs/PointCloud2
Keyframe cloud
c_lio/odom_node/keyframes
geometry_msgs/PoseArray
Keyframe poses
c_lio/odom_node/keyframe_stamped
KeyframeStamped
Keyframe → lio_sam_opt
c_lio/odom_node/occupancy_grid
nav_msgs/OccupancyGrid
2D occupancy grid
localization_confidence
std_msgs/Float32
Localization confidence
c_lio/map_node/map
sensor_msgs/PointCloud2
Accumulated map
c_lio/lio_sam_opt/corrected_path
nav_msgs/Path
Loop-closure corrected path
c_lio/lio_sam_opt/corrected_map
sensor_msgs/PointCloud2
Corrected full map
c_lio/lio_sam_opt/corrected_kf_poses
geometry_msgs/PoseArray
Corrected keyframe poses
c_lio/lio_sam_opt/corrected_fusion_path
nav_msgs/Path
KF-fused corrected path
c_lio/lio_sam_opt/corrected_fusion_odom
nav_msgs/Odometry
KF-fused corrected odom
c_lio/lio_sam_opt/loop_closures
visualization_msgs/MarkerArray
Loop closure markers
TF Transforms
Parent
Child
Description
map
odom
Global correction (from lio_sam_opt or continuous localization)
odom
base_link
Odometry pose (smooth, continuous)
base_link
imu
Static IMU extrinsics
base_link
lidar
Static LiDAR extrinsics
Runtime Services
Service
Topic
Description
GetState
/c_lio/odom_node/get_state
Query state, pose, stats
SetMode
/c_lio/odom_node/set_mode
Switch mapping/localization
SetPose
/c_lio/odom_node/set_pose
Manually set robot pose
Relocalize
/c_lio/odom_node/relocalize
Trigger SC + registration relocalization
NewMap
/c_lio/odom_node/new_map
Clear everything, start fresh
NewMapWZero
/c_lio/odom_node/new_map_w_zero
Clear + reset pose to zero
SavePCD
/c_lio/map_node/save_pcd
Save current map
SavePCD
/c_lio/lio_sam_opt/save_corrected_pcd
Save loop-closure corrected map
Debug Tools
Executable
Description
imu_integrator_node
Integrates raw IMU into a pure-IMU trajectory for sanity checks
imu_lidar_calib_node
IMU↔LiDAR extrinsic calibration via pure GICP (standalone, no SLAM dependency)
Standalone (non-composable) executables c_lio_odom_node and c_lio_lio_sam_map_opt_node are also built as convenience wrappers.
Based On
C_LIO is built on top of DLIO (Direct LiDAR-Inertial Odometry) by the VECTR Lab at UCLA.
@article{chen2022dlio,
title={Direct LiDAR-Inertial Odometry: Lightweight LIO with Continuous-Time Motion Correction},
author={Chen, Kenny and Nemiroff, Ryan and Lopez, Brett T},
journal={2023 IEEE International Conference on Robotics and Automation (ICRA)},
year={2023},
pages={3983-3989},
doi={10.1109/ICRA48891.2023.10160508}
}
Acknowledgements
DLIO — Kenny J. Chen, Ryan Nemiroff, Brett T. Lopez (UCLA VECTR Lab)
KISS-ICP — Ignacio Vizzo et al. (inspiration for Robust ICP + Voxel Hash Map)
LIO-SAM — Tixiao Shan (inspiration for iSAM2 map optimization)