class mp2p_icp_filters::FilterRangeBiasCorrection
Overview
Corrects, in place, a systematic surface offset of LiDAR returns that depends on range and incidence angle.
Some sensors measure surfaces slightly too near or too far, by an amount that grows with range and with the obliquity of the surface. This filter models that offset, measured along the surface normal, as:
with \(r\) the range from sensor_origin and \(\theta\) the angle between the viewing ray and the local surface normal. Each point is moved by \(-d\) along the normal oriented away from the sensor, so a negative \(d\) (surface measured too near) pushes the point outwards.
Normals come from the \(k\) nearest neighbors in the same cloud. Points whose neighborhood is not a well-defined plane are left untouched. The planar ones are classified as ground, slanted or wall by the vertical component of their normal in the cloud frame, and each class has its own \((a, b, c)\).
The coefficients are sensor-specific and must be calibrated; with all of them zero (the default) the filter does nothing.
YAML parameters:
pointcloud_layer: "deskewed" sensor_origin: [0, 0, 0.124] # sensor position in the cloud frame ground: [0.0116, -0.00123, -0.0085] # a [m], b [m/m], c [m] slanted: [0.0007, -0.00058, -0.0110] wall: [0.0044, -0.00052, -0.0172]
#include <FilterRangeBiasCorrection.h> class FilterRangeBiasCorrection: public mp2p_icp_filters::FilterBase { public: // structs struct Parameters; // fields Parameters params; // methods virtual void filter(mp2p_icp::metric_map_t& inOut) const; };
Inherited Members
public: // methods Parameterizable& operator = (const Parameterizable&); Parameterizable& operator = (Parameterizable&&); virtual void filter(mp2p_icp::metric_map_t& inOut) const = 0; FilterBase& operator = (const FilterBase&); FilterBase& operator = (FilterBase&&);
Fields
Parameters params
Algorithm parameters
Methods
virtual void filter(mp2p_icp::metric_map_t& inOut) const
See docs above for FilterBase.