Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,12 @@
"deskewed",
"eigen",
"linearization",
"Mañas",
"recolorize",
"relinearization",
"reproject",
"tfest",
"unitarize",
"unrealize",
"voxelizes",
"voxelmaps",
Expand All @@ -52,6 +54,7 @@
"ENTYPO",
"GLFW",
"TBoundingBoxf",
"imLinear2Neig"
"imLinear2Neig",
"jacob_dDexpe_de"
]
}
4 changes: 3 additions & 1 deletion mp2p_icp_filters/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ set(LIB_SRCS
src/FilterAdjustTimestamps.cpp
src/FilterBase.cpp
src/FilterBoundingBox.cpp
src/FilterByExpression.cpp
src/FilterByIntensity.cpp
src/FilterByRange.cpp
src/FilterByRing.cpp
Expand All @@ -16,8 +17,8 @@ set(LIB_SRCS
src/FilterDeskew.cpp
src/FilterEdgesPlanes.cpp
src/FilterFartherPointSampling.cpp
src/FilterMLS.cpp
src/FilterMerge.cpp
src/FilterMLS.cpp
src/FilterNormalizeIntensity.cpp
src/FilterPoleDetector.cpp
src/FilterRemoveByVoxelOccupancy.cpp
Expand All @@ -37,6 +38,7 @@ set(LIB_PUBLIC_HDRS
include/mp2p_icp_filters/FilterAdjustTimestamps.h
include/mp2p_icp_filters/FilterBase.h
include/mp2p_icp_filters/FilterBoundingBox.h
include/mp2p_icp_filters/FilterByExpression.h
include/mp2p_icp_filters/FilterByIntensity.h
include/mp2p_icp_filters/FilterByRange.h
include/mp2p_icp_filters/FilterByRing.h
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,6 @@ class FilterAdjustTimestamps : public mp2p_icp_filters::FilterBase
public:
FilterAdjustTimestamps();

// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

// See docs in FilterBase
void filter(mp2p_icp::metric_map_t& inOut) const override;

Expand All @@ -83,6 +80,10 @@ class FilterAdjustTimestamps : public mp2p_icp_filters::FilterBase

/** Algorithm parameters */
Parameters params;

protected:
// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;
};

/** @} */
Expand Down
3 changes: 0 additions & 3 deletions mp2p_icp_filters/include/mp2p_icp_filters/FilterBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,6 @@
#include <mrpt/rtti/CObject.h>
#include <mrpt/system/COutputLogger.h>

#include <cstdint>
#include <stdexcept>

namespace mrpt::system
{
class CTimeLogger;
Expand Down
7 changes: 4 additions & 3 deletions mp2p_icp_filters/include/mp2p_icp_filters/FilterBoundingBox.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,6 @@ class FilterBoundingBox : public mp2p_icp_filters::FilterBase
public:
FilterBoundingBox();

// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

// See docs in FilterBase
void filter(mp2p_icp::metric_map_t& inOut) const override;

Expand Down Expand Up @@ -71,6 +68,10 @@ class FilterBoundingBox : public mp2p_icp_filters::FilterBase

/** Algorithm parameters */
Parameters params;

protected:
// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;
};

/** @} */
Expand Down
83 changes: 83 additions & 0 deletions mp2p_icp_filters/include/mp2p_icp_filters/FilterByExpression.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/* _
_ __ ___ ___ | | __ _
| '_ ` _ \ / _ \| |/ _` | Modular Optimization framework for
| | | | | | (_) | | (_| | Localization and mApping (MOLA)
|_| |_| |_|\___/|_|\__,_| https://github.com/MOLAorg/mola

A repertory of multi primitive-to-primitive (MP2P) ICP algorithms
and map building tools. mp2p_icp is part of MOLA.

Copyright (C) 2018-2025 Jose Luis Blanco, University of Almeria,
and individual contributors.
SPDX-License-Identifier: BSD-3-Clause
*/

/**
* @file FilterByExpression.h
* @brief Generic filter by expressions depending on cloud fields
* @author Jose Luis Blanco Claraco
* @date Dec 26, 2025
*/

#pragma once

#include <mp2p_icp/metricmap.h>
#include <mp2p_icp_filters/FilterBase.h>
#include <mrpt/expr/CRuntimeCompiledExpression.h>
#include <mrpt/maps/CPointsMap.h>

namespace mp2p_icp_filters
{
/**
* A programmable filter that evaluates a mathematical or logical expression
* for each point to decide into which output layer it should be moved.
*
* Parameters:
* - expression: A string formula (e.g., "ring > 10", "x^2 + y^2 < 4.0")
* - output_layer_passed: (Optional) Layer for points where expression > 0
* - output_layer_not_passed: (Optional) Layer for points where expression <= 0
*
* Variables available in expressions:
* - x, y, z: Spatial coordinates
* - intensity, ring,... or any other custom field in the input clouds.
*
* \ingroup mp2p_icp_filters_grp
*/
class FilterByExpression : public mp2p_icp_filters::FilterBase
{
DEFINE_MRPT_OBJECT(FilterByExpression, mp2p_icp_filters)

public:
FilterByExpression();

void filter(mp2p_icp::metric_map_t& inOut) const override;

struct Parameters
{
void load_from_yaml(const mrpt::containers::yaml& c, FilterByExpression& parent);

std::string input_pointcloud_layer = mp2p_icp::metric_map_t::PT_LAYER_RAW;
std::string expression;
std::string output_layer_passed;
std::string output_layer_not_passed;
};
Parameters params;

protected:
// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

private:
// Re-compiles the expression if the set of fields has changed
void update_expression_bindings(const mrpt::maps::CPointsMap& pc) const;

mutable mrpt::expr::CRuntimeCompiledExpression expr_;

// This map holds the double values that ExprTk "points" to.
// Use a map so addresses remain stable after insertion.
mutable std::map<std::string, double> var_values_;

// Cached set of field names to detect schema changes
mutable std::set<std::string> cached_field_names_;
};
} // namespace mp2p_icp_filters
7 changes: 4 additions & 3 deletions mp2p_icp_filters/include/mp2p_icp_filters/FilterByIntensity.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,6 @@ class FilterByIntensity : public mp2p_icp_filters::FilterBase
public:
FilterByIntensity();

// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

// See docs in FilterBase
void filter(mp2p_icp::metric_map_t& inOut) const override;

Expand Down Expand Up @@ -65,6 +62,10 @@ class FilterByIntensity : public mp2p_icp_filters::FilterBase

/** Algorithm parameters */
Parameters params;

protected:
// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;
};

/** @} */
Expand Down
7 changes: 4 additions & 3 deletions mp2p_icp_filters/include/mp2p_icp_filters/FilterByRange.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,6 @@ class FilterByRange : public mp2p_icp_filters::FilterBase
public:
FilterByRange();

// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

// See docs in FilterBase
void filter(mp2p_icp::metric_map_t& inOut) const override;

Expand Down Expand Up @@ -88,6 +85,10 @@ class FilterByRange : public mp2p_icp_filters::FilterBase

/** Algorithm parameters */
Parameters params;

protected:
// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;
};

/** @} */
Expand Down
7 changes: 4 additions & 3 deletions mp2p_icp_filters/include/mp2p_icp_filters/FilterByRing.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,6 @@ class FilterByRing : public mp2p_icp_filters::FilterBase
public:
FilterByRing();

// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

// See docs in FilterBase
void filter(mp2p_icp::metric_map_t& inOut) const override;

Expand All @@ -62,6 +59,10 @@ class FilterByRing : public mp2p_icp_filters::FilterBase

/** Algorithm parameters */
Parameters params;

protected:
// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;
};

/** @} */
Expand Down
7 changes: 4 additions & 3 deletions mp2p_icp_filters/include/mp2p_icp_filters/FilterCurvature.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,6 @@ class FilterCurvature : public mp2p_icp_filters::FilterBase
public:
FilterCurvature();

// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

// See docs in FilterBase
void filter(mp2p_icp::metric_map_t& inOut) const override;

Expand Down Expand Up @@ -72,6 +69,10 @@ class FilterCurvature : public mp2p_icp_filters::FilterBase

/** Algorithm parameters */
Parameters params;

protected:
// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;
};

/** @} */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,6 @@ class FilterDecimateAdaptive : public mp2p_icp_filters::FilterBase
public:
FilterDecimateAdaptive();

// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

// See docs in FilterBase
void filter(mp2p_icp::metric_map_t& inOut) const override;

Expand All @@ -72,6 +69,10 @@ class FilterDecimateAdaptive : public mp2p_icp_filters::FilterBase
/** Algorithm parameters */
Parameters params;

protected:
// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

private:
/** The PointCloudToVoxelGrid filter objects.
* Hidden inside a PIMP to allow TBB parallel implementation without polluting user headers with
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,6 @@ class FilterDecimateVoxels : public mp2p_icp_filters::FilterBase
public:
FilterDecimateVoxels();

// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

// See docs in FilterBase
void filter(mp2p_icp::metric_map_t& inOut) const override;

Expand Down Expand Up @@ -129,6 +126,10 @@ class FilterDecimateVoxels : public mp2p_icp_filters::FilterBase
/** Algorithm parameters */
Parameters params;

protected:
// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

private:
mutable std::optional<PointCloudToVoxelGrid> filter_grid_;
mutable std::optional<PointCloudToVoxelGridSingle> filter_grid_single_;
Expand Down
7 changes: 4 additions & 3 deletions mp2p_icp_filters/include/mp2p_icp_filters/FilterDeleteLayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,6 @@ class FilterDeleteLayer : public mp2p_icp_filters::FilterBase
public:
FilterDeleteLayer();

// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

// See docs in FilterBase
void filter(mp2p_icp::metric_map_t& inOut) const override;

Expand All @@ -57,6 +54,10 @@ class FilterDeleteLayer : public mp2p_icp_filters::FilterBase

/** Algorithm parameters */
Parameters params;

protected:
// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;
};

/** @} */
Expand Down
2 changes: 2 additions & 0 deletions mp2p_icp_filters/include/mp2p_icp_filters/FilterDeskew.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ class FilterDeskew : public mp2p_icp_filters::FilterBase
public:
FilterDeskew();

protected:
/** Parameters:
*
* \code
Expand All @@ -94,6 +95,7 @@ class FilterDeskew : public mp2p_icp_filters::FilterBase
*/
void initialize_filter(const mrpt::containers::yaml& c) override;

public:
// See docs in FilterBase
void filter(mp2p_icp::metric_map_t& inOut) const override;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,6 @@ class FilterFartherPointSampling : public mp2p_icp_filters::FilterBase
public:
FilterFartherPointSampling();

// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

// See docs in FilterBase
void filter(mp2p_icp::metric_map_t& inOut) const override;

Expand All @@ -53,6 +50,10 @@ class FilterFartherPointSampling : public mp2p_icp_filters::FilterBase

/** Algorithm parameters */
Parameters params;

protected:
// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;
};

/** @} */
Expand Down
7 changes: 4 additions & 3 deletions mp2p_icp_filters/include/mp2p_icp_filters/FilterMLS.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,6 @@ class FilterMLS : public mp2p_icp_filters::FilterBase
public:
FilterMLS();

// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

// See docs in FilterBase
void filter(mp2p_icp::metric_map_t& inOut) const override;

Expand Down Expand Up @@ -118,6 +115,10 @@ class FilterMLS : public mp2p_icp_filters::FilterBase
/** Algorithm parameters */
Parameters params;

protected:
// See docs in base class.
void initialize_filter(const mrpt::containers::yaml& c) override;

private:
/** Hidden implementation details (e.g., Eigen types)
*
Expand Down
Loading