ndt scan matcher
Purpose
ndt_scan_matcher is a package for position estimation using the NDT scan matching method.
There are two main functions in this package:
estimate position by scan matching
estimate initial position via the ROS service using the Monte Carlo method
Inner-workings / Algorithms
Flowcharts
Overview
callbackInitialPose
callbackMapPoints
callbackSensorPoints
serviceNDTAlign
timerDiagnostic
Sequence Diagrams
callbackSensorPoints and callbackInitialPose
The execution time of callbackSensorPoints
occasionally exceeds 100ms with Intel Core i7-8700, which will block callbackInitialPose
if the two callbacks are executed sequentially. The callbacks callbackSensorPoints
and callbackInitialPose
should be executed in parallel so that callbackSensorPoints
does not block callbackInitialPose
.
Name
Type
Description
ekf_pose_with_covariance
geometry_msgs::msg::PoseWithCovarianceStamped
initial pose
pointcloud_map
sensor_msgs::msg::PointCloud2
map pointcloud
points_raw
sensor_msgs::msg::PointCloud2
sensor pointcloud
Output
Name
Type
Description
ndt_pose
geometry_msgs::msg::PoseStamped
estimated pose
ndt_pose_with_covariance
geometry_msgs::msg::PoseWithCovarianceStamped
estimated pose with covariance
/diagnostics
diagnostic_msgs::msg::DiagnosticArray
diagnostics
points_aligned
sensor_msgs::msg::PointCloud2
[debug topic] pointcloud aligned by scan matching
initial_pose_with_covariance
geometry_msgs::msg::PoseWithCovarianceStamped
[debug topic] initial pose used in scan matching
exe_time_ms
autoware_debug_msgs::msg::Float32Stamped
[debug topic] execution time for scan matching [ms]
transform_probability
autoware_debug_msgs::msg::Float32Stamped
[debug topic] score of scan matching
iteration_num
autoware_debug_msgs::msg::Int32Stamped
[debug topic] number of scan matching iterations
initial_to_result_distance
autoware_debug_msgs::msg::Float32Stamped
[debug topic] distance difference between the initial point and the convergence point [m]
initial_to_result_distance_old
autoware_debug_msgs::msg::Float32Stamped
[debug topic] distance difference between the older of the two initial points used in linear interpolation and the convergence point [m]
initial_to_result_distance_new
autoware_debug_msgs::msg::Float32Stamped
[debug topic] distance difference between the newer of the two initial points used in linear interpolation and the convergence point [m]
ndt_marker
visualization_msgs::msg::MarkerArray
[debug topic] markers for debugging
monte_carlo_initial_pose_marker
visualization_msgs::msg::MarkerArray
[debug topic] particles used in initial position estimation
Service
Name
Type
Description
ndt_align_srv
autoware_localization_srvs::srv::PoseWithCovarianceStamped
service to estimate initial pose
Parameters
Core Parameters
Name
Type
Description
base_frame
string
Vehicle reference frame
input_sensor_points_queue_size
int
Subscriber queue size
ndt_implement_type
int
NDT implementation type (0=PCL_GENERIC, 1=PCL_MODIFIED, 2=OMP)
trans_epsilon
double
The maximum difference between two consecutive transformations in order to consider convergence
step_size
double
The newton line search maximum step length
resolution
double
The ND voxel grid resolution [m]
max_iterations
int
The number of iterations required to calculate alignment
converged_param_transform_probability
double
Threshold for deciding whether to trust the estimation result
omp_neighborhood_search_method
int
The Neighborhood search method in OMP (0=KDTREE, 1=DIRECT26, 2=DIRECT7, 3=DIRECT1)
omp_num_threads
int
Number of threads used for parallel computing
Assumptions / Known limits
(Optional) Error detection and handling
(Optional) References/External links
(Optional) Future extensions / Unimplemented parts
Implementation Specification in ROS2
callbackInitialPose
is executed in parallel with callbackMapPoints
, callbackSensorPoints
, and serviceNDTAlign
so that callbackSensorPoints
does not block callbackInitialPose
. The other callbacks belong to the same callback group to avoid a bug segmentation fault.
CallbackGroup
CallbackGroupType
CallbackName
initial_pose_callback_group
MutuallyExclusive
callbackInitialPose
main_callback_group
MutuallyExclusive
callbackMapPoints
main_callback_group
MutuallyExclusive
callbackSensorPoints
main_callback_group
MutuallyExclusive
serviceNDTAlign