![]() |
lidarslam_ros2 repositorylocalization 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