37 m_particles.resize(M);
39 for (
auto &
p : m_particles)
46 resetDeterministic( nullPose );
49 void CPosePDFParticles::copyFrom(
const CPosePDF &o)
56 if (
this == &o)
return;
70 size_t M = m_particles.size();
71 std::vector<CVectorDouble> parts;
77 m_particles.resize(M);
79 for ( itDest = m_particles.begin(),partsIt=parts.begin();itDest!=m_particles.end();++itDest,++partsIt )
83 (pdf->
mean.
x() + (*partsIt)[0]),
84 (pdf->
mean.
y() + (*partsIt)[1]),
85 (pdf->
mean.
phi() + (*partsIt)[2]))
87 itDest->d->normalizePhi();
105 void CPosePDFParticles::getMean(
CPose2D &est_)
const 108 const size_t n = m_particles.size();
112 for (
size_t i=0;i<
n;i++)
114 const CPose2D &
p = *m_particles[i].d;
115 double w = exp(m_particles[i].log_w);
134 size_t i,
n = m_particles.size();
135 double var_x=0,var_y=0,var_p=0,var_xy=0,var_xp=0,var_yp=0;
136 double mean_phi =
mean.phi();
138 if (mean_phi<0) mean_phi =
M_2PI + mean_phi;
140 double lin_w_sum = 0;
142 for (i=0;i<
n;i++) lin_w_sum+= exp( m_particles[i].log_w );
143 if (lin_w_sum==0) lin_w_sum=1;
147 double w = exp( m_particles[i].log_w ) / lin_w_sum;
150 double err_x = m_particles[i].d->x() -
mean.x();
151 double err_y = m_particles[i].d->y() -
mean.y();
152 double err_phi =
math::wrapToPi( fabs(m_particles[i].d->phi() - mean_phi) );
157 var_xy+= err_x*err_y*
w;
158 var_xp+= err_x*err_phi*
w;
159 var_yp+= err_y*err_phi*
w;
173 cov(1,0) =
cov(0,1) = var_xy;
174 cov(2,0) =
cov(0,2) = var_xp;
175 cov(1,2) =
cov(2,1) = var_yp;
190 writeParticlesToStream( out );
203 readParticlesFromStream(
in );
214 m_particles[i].log_w = newparts.
m_particles[i].log_w;
230 size_t particlesCount)
232 if (particlesCount>0)
235 m_particles.resize(particlesCount);
236 for (
auto &
p: m_particles)
237 p.d.resetDefaultCtor();
240 for (
auto &
p: m_particles)
250 void CPosePDFParticles::resetUniform(
251 const double & x_min,
252 const double & x_max,
253 const double & y_min,
254 const double & y_max,
255 const double & phi_min,
256 const double & phi_max,
257 const int &particlesCount)
261 if (particlesCount>0)
264 m_particles.resize(particlesCount);
265 for (
int i = 0; i < particlesCount; i++)
266 m_particles[i].d.reset(
new CPose2D());
269 size_t i,M = m_particles.size();
275 m_particles[i].log_w=0;
281 void CPosePDFParticles::resetAroundSetOfPoses(
282 const std::vector<mrpt::math::TPose2D> & list_poses,
283 const size_t num_particles_per_pose,
284 const double spread_x,
285 const double spread_y,
286 const double spread_phi_rad)
290 ASSERT_(num_particles_per_pose>=1);
292 const size_t N = list_poses.size() * num_particles_per_pose;
295 m_particles.resize(N);
297 for (i=0,nSpot=0;nSpot<list_poses.size();nSpot++)
300 for (
size_t k=0;k<num_particles_per_pose;k++,i++)
302 m_particles[i].d.reset(
new CPose2D());
306 m_particles[i].log_w=0;
326 for (
unsigned int i=0;i<m_particles.size();i++)
328 m_particles[i].d->x(),
329 m_particles[i].d->y(),
330 m_particles[i].d->phi(),
331 m_particles[i].log_w );
339 CPose2D CPosePDFParticles::getParticlePose(
size_t i)
const 341 return *m_particles[i].d;
347 void CPosePDFParticles::changeCoordinatesReference(
const CPose3D &newReferenceBase_ )
352 it->d->composeFrom(newReferenceBase, *it->d);
358 void CPosePDFParticles::drawSingleSample(
CPose2D &outPart )
const 365 cum+= exp(it->log_w);
374 outPart = *(m_particles.rbegin())->d;
383 it->d->composeFrom(*it->d, Ap);
396 m_particles.push_back( part );
413 static CPose2D nullPose(0,0,0);
415 for (
unsigned int i=0;i<out->m_particles.size();i++)
416 (*out->m_particles[i].d) = nullPose - (*out->m_particles[i].d);
424 CPose2D CPosePDFParticles::getMostLikelyParticle()
const 427 double max_w = -1e300;
430 for (it=m_particles.begin();it!=m_particles.end();++it)
432 if (it->log_w > max_w)
445 void CPosePDFParticles::bayesianFusion(
const CPosePDF &p1,
const CPosePDF &p2,
const double &minMahalanobisDistToDrop )
455 double CPosePDFParticles::evaluatePDF_parzen(
459 const double & stdXY,
460 const double & stdPhi )
const 468 ret += exp(it->log_w) *
479 void CPosePDFParticles::saveParzenPDFToTextFile(
480 const char *fileName,
481 const double & x_min,
482 const double & x_max,
483 const double & y_min,
484 const double & y_max,
486 const double & stepSizeXY,
487 const double & stdXY,
488 const double & stdPhi )
const 493 for (
double y=y_min;
y<y_max;
y+=stepSizeXY)
495 for (
double x=x_min;
x<x_max;
x+=stepSizeXY)
498 evaluatePDF_parzen(
x,
y,phi,stdXY,stdPhi) );
#define ASSERT_EQUAL_(__A, __B)
Computes weighted and un-weighted averages of SE(2) poses.
A namespace of pseudo-random numbers genrators 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.
FILE BASE_IMPEXP * fopen(const char *fileName, const char *mode) MRPT_NO_THROWS
An OS-independent version of fopen.
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
CPose2D mean
The mean value.
This namespace provides a OS-independent interface to many useful functions: filenames manipulation...
int BASE_IMPEXP void BASE_IMPEXP fclose(FILE *f)
An OS-independent version of fclose.
The namespace for Bayesian filtering algorithm: different particle filters and Kalman filter algorith...
#define THROW_EXCEPTION(msg)
BASE_IMPEXP CRandomGenerator randomGenerator
A static instance of a CRandomGenerator class, for use in single-thread applications.
int BASE_IMPEXP fprintf(FILE *fil, const char *format,...) MRPT_NO_THROWS MRPT_printf_format_check(2
An OS-independent version of fprintf.
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...
const Scalar * const_iterator
void append(const mrpt::poses::CPose2D &p)
Adds a new pose to the computation.
IMPLEMENTS_SERIALIZABLE(CLogFileRecord_FullEval, CHolonomicLogFileRecord, mrpt::nav) IMPLEMENTS_SERIALIZABLE(CHolonomicFullEval
mrpt::math::CMatrixDouble33 cov
The 3x3 covariance matrix.
void clear()
Clear the contents of this container.
void drawGaussianMultivariateMany(VECTOR_OF_VECTORS &ret, size_t desiredSamples, const COVMATRIX &cov, const typename VECTOR_OF_VECTORS::value_type *mean=NULL)
Generate a given number of multidimensional random samples according to a given covariance matrix...
GLubyte GLubyte GLubyte GLubyte w
void copyFrom(const CPosePDF &o) MRPT_OVERRIDE
Copy operator, translating if necesary (for example, between m_particles and gaussian representations...
T square(const T x)
Inline function for the square of a number.
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
CParticleList m_particles
The array of particles.
This base provides a set of functions for maths stuff.
virtual const mrpt::utils::TRuntimeClassId * GetRuntimeClass() const
Returns information about the class of an object in runtime.
Declares a class that represents a Probability Density function (PDF) of a 2D pose ...
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler.
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...
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
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...
#define CLASS_ID(class_name)
Access to runtime class ID for a defined class name.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
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).
void readParticlesFromStream(STREAM &in)
Reads the sequence of particles and their weights from a stream (requires T implementing CSerializabl...
const double & phi() const
Get the phi angle of the 2D pose (in radians)
double log_w
The (logarithmic) weight value for this particle.
mrpt::utils::copy_ptr< T > d
The data associated with this particle. The use of copy_ptr<> allows relying on compiler-generated co...
double BASE_IMPEXP normalPDF(double x, double mu, double std)
Evaluates the univariate normal (Gaussian) distribution at a given point "x".
EIGEN_STRONG_INLINE double mean() const
Computes the mean of the entire matrix.
void get_average(mrpt::poses::CPose2D &out_mean) const
Returns the average pose.