Repo symbol

lidarslam_ros2 repository

localization robotics mapping ros lidar slam ros2
Repo symbol

lidarslam_ros2 repository

localization robotics mapping ros lidar slam ros2
Repo symbol

lidarslam_ros2 repository

localization robotics mapping ros lidar slam ros2
Repo symbol

lidarslam_ros2 repository

localization robotics mapping ros lidar slam ros2
Repo symbol

lidarslam_ros2 repository

localization robotics mapping ros lidar slam ros2 graph_based_slam lidarslam lidarslam_msgs scanmatcher

Repository Summary

Description ROS 2 package of 3D lidar slam using ndt/gicp registration and pose-optimization
Checkout URI https://github.com/rsasaki0109/lidarslam_ros2.git
VCS Type git
VCS Version develop
Last Updated 2025-07-22
Dev Status UNKNOWN
Released UNRELEASED
Tags localization robotics mapping ros lidar slam ros2
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
graph_based_slam 0.0.0
lidarslam 0.0.0
lidarslam_msgs 0.0.0
scanmatcher 0.0.0

README

lidarslam_ros2

ros2 slam package of the frontend using OpenMP-boosted gicp/ndt scan matching and the backend using graph-based slam.

mobile robot mapping

Green: path with loopclosure
(the 25x25 grids in size of 10m × 10m)

Red and yellow: map

summary

lidarslam_ros2 is a ROS2 package of the frontend using OpenMP-boosted gicp/ndt scan matching and the backend using graph-based slam.
I found that even a four-core laptop with 16GB of memory could work in outdoor environments for several kilometers with only 16 line LiDAR.
(WIP)

requirement to build

You need ndt_omp_ros2 for scan-matcher

clone (If you forget to add the –recursive option when you do a git clone, run git submodule update --init --recursive in the lidarslam_ros2 directory)

cd ~/ros2_ws/src
git clone --recursive https://github.com/rsasaki0109/lidarslam_ros2
cd ..
rosdep install --from-paths src --ignore-src -r -y

build

colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release

io

frontend(scan-matcher)

  • input
    /input_cloud (sensor_msgs/PointCloud2)
    /tf(from “base_link” to LiDAR’s frame)
    /initial_pose (geometry_msgs/PoseStamed)(optional)
    /imu (sensor_msgs/Imu)(optional)
    /tf(from “odom” to “base_link”)(Odometry)(optional)

  • output
    /current_pose (geometry_msgs/PoseStamped)
    /map (sensor_msgs/PointCloud2)
    /path (nav_msgs/Path)
    /tf(from “map” to “base_link”)
    /map_array(lidarslam_msgs/MapArray)

backend(graph-based-slam)

  • input
    /map_array(lidarslam_msgs/MapArray)
  • output
    /modified_path (nav_msgs/Path)
    /modified_map (sensor_msgs/PointCloud2)

  • srv
    /map_save (std_srvs/Empty)  

how to save the map

pose_graph.g2o and map.pcd are saved in loop closing or using the following service call.

ros2 service call /map_save std_srvs/Empty

params

  • frontend(scan-matcher)
Name Type Default value Description
registration_method string “NDT” “NDT” or “GICP”
ndt_resolution double 5.0 resolution size of voxel[m]
ndt_num_threads int 0 threads using ndt(if 0 is set, maximum alloawble threads are used.)(The higher the number, the better, but reduce it if the CPU processing is too large to estimate its own position.)
gicp_corr_dist_threshold double 5.0 the distance threshold between the two corresponding points of the source and target[m]
trans_for_mapupdate double 1.5 moving distance of map update[m]
vg_size_for_input double 0.2 down sample size of input cloud[m]
vg_size_for_map double 0.05 down sample size of map cloud[m]
use_min_max_filter bool false whether or not to use minmax filter
scan_max_range double 100.0 max range of input cloud[m]
scan_min_range double 1.0 min range of input cloud[m]
scan_period double 0.1 scan period of input cloudsec
map_publish_period double 15.0 period of map publish[sec]
num_targeted_cloud int 10 number of targeted cloud in registration(The higher this number, the less distortion.)
set_initial_pose bool false whether or not to set the default pose value in the param file
initial_pose_x double 0.0 x-coordinate of the initial pose value[m]
initial_pose_y double 0.0 y-coordinate of the initial pose value[m]
initial_pose_z double 0.0 z-coordinate of the initial pose value[m]
initial_pose_qx double 0.0 Quaternion x of the initial pose value
initial_pose_qy double 0.0 Quaternion y of the initial pose value
initial_pose_qz double 0.0 Quaternion z of the initial pose value
initial_pose_qw double 1.0 Quaternion w of the initial pose value
publish_tf bool true Whether or not to publish tf from global frame to robot frame
use_odom bool false whether odom is used or not for initial attitude in point cloud registration

File truncated at 100 lines see the full file

Repo symbol

lidarslam_ros2 repository

localization robotics mapping ros lidar slam ros2
Repo symbol

lidarslam_ros2 repository

localization robotics mapping ros lidar slam ros2
Repo symbol

lidarslam_ros2 repository

localization robotics mapping ros lidar slam ros2
Repo symbol

lidarslam_ros2 repository

localization robotics mapping ros lidar slam ros2