Skip to content

preprocessing

What happens to a scan between arriving and being registered. Filters drop points before they cost anything downstream, so anything excluded here is work the registration never has to do.

Option Default Starter
initial_scan_accumulate 3
downsample
  bypass_output_downsample true yes
  point_skip 1
  backend Backend
  query_resolution_factor 0.5
filter
  horizontal_fov false
  bounding_box
    x ..
    y ..
    z ..
    invert false
  distance
    range 4m..
    invert false
  horizontal_fov
    degrees ..
    forward [1.0, 0.0]
    invert false
  polygon_2d
    coords []
    global_zero_frame ""
    invert false
  intensity
    values ..
    invert false

preprocessing.initial_scan_accumulate

How many scans at the very start are merged into one before registration begins. A single scan from a non-repetitive scan pattern covers too little of the surroundings to build a map from, so the platform has to stand still until this many scans have arrived.

Type: integer.

Minimum: 0 (inclusive).

preprocessing.downsample

Reduces the number of points that reach the registration.

preprocessing.downsample.bypass_output_downsample

Publish the full undistorted cloud on the output topic. This changes only what is published. Registration always uses the downsampled cloud.

Type: boolean.

Part of the starter configuration.

preprocessing.downsample.point_skip

Downsample the incoming scan by keeping only every n-th point. 1 means no points are skipped.

Type: integer.

Minimum: 0 (inclusive).

preprocessing.downsample.backend

Where the downsampling runs. Backend uses the active acceleration backend when one is available, CPU always uses the CPU path.

Accepted values: cpu, backend

Accepted values are case-insensitive.

preprocessing.downsample.query_resolution_factor

Expected feature size in the incoming scan, as a factor of registration.map.resolution. Values between 0.0 and 1.0 are expected.

Type: number.

preprocessing.filter

Point filters. Each one is skipped while it is left at its default, and a point has to pass all of them to reach the registration.

preprocessing.filter.horizontal_fov

Keeps points within a horizontal angular sector, measured around the forward axis below. Useful where part of the field of view is permanently blocked, for example by a mast or an arm.

Type: boolean.

preprocessing.filter.bounding_box

Keeps points inside an axis-aligned box, given as one range per axis in the LiDAR frame. An open end means no limit on that side, so the default ".." on all three axes is a box of infinite size and keeps everything.

preprocessing.filter.bounding_box.x

Range along x, for example 1m..3m.

Type: range<length>.

preprocessing.filter.bounding_box.y

Range along y, for example 2m.. for everything beyond 2 metres.

Type: range<length>.

preprocessing.filter.bounding_box.z

Range along z, for example 4cm..100m.

Type: range<length>.

preprocessing.filter.bounding_box.invert

Keep the points outside the box instead of the ones inside it.

Type: boolean.

preprocessing.filter.distance

Keeps points whose distance from the sensor origin falls in this range. The default drops everything closer than 4 metres, which is usually the robot itself.

preprocessing.filter.distance.range

For example ..2m for everything up to 2 metres, or 1cm..4m for a band.

Type: range<length>.

preprocessing.filter.distance.invert

Keep the points outside the range instead of the ones inside it.

Type: boolean.

preprocessing.filter.horizontal_fov

preprocessing.filter.horizontal_fov.degrees

Angular range in degrees, for example 10..42.

Type: range<number>.

preprocessing.filter.horizontal_fov.forward

Axis the angular range is measured from, as [x, y] in the LiDAR frame.

Type: array<number>.

preprocessing.filter.horizontal_fov.invert

Keep the points outside the sector instead of the ones inside it.

Type: boolean.

preprocessing.filter.polygon_2d

Keeps points inside an arbitrary polygon in the ground plane, for cases a box or a sector cannot describe.

preprocessing.filter.polygon_2d.coords

Vertices in order, for example [ [1.0m, -1.5m], [-1.0m, 1.5m], [0m, 0m] ]. An empty list disables the filter.

Type: array<array<length>>.

preprocessing.filter.polygon_2d.global_zero_frame

TF frame the coordinates are given in. When set, the polygon is transformed into the sensor frame before it is applied, which makes it possible to express a boundary that stays fixed in the world while the robot moves. Empty means the coordinates are in the LiDAR frame.

preprocessing.filter.polygon_2d.invert

Keep the points outside the polygon instead of the ones inside it.

Type: boolean.

preprocessing.filter.intensity

Keeps points whose intensity falls in this range. Useful for dropping returns from retroreflective surfaces, which saturate and report a geometry that is not there.

preprocessing.filter.intensity.values

Range, normalized to 0.0..1.0.

Type: range<float>.

preprocessing.filter.intensity.invert

Keep the points outside the range instead of the ones inside it.

Type: boolean.