41 mrpt::make_aligned_shared<CSimplePointsMap>();
42 original_pc->copyFrom(*pc);
46 const size_t N = pc->
size();
47 std::vector<bool> deletion_mask;
48 deletion_mask.assign(N,
false);
52 ASSERT_(options.previous_keyframes >= 1);
53 bool can_do_filter =
true;
55 std::vector<FrameInfo*> prev_pc;
57 auto it = m_last_frames.rbegin();
59 i < options.previous_keyframes && it != m_last_frames.rend();
62 prev_pc.push_back(&it->second);
66 if (prev_pc.size() <
static_cast<size_t>(options.previous_keyframes))
68 can_do_filter =
false;
72 for (
int i = 0; can_do_filter && i < options.previous_keyframes; ++i)
75 m_last_frames.rbegin()->first, pc_timestamp) >
76 options.too_old_seconds)
78 can_do_filter =
false;
89 for (
int k = 0; k < options.previous_keyframes; ++k)
91 const CPose3D rel_pose = cur_pc_pose - prev_pc[k]->pose;
92 rel_poses.push_back(rel_pose);
99 std::vector<TPoint3D> pt_km1(options.previous_keyframes);
101 for (
size_t i = 0; i < N; i++)
109 for (
int k = 0; k < options.previous_keyframes; ++k)
110 rel_poses[k].composePoint(pt_k, pt_km1[k]);
113 std::vector<TPoint3D> neig_k;
114 std::vector<float> neig_sq_dist_k;
116 pt_k, 2 , neig_k, neig_sq_dist_k);
119 std::vector<TPoint3D> neig_kmi(options.previous_keyframes);
120 std::vector<float> neig_sq_dist_kmi(
121 options.previous_keyframes, std::numeric_limits<float>::max());
123 for (
int k = 0; k < options.previous_keyframes; ++k)
125 for (
int prev_tim_idx = 0;
126 prev_tim_idx < options.previous_keyframes; prev_tim_idx++)
128 if (prev_pc[prev_tim_idx]->pc->
size() > 0)
130 prev_pc[prev_tim_idx]->pc->kdTreeClosestPoint3D(
131 pt_km1[prev_tim_idx], neig_kmi[prev_tim_idx],
132 neig_sq_dist_kmi[prev_tim_idx]);
139 const double max_allowed_dist_sq =
square(
140 options.min_dist + options.angle_tolerance * pt_k.
norm());
142 bool ok_total =
true;
144 neig_k.size() > 1 && neig_sq_dist_k[1] < max_allowed_dist_sq;
145 ok_total = ok_total && ok_t;
147 for (
int k = 0; k < options.previous_keyframes; ++k)
149 const bool ok_tm1 = neig_sq_dist_kmi[k] < max_allowed_dist_sq;
150 ok_total = ok_total && ok_tm1;
154 const bool do_delete = !(ok_total);
155 deletion_mask[i] = do_delete;
157 if (do_delete) del_count++;
161 if ((
params ==
nullptr ||
params->do_not_delete ==
false) && N > 0 &&
162 del_count / double(N) <
163 options.max_deletion_ratio
172 if (
params !=
nullptr &&
params->out_deletion_mask !=
nullptr)
174 *
params->out_deletion_mask = deletion_mask;
182 fi.
pose = cur_pc_pose;
184 m_last_frames[pc_timestamp] = fi;
189 for (
auto it = m_last_frames.begin(); it != m_last_frames.end();)
192 options.too_old_seconds)
194 it = m_last_frames.erase(it);
208 too_old_seconds(1.0),
209 previous_keyframes(1),
210 max_deletion_ratio(.4)
229 "angle_tolerance", angle_tolerance,
"");
233 "(Default: 1) How many previous keyframes will be compared with the " 234 "latest pointcloud.");
237 "(Default: 0.4) If the ratio [0,1] of points considered invalid " 238 "(`deletion` ) is larger than this ratio, no point will be deleted " 239 "since it'd be too suspicious and may indicate a failure of this " uint64_t TTimeStamp
A system independent time type, it holds the the number of 100-nanosecond intervals since January 1...
void getPointFast(size_t index, float &x, float &y, float &z) const
Just like getPoint() but without checking out-of-bound index and without returning the point weight...
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
#define MRPT_SAVE_CONFIG_VAR_DEGREES_COMMENT( __entryName, __variable, __comment)
mrpt::poses::CPose3D pose
double norm() const
Point norm.
This class allows loading and storing values and vectors of different types from a configuration text...
T square(const T x)
Inline function for the square of a number.
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans or other sensors...
This base provides a set of functions for maths stuff.
#define MRPT_SAVE_CONFIG_VAR_COMMENT(variableName, __comment)
Lightweight 3D point (float version).
mrpt::maps::CSimplePointsMap::Ptr pc
void kdTreeNClosestPoint3D(float x0, float y0, float z0, size_t knn, std::vector< float > &out_x, std::vector< float > &out_y, std::vector< float > &out_z, std::vector< float > &out_dist_sqr) const
KD Tree-based search for the N closest points to some given 3D coordinates.
GLsizei const GLchar ** string
void saveToConfigFile(mrpt::utils::CConfigFileBase &c, const std::string §ion) const override
This method saves the options to a ".ini"-like file or memory-stored string list. ...
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
#define INVALID_TIMESTAMP
Represents an invalid timestamp, where applicable.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
T square(const T x)
Inline function for the square of a number.
std::shared_ptr< CSimplePointsMap > Ptr
void loadFromConfigFile(const mrpt::utils::CConfigFileBase &source, const std::string §ion) override
This method load the options from a ".ini"-like file or memory-stored string list.
#define MRPT_LOAD_CONFIG_VAR_DEGREES( variableName, configFileObject, sectionNameStr)
Loads a double variable, stored as radians but entered in the INI-file as degrees.
double timeDifference(const mrpt::system::TTimeStamp t_first, const mrpt::system::TTimeStamp t_later)
Returns the time difference from t1 to t2 (positive if t2 is posterior to t1), in seconds...
#define MRPT_LOAD_CONFIG_VAR( variableName, variableType, configFileObject, sectionNameStr)
An useful macro for loading variables stored in a INI-like file under a key with the same name that t...
size_t size() const
Returns the number of stored points in the map.
void filter(mrpt::maps::CPointsMap *inout_pointcloud, const mrpt::system::TTimeStamp pc_timestamp, const mrpt::poses::CPose3D &pc_reference_pose, TExtraFilterParams *params=nullptr) override
Apply the filtering algorithm to the pointcloud.
GLenum const GLfloat * params
std::vector< TYPE1, Eigen::aligned_allocator< TYPE1 > > vector_t
void applyDeletionMask(const std::vector< bool > &mask)
Remove from the map the points marked in a bool's array as "true".