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 );
217 size_t particlesCount)
219 if (particlesCount>0)
222 m_particles.resize(particlesCount);
223 for (
auto &
p: m_particles)
224 p.d.resetDefaultCtor();
227 for (
auto &
p: m_particles)
237 void CPosePDFParticles::resetUniform(
238 const double & x_min,
239 const double & x_max,
240 const double & y_min,
241 const double & y_max,
242 const double & phi_min,
243 const double & phi_max,
244 const int &particlesCount)
248 if (particlesCount>0)
251 m_particles.resize(particlesCount);
252 for (
int i = 0; i < particlesCount; i++)
253 m_particles[i].d.reset(
new CPose2D());
256 size_t i,M = m_particles.size();
262 m_particles[i].log_w=0;
268 void CPosePDFParticles::resetAroundSetOfPoses(
269 const std::vector<mrpt::math::TPose2D> & list_poses,
270 const size_t num_particles_per_pose,
271 const double spread_x,
272 const double spread_y,
273 const double spread_phi_rad)
277 ASSERT_(num_particles_per_pose>=1);
279 const size_t N = list_poses.size() * num_particles_per_pose;
282 m_particles.resize(N);
284 for (i=0,nSpot=0;nSpot<list_poses.size();nSpot++)
287 for (
size_t k=0;k<num_particles_per_pose;k++,i++)
289 m_particles[i].d.reset(
new CPose2D());
293 m_particles[i].log_w=0;
313 for (
unsigned int i=0;i<m_particles.size();i++)
315 m_particles[i].d->x(),
316 m_particles[i].d->y(),
317 m_particles[i].d->phi(),
318 m_particles[i].log_w );
326 CPose2D CPosePDFParticles::getParticlePose(
size_t i)
const 328 return *m_particles[i].d;
334 void CPosePDFParticles::changeCoordinatesReference(
const CPose3D &newReferenceBase_ )
339 it->d->composeFrom(newReferenceBase, *it->d);
345 void CPosePDFParticles::drawSingleSample(
CPose2D &outPart )
const 352 cum+= exp(it->log_w);
361 outPart = *(m_particles.rbegin())->d;
370 it->d->composeFrom(*it->d, Ap);
383 m_particles.push_back( part );
400 static CPose2D nullPose(0,0,0);
402 for (
unsigned int i=0;i<out->m_particles.size();i++)
403 (*out->m_particles[i].d) = nullPose - (*out->m_particles[i].d);
411 CPose2D CPosePDFParticles::getMostLikelyParticle()
const 414 double max_w = -1e300;
417 for (it=m_particles.begin();it!=m_particles.end();++it)
419 if (it->log_w > max_w)
432 void CPosePDFParticles::bayesianFusion(
const CPosePDF &p1,
const CPosePDF &p2,
const double &minMahalanobisDistToDrop )
442 double CPosePDFParticles::evaluatePDF_parzen(
446 const double & stdXY,
447 const double & stdPhi )
const 455 ret += exp(it->log_w) *
466 void CPosePDFParticles::saveParzenPDFToTextFile(
467 const char *fileName,
468 const double & x_min,
469 const double & x_max,
470 const double & y_min,
471 const double & y_max,
473 const double & stepSizeXY,
474 const double & stdXY,
475 const double & stdPhi )
const 480 for (
double y=y_min;
y<y_max;
y+=stepSizeXY)
482 for (
double x=x_min;
x<x_max;
x+=stepSizeXY)
485 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.
#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...
#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.
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.
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).
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.