No version for distro humble showing github. Known supported distros are highlighted in the buttons above.

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
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

No version for distro jazzy showing github. Known supported distros are highlighted in the buttons above.

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
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

No version for distro kilted showing github. Known supported distros are highlighted in the buttons above.

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
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

No version for distro rolling showing github. Known supported distros are highlighted in the buttons above.

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
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

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
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

No version for distro galactic showing github. Known supported distros are highlighted in the buttons above.

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
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

No version for distro iron showing github. Known supported distros are highlighted in the buttons above.

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
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

No version for distro melodic showing github. Known supported distros are highlighted in the buttons above.

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
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

No version for distro noetic showing github. Known supported distros are highlighted in the buttons above.

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
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