mp2p_icp_filters library

Overview

LiDAR and point cloud segmentation and filtering algorithms.

// typedefs

typedef std::vector<FilterBase::Ptr> mp2p_icp_filters::FilterPipeline;
typedef std::vector<Generator::Ptr> mp2p_icp_filters::GeneratorSet;

// enums

enum mp2p_icp_filters::DecimateMethod;
enum mp2p_icp_filters::MotionCompensationMethod;
enum mp2p_icp_filters::TimestampAdjustMethod;

// structs

struct mp2p_icp_filters::NotImplementedError;
struct mp2p_icp_filters::sm2mm_options_t;

// classes

class mp2p_icp_filters::FilterAbsoluteTimestamp;
class mp2p_icp_filters::FilterAdjustTimestamps;
class mp2p_icp_filters::FilterBase;
class mp2p_icp_filters::FilterBoundingBox;
class mp2p_icp_filters::FilterByExpression;
class mp2p_icp_filters::FilterByIntensity;
class mp2p_icp_filters::FilterByRange;
class mp2p_icp_filters::FilterByRing;
class mp2p_icp_filters::FilterClear;
class mp2p_icp_filters::FilterCurvature;
class mp2p_icp_filters::FilterDecimate;
class mp2p_icp_filters::FilterDecimateAdaptive;
class mp2p_icp_filters::FilterDecimateRangeAdaptive;
class mp2p_icp_filters::FilterDecimateVoxels;
class mp2p_icp_filters::FilterDeleteLayer;
class mp2p_icp_filters::FilterDeskew;
class mp2p_icp_filters::FilterEdgesPlanes;
class mp2p_icp_filters::FilterFartherPointSampling;
class mp2p_icp_filters::FilterMLS;
class mp2p_icp_filters::FilterMerge;
class mp2p_icp_filters::FilterNormalizeIntensity;
class mp2p_icp_filters::FilterPlanePatches;
class mp2p_icp_filters::FilterPoleDetector;
class mp2p_icp_filters::FilterPolygon2D;
class mp2p_icp_filters::FilterRemoveByVoxelOccupancy;
class mp2p_icp_filters::FilterRemovePointCloudField;
class mp2p_icp_filters::FilterRenameLayer;
class mp2p_icp_filters::FilterSOR;
class mp2p_icp_filters::FilterTransformPointCloud;
class mp2p_icp_filters::FilterVoxelSOR;
class mp2p_icp_filters::FilterVoxelSlice;
class mp2p_icp_filters::Generator;
class mp2p_icp_filters::GeneratorEdgesFromCurvature;
class mp2p_icp_filters::GeneratorEdgesFromRangeImage;
class mp2p_icp_filters::PointCloudToVoxelGrid;
class mp2p_icp_filters::PointCloudToVoxelGridAverage;
class mp2p_icp_filters::PointCloudToVoxelGridSingle;

// global variables

static constexpr static const char* mp2p_icp_filters::POINT_FIELD_INTENSITY = "intensity";
static constexpr static const char* mp2p_icp_filters::POINT_FIELD_RING_ID = "ring";
static constexpr static const char* mp2p_icp_filters::POINT_FIELD_TIMESTAMP = "t";

// global functions

mrpt::maps::CMetricMap::Ptr mp2p_icp_filters::CreateMetricMapFromDefinition(
    const mrpt::containers::yaml& metricMapDefinition,
    const std::string& metricMapDefinitionIniFile = std::string(),
    const mrpt::system::COutputLogger* logger = nullptr
    );

void mp2p_icp_filters::apply_filter_pipeline(
    const FilterPipeline& filters,
    mp2p_icp::metric_map_t& inOut,
    const mrpt::optional_ref<mrpt::system::CTimeLogger>& profiler = std::nullopt
    );

FilterPipeline mp2p_icp_filters::filter_pipeline_from_yaml(
    const mrpt::containers::yaml& c,
    const mrpt::system::VerbosityLevel& vLevel = mrpt::system::LVL_INFO
    );

FilterPipeline mp2p_icp_filters::filter_pipeline_from_yaml_file(
    const std::string& filename,
    const mrpt::system::VerbosityLevel& vLevel = mrpt::system::LVL_INFO
    );

bool mp2p_icp_filters::apply_generators(
    const GeneratorSet& generators,
    const mrpt::obs::CObservation& obs,
    mp2p_icp::metric_map_t& output,
    const std::optional<mrpt::poses::CPose3D>& robotPose = std::nullopt,
    const mrpt::optional_ref<mrpt::system::CTimeLogger>& profiler = std::nullopt
    );

mp2p_icp::metric_map_t mp2p_icp_filters::apply_generators(
    const GeneratorSet& generators,
    const mrpt::obs::CObservation& obs,
    const std::optional<mrpt::poses::CPose3D>& robotPose = std::nullopt
    );

bool mp2p_icp_filters::apply_generators(
    const GeneratorSet& generators,
    const mrpt::obs::CSensoryFrame& sf,
    mp2p_icp::metric_map_t& output,
    const std::optional<mrpt::poses::CPose3D>& robotPose = std::nullopt
    );

mp2p_icp::metric_map_t mp2p_icp_filters::apply_generators(
    const GeneratorSet& generators,
    const mrpt::obs::CSensoryFrame& sf,
    const std::optional<mrpt::poses::CPose3D>& robotPose = std::nullopt
    );

GeneratorSet mp2p_icp_filters::generators_from_yaml(
    const mrpt::containers::yaml& c,
    const mrpt::system::VerbosityLevel& vLevel = mrpt::system::LVL_INFO
    );

GeneratorSet mp2p_icp_filters::generators_from_yaml_file(
    const std::string& filename,
    const mrpt::system::VerbosityLevel& vLevel = mrpt::system::LVL_INFO
    );

mrpt::maps::CPointsMap::Ptr mp2p_icp_filters::GetOrCreatePointLayer(
    mp2p_icp::metric_map_t& m,
    const std::string& layerName,
    bool allowEmptyName = true,
    const std::string& classForLayerCreation = "mrpt::maps::CSimplePointsMap"
    );

double mp2p_icp_filters::robust_max_range(
    const mrpt::maps::CPointsMap& pc,
    double percentile = 0.95,
    const mrpt::math::TPoint3Df& center = {0, 0, 0}
    );

void mp2p_icp_filters::simplemap_to_metricmap(
    const mrpt::maps::CSimpleMap& sm,
    mp2p_icp::metric_map_t& outMap,
    const mrpt::containers::yaml& pipeline,
    const sm2mm_options_t& options = {}
    );

Typedefs

typedef std::vector<FilterBase::Ptr> mp2p_icp_filters::FilterPipeline

A sequence of filters

typedef std::vector<Generator::Ptr> mp2p_icp_filters::GeneratorSet

A set of generators

Global Functions

mrpt::maps::CMetricMap::Ptr mp2p_icp_filters::CreateMetricMapFromDefinition(
    const mrpt::containers::yaml& metricMapDefinition,
    const std::string& metricMapDefinitionIniFile = std::string(),
    const mrpt::system::COutputLogger* logger = nullptr
    )

Instantiates an empty mrpt::maps::CMetricMap object of the class described by a metric_map_definition YAML block, using the same schema accepted by Generator ‘s metric_map_definition parameter (a class key, plus optional plugin, creationOpts, insertOpts, likelihoodOpts, renderOpts, etc. sub-blocks), or from an external .ini file in the format expected by mrpt::maps::TSetOfMetricMapInitializers.

Internally builds a one-element mrpt::maps::CMultiMetricMap from the given initializer and returns its only submap. This is the very same mechanism Generator uses to create a custom-class layer the first time it processes a matching observation; it is exposed here as a standalone function so it can also be used without any observation at hand, e.g. to pre-create a layer for an mm-filter pipeline (see Generator::createTargetLayerIfNeeded()).

At least one of metricMapDefinition or metricMapDefinitionIniFile must be non-empty. If both are given, metricMapDefinitionIniFile takes precedence and metricMapDefinition is ignored.

Parameters:

metricMapDefinition

YAML map with, at least, a class key. Ignored if metricMapDefinitionIniFile is not empty.

metricMapDefinitionIniFile

Alternative to the above: a path to an external .ini file, taking precedence over metricMapDefinition if both are given.

logger

Optional logger, forwarded to mp2p_icp::load_plugin() if a plugin key is given.

void mp2p_icp_filters::apply_filter_pipeline(
    const FilterPipeline& filters,
    mp2p_icp::metric_map_t& inOut,
    const mrpt::optional_ref<mrpt::system::CTimeLogger>& profiler = std::nullopt
    )

Applies a pipeline of filters to a given metric_map_t

FilterPipeline mp2p_icp_filters::filter_pipeline_from_yaml(
    const mrpt::containers::yaml& c,
    const mrpt::system::VerbosityLevel& vLevel = mrpt::system::LVL_INFO
    )

Creates a pipeline of filters from a YAML configuration block (a sequence). Refer to YAML file examples. Returns an empty pipeline for an empty or null yaml node. Returned filters are already initialize()’d.

bool mp2p_icp_filters::apply_generators(
    const GeneratorSet& generators,
    const mrpt::obs::CObservation& obs,
    mp2p_icp::metric_map_t& output,
    const std::optional<mrpt::poses::CPose3D>& robotPose = std::nullopt,
    const mrpt::optional_ref<mrpt::system::CTimeLogger>& profiler = std::nullopt
    )

Applies a set of generators to a given input raw observation(s) and generates a metric_map_t.

The former contents on the output metric_map_t object are untouched, so calling this function several times can be used to accumulate point cloud elements from different sensors.

Returns:

true if any of the generators actually processed “obs”

GeneratorSet mp2p_icp_filters::generators_from_yaml(
    const mrpt::containers::yaml& c,
    const mrpt::system::VerbosityLevel& vLevel = mrpt::system::LVL_INFO
    )

Creates a set of generators from a YAML configuration block (a sequence). Returns an empty generators set for an empty or null yaml node. Refer to YAML file examples. Returned generators are already initialize()’d.

double mp2p_icp_filters::robust_max_range(
    const mrpt::maps::CPointsMap& pc,
    double percentile = 0.95,
    const mrpt::math::TPoint3Df& center = {0, 0, 0}
    )

Outlier-robust estimate of a point cloud’s maximum range (distance from a center point, default the origin).

Plain boundingBox().max.norm() is dominated by even a single spurious far return (e.g. specular-reflection artifacts observed on Livox sensors, hundreds of meters away in an otherwise <20 m scene): consumers that use such an estimate to size a downstream voxel grid or range filter can end up starving the real, near-field points. This function instead returns the given percentile of the per-point range distribution, so a small minority of extreme points cannot dominate it.

Implemented with std::nth_element (average O(n)), not a full sort.

Parameters:

pc

The point cloud. May be empty, in which case 0 is returned.

percentile

In (0,1]. Ranges are sorted and the value at this fraction is returned; e.g. 0.95 (the default) discards the top 5% of ranges as potential outliers. 1.0 reproduces the plain maximum.

center

Ranges are measured from this point.

void mp2p_icp_filters::simplemap_to_metricmap(
    const mrpt::maps::CSimpleMap& sm,
    mp2p_icp::metric_map_t& outMap,
    const mrpt::containers::yaml& pipeline,
    const sm2mm_options_t& options = {}
    )

Utility function to build metric maps (”*.mm”) from raw observations as a simple map (”*.sm”). For a ready-to-use CLI application exposing this function, as well as documentation on the meaning of each argument, see sm2mm.

The former contents of outMap are cleared.

If options.georeferencing is set, robot poses are transformed into the ENU frame (via T_enu_to_map \oplus robotPose) before being handed to the generators, and the output map is tagged with the corresponding georeferencing metadata (with T_enu_to_map set to identity).