33 m_particles.resize(M);
34 for (
auto&
p : m_particles)
40 resetDeterministic(nullPose);
43 void CPosePDFParticles::copyFrom(
const CPosePDF& o)
50 if (
this == &o)
return;
64 size_t M = m_particles.size();
65 std::vector<CVectorDouble> parts;
71 m_particles.resize(M);
73 for (itDest = m_particles.begin(), partsIt = parts.begin();
74 itDest != m_particles.end(); ++itDest, ++partsIt)
78 pdf->
mean.
x() + (*partsIt)[0], (pdf->
mean.
y() + (*partsIt)[1]),
79 (pdf->
mean.
phi() + (*partsIt)[2]));
80 itDest->d.normalizePhi();
89 void CPosePDFParticles::getMean(
CPose2D& est_)
const 92 const size_t n = m_particles.size();
96 for (
size_t i = 0; i <
n; i++)
98 double w = exp(m_particles[i].log_w);
99 se_averager.
append(m_particles[i].d,
w);
109 void CPosePDFParticles::getCovarianceAndMean(
115 size_t i,
n = m_particles.size();
116 double var_x = 0, var_y = 0, var_p = 0, var_xy = 0, var_xp = 0, var_yp = 0;
117 double mean_phi =
mean.phi();
119 if (mean_phi < 0) mean_phi =
M_2PI + mean_phi;
121 double lin_w_sum = 0;
123 for (i = 0; i <
n; i++) lin_w_sum += exp(m_particles[i].log_w);
124 if (lin_w_sum == 0) lin_w_sum = 1;
126 for (i = 0; i <
n; i++)
128 double w = exp(m_particles[i].log_w) / lin_w_sum;
131 double err_x = m_particles[i].d.x -
mean.x();
132 double err_y = m_particles[i].d.y -
mean.y();
133 double err_phi =
math::wrapToPi(fabs(m_particles[i].d.phi - mean_phi));
138 var_xy += err_x * err_y *
w;
139 var_xp += err_x * err_phi *
w;
140 var_yp += err_y * err_phi *
w;
154 cov(1, 0) =
cov(0, 1) = var_xy;
155 cov(2, 0) =
cov(0, 2) = var_xp;
156 cov(1, 2) =
cov(2, 1) = var_yp;
160 uint8_t CPosePDFParticles::serializeGetVersion()
const {
return 1; }
163 writeParticlesToStream(out);
165 void CPosePDFParticles::serializeFrom(
177 std::back_inserter(m_particles),
185 readParticlesFromStream(
in);
193 void CPosePDFParticles::resetDeterministic(
196 if (particlesCount > 0) m_particles.resize(particlesCount);
198 for (
auto&
p : m_particles)
205 void CPosePDFParticles::resetUniform(
206 const double x_min,
const double x_max,
const double y_min,
207 const double y_max,
const double phi_min,
const double phi_max,
208 const int particlesCount)
211 if (particlesCount > 0) m_particles.resize(particlesCount);
213 for (
auto&
p : m_particles)
223 void CPosePDFParticles::resetAroundSetOfPoses(
224 const std::vector<mrpt::math::TPose2D>& list_poses,
225 const size_t num_particles_per_pose,
const double spread_x,
226 const double spread_y,
const double spread_phi_rad)
230 ASSERT_(num_particles_per_pose >= 1);
232 const size_t N = list_poses.size() * num_particles_per_pose;
235 m_particles.resize(N);
237 for (i = 0, nSpot = 0; nSpot < list_poses.size(); nSpot++)
240 for (
size_t k = 0; k < num_particles_per_pose; k++, i++)
243 p.x - spread_x * 0.5,
p.x + spread_x * 0.5);
245 p.y - spread_y * 0.5,
p.y + spread_y * 0.5);
247 p.phi - spread_phi_rad * 0.5,
p.phi + spread_phi_rad * 0.5);
248 m_particles[i].log_w = 0;
260 for (
const auto&
p : m_particles)
263 std::ofstream f(file);
264 if (!f.is_open())
return false;
269 TPose2D CPosePDFParticles::getParticlePose(
size_t i)
const 271 return m_particles[i].d;
274 void CPosePDFParticles::changeCoordinatesReference(
275 const CPose3D& newReferenceBase_)
278 for (
auto&
p : m_particles)
p.d = newReferenceBase +
p.d;
281 void CPosePDFParticles::drawSingleSample(
CPose2D& outPart)
const 286 for (
auto&
p : m_particles)
297 outPart =
CPose2D(m_particles.rbegin()->d);
302 for (
auto&
p : m_particles)
p.d =
p.d + Ap;
320 for (
auto&
p : out->m_particles)
p.d = nullPose -
p.d;
328 double max_w = -std::numeric_limits<double>::max();
329 for (
const auto&
p : m_particles)
340 void CPosePDFParticles::bayesianFusion(
342 const double minMahalanobisDistToDrop)
351 double CPosePDFParticles::evaluatePDF_parzen(
352 const double x,
const double y,
const double phi,
const double stdXY,
353 const double stdPhi)
const 356 for (
const auto&
p : m_particles)
359 ret += exp(
p.log_w) *
367 void CPosePDFParticles::saveParzenPDFToTextFile(
368 const char* fileName,
const double x_min,
const double x_max,
369 const double y_min,
const double y_max,
const double phi,
370 const double stepSizeXY,
const double stdXY,
const double stdPhi)
const 374 for (
double y = y_min;
y < y_max;
y += stepSizeXY)
375 for (
double x = x_min;
x < x_max;
x += stepSizeXY)
377 "%f ", evaluatePDF_parzen(
x,
y, phi, stdXY, stdPhi));
380 std::ofstream f(fileName);
381 if (!f.is_open())
return;
Computes weighted and un-weighted averages of SE(2) poses.
A namespace of pseudo-random numbers generators of diferent distributions.
double drawUniform(const double Min, const double Max)
Generate a uniformly distributed pseudo-random number using the MT19937 algorithm, scaled to the selected range.
double x() const
Common members of all points & poses classes.
CPose2D mean
The mean value.
#define THROW_EXCEPTION(msg)
CParticleList m_particles
The array of particles.
#define IMPLEMENTS_SERIALIZABLE(class_name, base, NameSpace)
This must be inserted in all CSerializable classes implementation files.
The namespace for Bayesian filtering algorithm: different particle filters and Kalman filter algorith...
void saveToTextFile(const std::string &file, mrpt::math::TMatrixTextFileFormat fileFormat=mrpt::math::MATRIX_FORMAT_ENG, bool appendMRPTHeader=false, const std::string &userHeader=std::string()) const
Save matrix to a text file, compatible with MATLAB text format (see also the methods of matrix classe...
void append(const mrpt::poses::CPose2D &p)
Adds a new pose to the computation.
mrpt::math::CMatrixDouble33 cov
The 3x3 covariance matrix.
GLubyte GLubyte GLubyte GLubyte w
mrpt::math::TPose2D asTPose() const
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
T square(const T x)
Inline function for the square of a number.
#define ASSERT_(f)
Defines an assertion mechanism.
This base provides a set of functions for maths stuff.
#define CLASS_ID(T)
Access to runtime class ID for a defined class name.
Declares a class that represents a Probability Density function (PDF) of a 2D pose ...
void readParticlesFromStream(STREAM &in)
Reads the sequence of particles and their weights from a stream (requires T implementing CSerializabl...
#define ASSERT_EQUAL_(__A, __B)
Assert comparing two values, reporting their actual values upon failure.
void copyFrom(const CPosePDF &o) override
Copy operator, translating if necesary (for example, between m_particles and gaussian representations...
virtual const mrpt::rtti::TRuntimeClassId * GetRuntimeClass() const override
Returns information about the class of an object in runtime.
void drawGaussianMultivariateMany(VECTOR_OF_VECTORS &ret, size_t desiredSamples, const COVMATRIX &cov, const typename VECTOR_OF_VECTORS::value_type *mean=nullptr)
Generate a given number of multidimensional random samples according to a given covariance matrix...
std::vector< T1 > & operator+=(std::vector< T1 > &a, const std::vector< T2 > &b)
a+=b (element-wise sum)
Eigen::Matrix< dataType, 4, 4 > inverse(Eigen::Matrix< dataType, 4, 4 > &pose)
Declares a class that represents a Probability Density Function (PDF) over a 2D pose (x...
GLsizei const GLchar ** string
T wrapToPi(T a)
Modifies the given angle to translate it into the ]-pi,pi] range.
This template class declares the array of particles and its internal data, managing some memory-relat...
Declares a class that represents a probability density function (pdf) of a 2D pose (x...
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
Virtual base class for "archives": classes abstracting I/O streams.
A template class for holding a the data and the weight of a particle.
A class used to store a 2D pose, including the 2D coordinate point and a heading (phi) angle...
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
const double & phi() const
Get the phi angle of the 2D pose (in radians)
Eigen::Matrix< typename MATRIX::Scalar, MATRIX::ColsAtCompileTime, MATRIX::ColsAtCompileTime > cov(const MATRIX &v)
Computes the covariance matrix from a list of samples in an NxM matrix, where each row is a sample...
GLuint GLenum GLenum transform
CRandomGenerator & getRandomGenerator()
A static instance of a CRandomGenerator class, for use in single-thread applications.
double normalPDF(double x, double mu, double std)
Evaluates the univariate normal (Gaussian) distribution at a given point "x".
void clear()
Clear the contents of this container.
const Scalar * const_iterator
EIGEN_STRONG_INLINE double mean() const
Computes the mean of the entire matrix.
#define MRPT_UNUSED_PARAM(a)
Determines whether this is an X86 or AMD64 platform.
void get_average(mrpt::poses::CPose2D &out_mean) const
Returns the average pose.