LiDAR Marker Localizer#
LiDARMarkerLocalizer is a detect-reflector-based localization node .
Inputs / Outputs#
lidar_marker_localizer node#
Input#
| Name | Type | Description |
|---|---|---|
~/input/lanelet2_map |
autoware_map_msgs::msg::HADMapBin |
Data of lanelet2 |
~/input/pointcloud |
sensor_msgs::msg::PointCloud2 |
PointType: PointXYZIRC is recommended in Autoware, but PointXYZIRADRT are also supported in this node.1 |
~/input/ekf_pose |
geometry_msgs::msg::PoseWithCovarianceStamped |
EKF Pose |
Output#
| Name | Type | Description |
|---|---|---|
~/output/pose_with_covariance |
geometry_msgs::msg::PoseWithCovarianceStamped |
Estimated pose |
/diagnostics |
diagnostic_msgs::msg::DiagnosticArray |
Diagnostics outputs |
For debug#
| Name | Type | Description |
|---|---|---|
~/debug/pose_with_covariance |
geometry_msgs::msg::PoseWithCovarianceStamped |
Estimated pose |
~/debug/marker_detected |
geometry_msgs::msg::PoseArray |
Detected marker poses |
~/debug/marker_mapped |
visualization_msgs::msg::MarkerArray |
Loaded landmarks to visualize in Rviz as thin boards |
~/debug/marker_pointcloud |
sensor_msgs::msg::PointCloud2 |
PointCloud of the detected marker |
~/debug/center_intensity_grid |
nav_msgs::msg::OccupancyGrid |
Center intensity grid for debug |
~/debug/positive_grid |
nav_msgs::msg::OccupancyGrid |
Positive match grid for debug |
~/debug/negative_grid |
nav_msgs::msg::OccupancyGrid |
Negative match grid for debug |
~/debug/matched_grid |
nav_msgs::msg::OccupancyGrid |
Matched pattern grid for debug |
~/debug/vote_grid |
nav_msgs::msg::OccupancyGrid |
Vote grid for marker detection debug |
Parameters#
| Name | Type | Description | Default | Range |
|---|---|---|---|---|
| enable_ |
boolean | true | N/A | |
| target_ |
array | List of target marker IDs to be detected. | ["0000", "0001", "0002", "0003", "0004", "0005"] | N/A |
| queue_ |
float | Queue size for output/pose_with_covariance publisher | 10 | ≥0 |
| marker_ |
string | The name of the markers listed in the HD map. | reflector | N/A |
| road_ |
boolean | Detect markers on the road surface instead of markers on a vertical surface. In this mode the lateral position is not observed: the y of the detected marker is fixed to marker_to_vehicle_offset_y, so the lateral position of the output pose is the mapped marker position minus this offset. Use this mode only where the lateral position of the vehicle relative to the marker is known (e.g. the vehicle always passes the marker on a fixed path). marker_height_from_ground is used as the height of the road surface marker (typically 0.0), reference_ring_number is not used, and the debug grids are drawn horizontally around marker_to_vehicle_offset_y. | false | N/A |
| resolution | float | Grid size for marker detection algorithm. [m] | 0.05 | ≥0.0 |
| intensity_ |
array | A sequence of high/low intensity to perform pattern matching. 1: high intensity (positive match), 0: not consider, -1: low intensity (negative match) | [-1, -1, 0, 1, 1, 1, 1, 1, 0, -1, -1] | N/A |
| match_ |
float | Threshold for determining high/low. | 20 | ≥0 |
| positive_ |
float | Threshold for the number of required matches with the pattern. | 3 | ≥0 |
| negative_ |
float | Threshold for the number of required matches with the pattern. | 3 | ≥0 |
| vote_ |
float | Threshold for the number of rings matching the pattern needed to detect it as a marker. | 20 | ≥0 |
| marker_ |
float | Y-axis offset from the center of the marker to vehicle. [m] | 0.0 | N/A |
| marker_ |
float | Height from the ground to the center of the marker. [m] | 1.075 | N/A |
| lower_ |
float | Initial value when searching for the lowest ring ID within the point cloud | 128 | ≥0 |
| upper_ |
float | Initial value when searching for the highest ring ID within the point cloud | 0 | ≥0 |
| reference_ |
float | Reference ring number when detecting the marker. Set 255 to disable ring filtering | 255 | N/A |
| self_ |
float | Timeout for self pose. [sec] | 1.0 | ≥0.0 |
| self_ |
float | Tolerance for the distance between two points when performing linear interpolation. [m] | 1.0 | ≥0.0 |
| limit_ |
float | Distance limit for the purpose of determining whether the node should detect a marker. [m] | 2.0 | ≥0.0 |
| limit_ |
float | Y-axis distance limit for the purpose of determining whether the node should detect a marker. [m] | 1.0 | ≥0.0 |
| limit_ |
float | Distance limit for avoiding miss detection. [m] | 2.0 | ≥0.0 |
| base_ |
array | Output covariance in the base_link coordinate. | [0.04, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.569e-05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.569e-05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00030625] | N/A |
| marker_ |
float | Width of a marker. This param is used for visualizing the detected marker pointcloud[m] | 0.8 | ≥0.0 |
| enable_ |
boolean | false | N/A | |
| save_ |
string | $(env HOME)/ |
N/A | |
| save_ |
string | detected_ |
N/A | |
| save_ |
string | velodyne_ |
N/A | |
| radius_ |
float | Only points closer than this value to the marker center on the xy plane are extracted as the “marker point cloud”. [m] | 0.4 | ≥0.0 |
| queue_ |
float | Queue size for debug publishers | 10 | ≥0.0 |
How to launch#
When launching Autoware, set lidar-marker for pose_source.
ros2 launch autoware_launch ... \
pose_source:=lidar-marker \
...
Design#
Flowchart#
Detection Algorithm#

- Split the LiDAR point cloud into rings along the x-axis of the base_link coordinate system at intervals of the
resolutionsize. - Find the portion of intensity that matches the
intensity_pattern. - Perform steps 1 and 2 for each ring, accumulate the matching indices, and detect portions where the count exceeds the
vote_threshold_for_detect_markeras markers.
Sample Dataset#
This dataset was acquired in National Institute for Land and Infrastructure Management, Full-scale tunnel experiment facility. The reflectors were installed by Taisei Corporation.
Collaborators#
-
Assumed
ringofPointXYZIRADRTaschannelofPointXYZIRC. ↩