Exwayz Relocalization algorithm takes in input:
Its goal is to register the incoming LiDAR data on the map using a 3D registration algorithm. This registration algorithm needs an initial guess of where the LiDAR is when the process starts. Once initialized, the initialization pose is not used anymore.
For performing this registration, the relocalization follows a 2 steps pipeline:
Pre processing : aims at reducing the number of points provided to the registration algorithm (ICP), mainly discarding troublesome or redundant point on the raw data.
ICP : The ICP (Iterative Closest Point) is the registration algorithm used to compute the relative position of the upcoming frame relatively to the local map being built.
Below is the example relocalization.yaml
configuration file with all parameters open to the user. The comments are the main documentation of each parameters.
relocalization:
# [optional] Minimum number of successful consecutive initialization to
# switch to FIX mode
min_num_init: 20
# [optional, default=true] Enable motion compensation using the frames'
# timestamps
enable_motion_compensation: true
# [optional] Preprocessing settings
pre_process:
# [optional, default=2] Number of threads used for pre-processing
num_threads: 2
# [optional, default=32] Number of rows for the spherical subsampling
num_rows : 32
# [optional, default=512] Number of cols for the spherical subsampling
num_cols : 512
# [optional, default=closest] Keep strategy for each pixel
# * closest: keep only the point with lowest range in each pixel
# * farthest: keep only the point with highest range in each pixel
# * both: keep both points with lowest and highest range in each pixel
keep_strategy : farthest
# [optional, default=0.2(m)] Minimum range of a point to be preserved
# in subsampling
range_min: 2.0
# [optional, default=250.0(m)] Maximum range of a point to be preserved
# in subsampling
range_max: 150.0
# [optional, default=[0.0, 0.0, 0.0](m)] Center of the exclusion
# axis-aligned box
center: [0.0, 0.0, 0.0]
# [optional, default=[0.0, 0.0, 0.0](m)] Size of the exclusion
# axis-aligned box
size: [5.0, 5.0, 5.0]
# [optional, default=0.1(m)] Resolution of the final voxel subsampling
grid_resolution: 0.1
# [optional] ICP parameters used for initialization
icp_init:
# [optional, default=2] Number of threads used for nearest neighbour
# search
num_threads: 2
# [optional, default=10] Maximimum number of iterations
num_iter: 5
# [optional, default=0.5(m)] Outlier rejection distance
d_max: 0.5
# [optional] ICP parameters used for localization
icp:
num_threads: 2
num_iter: 5
d_max: 0.2
# [optional] Local mapping settings
local_mapping:
# [required if local_mapping key found, default=false] Enable / disable
# local mapping
enable: false
# [optional, default=50] Minimum nb of consecutive FIX before start
# building the local map
min_num_fix: 50
# [optional] Loacl map parameters
map_local:
# [optional, default=0.5(m)] Linear distance to the last added frame
# for triggering map update
d_update: 0.5
# [optional, default=200.0(m)] Pruning radius of the map
d_prune: 200.0
# [optional, default=30] Number of neighbors used to compute map
# normals
normals_knn: 30
# [optional, default=0.2(m)] Map voxel size
resolution: 0.2
# [required] Static map parameters
map_static:
# [required] .map file path.
path: <path-to-map-file>
# [optional] SHA1 to check the map file specified in 'path'
# correspondance.
sha1: <map-sha1>
# [optional] Map projection coordinate system (used for navsatfix
# output).
crs: <map-crs>
# [optional] Transformation made on initiation input settings
init:
# [optional] Calibration applied to the initialization pose
calib:
# [optional, default=[0.0, 0.0, 0.0](m)] Translation
translation: [0.0, 0.0, 0.0]
# [optional, default=[0.0, 0.0, 0.0](rad)] Euler angles [Rx, Ry, Rz]
# (roll, pitch yaw)
euler: [0.0, 0.0, 0.0]
# [optional, default=false] Interprete the angles in degrees
angles_degrees: true
# [optional] Checks on input data
checks:
# [optional, default=0.25] Minimum expected overlap to the map after
# registration. Switch to ERROR mode if not respected
min_overlap: 0.25
# [optional, default=0.1(m)] Maximum distance to the map after
# registration. Switch to ERROR mode if not respected
max_distance_to_map: 0.1
# [optional, default=0.7] Rejection ratio used to discard incoming
# frames that have suspiciously low nb of points, e.g. less than
# input_rejection_ratio * previous_frame
input_rejection_ratio: 0.7
# [optional] Output settings
output:
# [optional, default=2] Output point cloud mode
# * 0: no output pointcloud
# * 1: process (subsampled) point cloud
# * 2: full frame
pc_mode: 1
# [optional] Calibration applied to the output pose
calib:
translation: [1.0, 0.0, 0.0]
# [optional, default=[1.0, 0.0, 0.0, 0.0]] Orientation as
# quaternion interpreted in Hamiltonian convention (qw, qx, qy, qz)
quaternion: [1.0, 0.0, 0.0, 0.0]
# [required] (ros only) ROS parameters
ros:
# [optional, default=/exwayz/relocalization] Output namespace, prepends
# all outputs.
namespace: /exwayz/relocalization
# [required] Input PointCloud2 topic
input_pointcloud2:
# [required] Topic name
topic: <topic-name>
# [optional, default=20] Subscribe queue size
queue_size: 1
# [required] Input Odometry topic
input_odometry:
# [required] Topic name
topic: <topic-name>
# [optional] Output Odometry settings
output_odometry:
# [optional, default=/odometry] Output topic
topic: /odometry
# [optional, default=xyz_map] Odometry message header.frame_id
parent_frame_id: xyz_map
# [optional, default=""] Odometry message child_frame_id. If empty,
# input PointCloud2 frame id is used
child_frame_id: reloc
# [optional, default=false] Optionally inverts output pose and
# frame_ids
invert: false
# [optional, default=false] Publish parent->child TF using the
# output Odometry
publish_tf: false
output_odometry_local:
# [optional, default=/odometry_local] Output topic
topic: /odometry_local
# [optional, default=xyz_map] Odometry message header.frame_id
parent_frame_id: xyz_map
# [optional, default=""] Odometry message child_frame_id. If empty,
# input PointCloud2 frame id is used
child_frame_id: reloc
# [optional, default=false] Optionally inverts output pose and
# frame_ids
invert: false
# [optional, default=false] Publish parent->child TF using the
# output Odometry
publish_tf: true
# [optional] Output NavSatFix settings
output_navsatfix:
# [optional, default=/navsatfix]
topic: /navsatfix
# [optional] Output PointCloud2 settings
output_pointcloud2:
# [optional, default=/pointcloud2] Output topic
topic: /pointcloud2
# [optional, default=""] Output frame id. If empty, input
# PointCloud2 frame id is used
frame_id: reloc
# [optional] Output ExwayzStatus settings
output_status:
# [optional, default=/status]
topic: /status
# [optional] (rtmaps only) RTMaps parameters
rtmaps:
# [optional, default=5000(Ko)] Point cloud output buffer size
pc_buffer_size: 5000
min_num_init
enable_motion_compensation
preprocess
icp_init
icp
local_mapping
map_static