Environments with sparse or repetitive geometric structures, such as long corridors and narrow stairwells, remain challenging for LiDAR-IMU SLAM. In these scenarios, insufficient geometric observability and noisy associations commonly degrade the reliability of tracking and optimization modules.
To address these limitations, we propose a novel LiDAR-IMU SLAM framework, \textbf{VINA-SLAM}, which establishes a unified 3D global voxel map and collects global structure cues into the voxel map. To be specific, VINA-SLAM first continuously tracks surface normals stored in the global voxel map using a normal-guided correspondence strategy.
Then, a tangent-space metric is further proposed to explicitly supplement rotational constraints around planar regions into a local bundle adjustment module, providing robust initial pose estimates even in geometrically degenerate regions. Specifically, the VNC (Vector Normal Consistency) module computes a 3D vector residual r = S * n_scan_world where S = I - n_map * n_map^T projects onto the map normal's tangent plane, yielding a rank-2 constraint per normal pair that constrains two rotation DOFs. Map plane matching uses a 27-neighbor voxel search with normal consistency filtering (rejecting pairs with angular deviation > 45 degrees) to prevent cross-structure mismatches.
Finally, we formulate a sliding-window bundle adjustment module that tightly couples IMU factors, normal consistency factors, and planar constraints. A key component is the use of the minimum eigenvalue of each voxel's covariance, as a statistically principled planar factor that improves the Hessian condition number and enhances cross-view geometric consistency.
-
Edit a config under
config/(e.g.config/robosense_airy.yaml): setGeneral.bag_pathto a rosbag2 directory, and matchlid_topic/imu_topic/lidar_typeto the bag. -
Build and launch:
cd /path/to/ws
colcon build --packages-select vina_slam
source /opt/ros/humble/setup.bash
source install/setup.bash
ros2 launch vina_slam start.launch.py vina_config:=robosense_airy.yamlOptional: launch_rviz:=false to skip RViz. The node reads LiDAR/IMU from the bag itself; no separate ros2 bag play is needed.
Available configs: mid360.yaml, velodyne.yaml, robosense.yaml, robosense_airy.yaml, HILTI.yaml, outdoor_fly.yaml, compus_elevator.yaml.
If you use VINA-SLAM for any academic work, please cite our original paper
@article{zhang2026vina,
title={VINA-SLAM: A Voxel-Based Inertial and Normal-Aligned LiDAR--IMU SLAM},
author={Zhang, Ruyang and Sun, Bingyu},
journal={Sensors},
volume={26},
number={6},
pages={1810},
year={2026},
publisher={MDPI}
}
- Thanks for VoxelMap.
- Thanks for Voxel-SLAM.



