10 #ifndef PF_implementations_H 11 #define PF_implementations_H 50 template <
class PARTICLE_TYPE,
class MY
SELF>
51 template <
class BINTYPE>
56 MYSELF *me =
static_cast<MYSELF*
>(
this);
64 if (m_accumRobotMovement3DIsValid)
THROW_EXCEPTION(
"Mixing 2D and 3D actions is not allowed.")
66 if (!m_accumRobotMovement2DIsValid)
68 robotMovement2D->
poseChange->
getMean( m_accumRobotMovement2D.rawOdometryIncrementReading );
71 else m_accumRobotMovement2D.rawOdometryIncrementReading += robotMovement2D->
poseChange->
getMeanVal();
73 m_accumRobotMovement2DIsValid =
true;
80 if (m_accumRobotMovement2DIsValid)
THROW_EXCEPTION(
"Mixing 2D and 3D actions is not allowed.")
82 if (!m_accumRobotMovement3DIsValid)
83 m_accumRobotMovement3D = robotMovement3D->
poseChange;
84 else m_accumRobotMovement3D += robotMovement3D->
poseChange;
87 m_accumRobotMovement3DIsValid =
true;
95 const bool SFhasValidObservations = (sf==NULL) ?
false : PF_SLAM_implementation_doWeHaveValidObservations(me->m_particles,sf);
98 if (! ((m_accumRobotMovement2DIsValid || m_accumRobotMovement3DIsValid) && SFhasValidObservations))
103 if (m_accumRobotMovement3DIsValid)
105 m_movementDrawer.setPosePDF( m_accumRobotMovement3D );
106 m_accumRobotMovement3DIsValid =
false;
112 m_accumRobotMovement2D.rawOdometryIncrementReading,
113 m_accumRobotMovement2D.motionModelConfiguration );
115 m_movementDrawer.setPosePDF( theResultingRobotMov.
poseChange );
116 m_accumRobotMovement2DIsValid =
false;
134 template <
class PARTICLE_TYPE,
class MY
SELF>
135 template <
class BINTYPE>
143 PF_SLAM_implementation_pfAuxiliaryPFStandardAndOptimal<BINTYPE>(actions,sf,PF_options,KLD_options,
true );
152 template <
class PARTICLE_TYPE,
class MY
SELF>
153 template <
class BINTYPE>
161 typedef std::set<BINTYPE,typename BINTYPE::lt_operator> TSetStateSpaceBins;
163 MYSELF *me =
static_cast<MYSELF*
>(
this);
180 m_movementDrawer.setPosePDF( robotMovement2D->
poseChange );
188 m_movementDrawer.setPosePDF( robotMovement3D->
poseChange );
191 else {
THROW_EXCEPTION(
"Action list does not contain any CActionRobotMovement2D or CActionRobotMovement3D object!"); }
198 const size_t M = me->m_particles.size();
203 for (
size_t i=0;i<M;i++)
206 m_movementDrawer.drawSample( incrPose );
210 PF_SLAM_implementation_custom_update_particle_with_new_pose( me->m_particles[i].d,
TPose3D(finalPose) );
221 TSetStateSpaceBins stateSpaceBins;
224 const double delta_1 = 1.0 - KLD_options.
KLD_delta;
225 const double epsilon_1 = 0.5 / KLD_options.
KLD_epsilon;
228 me->prepareFastDrawSample(PF_options);
231 std::vector<TPose3D> newParticles;
233 std::vector<size_t> newParticlesDerivedFromIdx;
241 m_movementDrawer.drawSample( increment_i );
244 const size_t drawn_idx = me->fastDrawSample(PF_options);
245 const CPose3D newPose =
CPose3D(*getLastPose(drawn_idx)) + increment_i;
246 const TPose3D newPose_s = newPose;
249 newParticles.push_back( newPose_s );
250 newParticlesWeight.push_back(0);
251 newParticlesDerivedFromIdx.push_back(drawn_idx);
256 KLF_loadBinFromParticle<PARTICLE_TYPE,BINTYPE>(p,KLD_options, me->m_particles[drawn_idx].d, &newPose_s);
258 if (stateSpaceBins.find( p )==stateSpaceBins.end())
262 stateSpaceBins.insert( p );
265 size_t K = stateSpaceBins.size();
273 N = newParticles.size();
282 this->PF_SLAM_implementation_replaceByNewParticleSet(
284 newParticles,newParticlesWeight,newParticlesDerivedFromIdx );
291 const size_t M = me->m_particles.size();
295 for (
size_t i=0;i<M;i++)
297 const TPose3D *partPose= getLastPose(i);
299 const double obs_log_likelihood = PF_SLAM_computeObservationLikelihoodForParticle(PF_options,i,*sf,partPose2);
300 me->m_particles[i].log_w += obs_log_likelihood * PF_options.
powFactor;
319 template <
class PARTICLE_TYPE,
class MY
SELF>
320 template <
class BINTYPE>
328 PF_SLAM_implementation_pfAuxiliaryPFStandardAndOptimal<BINTYPE>(actions,sf,PF_options,KLD_options,
false );
334 template <
class PARTICLE_TYPE,
class MY
SELF>
335 template <
class BINTYPE>
341 const void *observation )
346 const MYSELF *me =
static_cast<const MYSELF*
>(obj);
352 double indivLik, maxLik= -1e300;
357 const CPose3D oldPose = *me->getLastPose(index);
360 for (
size_t q=0;q<N;q++)
362 me->m_movementDrawer.drawSample(drawnSample);
363 CPose3D x_predict = oldPose + drawnSample;
366 indivLik = me->PF_SLAM_computeObservationLikelihoodForParticle(
369 *static_cast<const CSensoryFrame*>(observation),
373 vectLiks[q] = indivLik;
374 if ( indivLik > maxLik )
376 maxLikDraw = drawnSample;
387 me->m_pfAuxiliaryPFOptimal_estimatedProb[index] = avrgLogLik;
388 me->m_pfAuxiliaryPFOptimal_maxLikelihood[index] = maxLik;
391 me->m_pfAuxiliaryPFOptimal_maxLikDrawnMovement[index] = maxLikDraw;
395 return me->m_particles[index].log_w + me->m_pfAuxiliaryPFOptimal_estimatedProb[index];
407 template <
class PARTICLE_TYPE,
class MY
SELF>
408 template <
class BINTYPE>
414 const void *observation )
419 const MYSELF *myObj =
static_cast<const MYSELF*
>(obj);
422 const double cur_logweight = myObj->m_particles[index].log_w;
423 const CPose3D oldPose = *myObj->getLastPose(index);
430 x_predict.
composeFrom( oldPose, *static_cast<const CPose3D*>(action) );
434 myObj->m_pfAuxiliaryPFStandard_estimatedProb[index] = myObj->PF_SLAM_computeObservationLikelihoodForParticle(
436 *static_cast<const CSensoryFrame*>(observation), x_predict );
439 return cur_logweight + myObj->m_pfAuxiliaryPFStandard_estimatedProb[index];
448 double indivLik, maxLik= -1e300;
455 for (
size_t q=0;q<N;q++)
457 myObj->m_movementDrawer.drawSample(drawnSample);
458 CPose3D x_predict = oldPose + drawnSample;
461 indivLik = myObj->PF_SLAM_computeObservationLikelihoodForParticle(
464 *static_cast<const CSensoryFrame*>(observation),
468 vectLiks[q] = indivLik;
469 if ( indivLik > maxLik )
471 maxLikDraw = drawnSample;
482 myObj->m_pfAuxiliaryPFStandard_estimatedProb[index] = avrgLogLik;
484 myObj->m_pfAuxiliaryPFOptimal_maxLikelihood[index] = maxLik;
486 myObj->m_pfAuxiliaryPFOptimal_maxLikDrawnMovement[index] = maxLikDraw;
490 return cur_logweight + myObj->m_pfAuxiliaryPFOptimal_estimatedProb[index];
498 template <
class PARTICLE_TYPE,
class MY
SELF>
499 template <
class BINTYPE>
505 const bool USE_OPTIMAL_SAMPLING )
508 typedef std::set<BINTYPE,typename BINTYPE::lt_operator> TSetStateSpaceBins;
510 MYSELF *me =
static_cast<MYSELF*
>(
this);
512 const size_t M = me->m_particles.size();
520 if (!PF_SLAM_implementation_gatherActionsCheckBothActObs<BINTYPE>(actions,sf))
534 m_pfAuxiliaryPFOptimal_maxLikDrawnMovement.resize(M);
536 m_pfAuxiliaryPFOptimal_estimatedProb.resize(M);
538 m_pfAuxiliaryPFStandard_estimatedProb.resize(M);
542 m_movementDrawer.getSamplingMean3D(meanRobotMovement);
549 me->prepareFastDrawSample(
551 USE_OPTIMAL_SAMPLING ? funcOpt : funcStd,
557 if (USE_OPTIMAL_SAMPLING && PF_options.
verbose)
559 printf(
"[prepareFastDrawSample] max (log) = %10.06f\n",
math::maximum(m_pfAuxiliaryPFOptimal_estimatedProb) );
560 printf(
"[prepareFastDrawSample] max-mean (log) = %10.06f\n", -
math::mean(m_pfAuxiliaryPFOptimal_estimatedProb) +
math::maximum(m_pfAuxiliaryPFOptimal_estimatedProb) );
561 printf(
"[prepareFastDrawSample] max-min (log) = %10.06f\n", -
math::minimum(m_pfAuxiliaryPFOptimal_estimatedProb) +
math::maximum(m_pfAuxiliaryPFOptimal_estimatedProb) );
577 vector<TPose3D> newParticles;
578 vector<double> newParticlesWeight;
579 vector<size_t> newParticlesDerivedFromIdx;
587 m_pfAuxiliaryPFOptimal_maxLikMovementDrawHasBeenUsed.assign(M,
false);
590 USE_OPTIMAL_SAMPLING ?
591 m_pfAuxiliaryPFOptimal_estimatedProb :
592 m_pfAuxiliaryPFStandard_estimatedProb );
599 newParticles.resize(M);
600 newParticlesWeight.resize(M);
601 newParticlesDerivedFromIdx.resize(M);
603 const bool doResample = me->ESS() < PF_options.
BETA;
605 for (
size_t i=0;i<M;i++)
613 k = me->fastDrawSample(PF_options);
619 double newParticleLogWeight;
620 PF_SLAM_aux_perform_one_rejection_sampling_step<BINTYPE>(
621 USE_OPTIMAL_SAMPLING,doResample,maxMeanLik,
624 newPose, newParticleLogWeight);
627 newParticles[i] = newPose;
628 newParticlesDerivedFromIdx[i] = k;
629 newParticlesWeight[i] = newParticleLogWeight;
642 newParticles.clear();
643 newParticlesWeight.clear();
644 newParticlesDerivedFromIdx.clear();
653 TSetStateSpaceBins stateSpaceBinsLastTimestep;
654 std::vector<vector_uint> stateSpaceBinsLastTimestepParticles;
656 unsigned int partIndex;
658 printf(
"[FIXED_SAMPLING] Computing...");
659 for (partIt = me->m_particles.begin(),partIndex=0; partIt!=me->m_particles.end(); ++partIt,++partIndex)
663 KLF_loadBinFromParticle<PARTICLE_TYPE,BINTYPE>(p, KLD_options,partIt->d );
667 if ( posFound == stateSpaceBinsLastTimestep.end() )
669 stateSpaceBinsLastTimestep.insert( p );
670 stateSpaceBinsLastTimestepParticles.push_back(
vector_uint(1,partIndex) );
674 const size_t idx =
std::distance(stateSpaceBinsLastTimestep.begin(),posFound);
675 stateSpaceBinsLastTimestepParticles[idx].push_back( partIndex );
678 printf(
"done (%u bins in t-1)\n",(
unsigned int)stateSpaceBinsLastTimestep.size());
683 double delta_1 = 1.0 - KLD_options.
KLD_delta;
685 bool doResample = me->ESS() < 0.5;
690 size_t Nx = minNumSamples_KLD ;
692 const size_t Np1 = me->m_particles.size();
694 for (
size_t k=0;k<Np1;k++) oldPartIdxsStillNotPropragated[k]=k;
696 const size_t Np = stateSpaceBinsLastTimestepParticles.size();
698 for (
size_t k=0;k<Np;k++) permutationPathsAuxVector[k]=k;
703 permutationPathsAuxVector.begin(),
704 permutationPathsAuxVector.end(),
710 TSetStateSpaceBins stateSpaceBins;
723 k = me->fastDrawSample(PF_options);
729 if (permutationPathsAuxVector.size())
731 const size_t idxBinSpacePath = *permutationPathsAuxVector.rbegin();
732 permutationPathsAuxVector.resize(permutationPathsAuxVector.size()-1);
735 k = stateSpaceBinsLastTimestepParticles[idxBinSpacePath][idx];
736 ASSERT_(k<me->m_particles.size());
739 oldPartIdxsStillNotPropragated.erase(std::find(oldPartIdxsStillNotPropragated.begin(),oldPartIdxsStillNotPropragated.end(),k));
750 if (oldPartIdxsStillNotPropragated.size())
755 oldPartIdxsStillNotPropragated.erase(it);
768 double newParticleLogWeight;
769 PF_SLAM_aux_perform_one_rejection_sampling_step<BINTYPE>(
770 USE_OPTIMAL_SAMPLING,doResample,maxMeanLik,
773 newPose, newParticleLogWeight);
776 newParticles.push_back( newPose );
777 newParticlesDerivedFromIdx.push_back( k );
778 newParticlesWeight.push_back(newParticleLogWeight);
785 const TPose3D newPose_s = newPose;
786 KLF_loadBinFromParticle<PARTICLE_TYPE,BINTYPE>( p,KLD_options, me->m_particles[k].d, &newPose_s );
794 if ( stateSpaceBins.find(p)==stateSpaceBins.end() )
797 stateSpaceBins.insert( p );
800 int K = stateSpaceBins.
size();
809 N = newParticles.size();
812 N < max(Nx,minNumSamples_KLD)) ||
813 (permutationPathsAuxVector.size() && !doResample) );
815 printf(
"\n[ADAPTIVE SAMPLE SIZE] #Bins: %u \t #Particles: %u \t Nx=%u\n", static_cast<unsigned>(stateSpaceBins.size()),static_cast<unsigned>(N), (unsigned)Nx);
824 this->PF_SLAM_implementation_replaceByNewParticleSet(
826 newParticles,newParticlesWeight,newParticlesDerivedFromIdx );
830 me->normalizeWeights();
839 template <
class PARTICLE_TYPE,
class MY
SELF>
840 template <
class BINTYPE>
842 const bool USE_OPTIMAL_SAMPLING,
843 const bool doResample,
844 const double maxMeanLik,
849 double & out_newParticleLogWeight)
851 MYSELF *me =
static_cast<MYSELF*
>(
this);
855 while ( ( (USE_OPTIMAL_SAMPLING ? m_pfAuxiliaryPFOptimal_estimatedProb[k] : m_pfAuxiliaryPFStandard_estimatedProb[k] )
860 if (PF_options.
verbose) cout <<
"[PF_implementation] Warning: Discarding very unlikely particle" << endl;
863 const CPose3D oldPose = *getLastPose(k);
869 if ( PF_SLAM_implementation_skipRobotMovement() )
873 out_newPose = oldPose;
879 if (!USE_OPTIMAL_SAMPLING)
881 m_movementDrawer.drawSample( movementDraw );
884 poseLogLik = PF_SLAM_computeObservationLikelihoodForParticle(PF_options, k,*sf,out_newPose);
889 double acceptanceProb;
891 const int maxTries=10000;
892 double bestTryByNow_loglik= -std::numeric_limits<double>::max();
899 m_pfAuxiliaryPFOptimal_maxLikMovementDrawHasBeenUsed[k] =
true;
900 movementDraw =
CPose3D( m_pfAuxiliaryPFOptimal_maxLikDrawnMovement[k] );
905 m_movementDrawer.drawSample( movementDraw );
911 poseLogLik = PF_SLAM_computeObservationLikelihoodForParticle(PF_options, k,*sf,out_newPose);
913 if (poseLogLik>bestTryByNow_loglik)
915 bestTryByNow_loglik = poseLogLik;
916 bestTryByNow_pose = out_newPose;
919 double ratioLikLik = std::exp( poseLogLik - m_pfAuxiliaryPFOptimal_maxLikelihood[k] );
920 acceptanceProb = std::min( 1.0, ratioLikLik );
922 if ( ratioLikLik > 1)
924 m_pfAuxiliaryPFOptimal_maxLikelihood[k] = poseLogLik;
929 if (timeout>=maxTries)
931 out_newPose = bestTryByNow_pose;
932 poseLogLik = bestTryByNow_loglik;
933 if (PF_options.
verbose) cout <<
"[PF_implementation] Warning: timeout in rejection sampling." << endl;
939 if (USE_OPTIMAL_SAMPLING)
942 out_newParticleLogWeight = 0;
945 const double weightFact = m_pfAuxiliaryPFOptimal_estimatedProb[k] * PF_options.
powFactor;
946 out_newParticleLogWeight = me->m_particles[k].log_w + weightFact;
951 const double weightFact = (poseLogLik-m_pfAuxiliaryPFStandard_estimatedProb[k]) * PF_options.
powFactor;
953 out_newParticleLogWeight = weightFact;
954 else out_newParticleLogWeight = weightFact + me->m_particles[k].log_w;
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.
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
BASE_IMPEXP CRandomGenerator randomGenerator
A static instance of a CRandomGenerator class, for use in single-thread applications.
#define INVALID_LIKELIHOOD_VALUE
int round(const T value)
Returns the closer integer (int) to x.
unsigned int pfAuxFilterOptimal_MaximumSearchSamples
In the algorithm "CParticleFilter::pfAuxiliaryPFOptimal" (and in "CParticleFilter::pfAuxiliaryPFStand...
#define MRPT_CHECK_NORMAL_NUMBER(val)
The namespace for Bayesian filtering algorithm: different particle filters and Kalman filter algorith...
#define THROW_EXCEPTION(msg)
TDATA getMeanVal() const
Returns the mean, or mathematical expectation of the probability density distribution (PDF)...
void getMean(CPose3D &mean_pose) const
Returns an estimate of the pose, (the mean, or mathematical expectation of the PDF).
Option set for KLD algorithm.
static double PF_SLAM_particlesEvaluator_AuxPFOptimal(const CParticleFilter::TParticleFilterOptions &PF_options, const CParticleFilterCapable *obj, size_t index, const void *action, const void *observation)
Declares a class for storing a collection of robot actions.
A set of common data shared by PF implementations for both SLAM and localization. ...
CONTAINER::Scalar minimum(const CONTAINER &v)
CActionRobotMovement2DPtr getBestMovementEstimation() const
Returns the best pose increment estimator in the collection, based on the determinant of its pose cha...
unsigned int KLD_minSampleSize
Parameters for the KLD adaptive sample size algorithm (see Dieter Fox's papers), which is used only i...
This base provides a set of functions for maths stuff.
void PF_SLAM_implementation_pfAuxiliaryPFStandardAndOptimal(const CActionCollection *actions, const CSensoryFrame *sf, const CParticleFilter::TParticleFilterOptions &PF_options, const TKLDParams &KLD_options, const bool USE_OPTIMAL_SAMPLING)
The shared implementation body of two PF methods: APF and Optimal-APF, depending on USE_OPTIMAL_SAMPL...
uint32_t drawUniform32bit()
Generate a uniformly distributed pseudo-random number using the MT19937 algorithm, in the whole range of 32-bit integers.
std::vector< size_t > vector_size_t
double KLD_minSamplesPerBin
(Default: KLD_minSamplesPerBin=0) The minimum number of samples will be the maximum of KLD_minSampleS...
void PF_SLAM_implementation_pfAuxiliaryPFOptimal(const CActionCollection *actions, const CSensoryFrame *sf, const CParticleFilter::TParticleFilterOptions &PF_options, const TKLDParams &KLD_options)
A generic implementation of the PF method "prediction_and_update_pfAuxiliaryPFOptimal" (optimal sampl...
struct OBS_IMPEXP mrpt::slam::CActionRobotMovement2D::TMotionModelOptions motionModelConfiguration
This virtual class defines the interface that any particles based PDF class must implement in order t...
void PF_SLAM_aux_perform_one_rejection_sampling_step(const bool USE_OPTIMAL_SAMPLING, const bool doResample, const double maxMeanLik, size_t k, const CSensoryFrame *sf, const CParticleFilter::TParticleFilterOptions &PF_options, CPose3D &out_newPose, double &out_newParticleLogWeight)
void PF_SLAM_implementation_pfStandardProposal(const CActionCollection *actions, const CSensoryFrame *sf, const CParticleFilter::TParticleFilterOptions &PF_options, const TKLDParams &KLD_options)
A generic implementation of the PF method "pfStandardProposal" (standard proposal distribution...
bool pfAuxFilterStandard_FirstStageWeightsMonteCarlo
Only for PF_algorithm==pfAuxiliaryPFStandard: If false, the APF will predict the first stage weights ...
virtual void getMean(TDATA &mean_point) const =0
Returns the mean, or mathematical expectation of the probability density distribution (PDF)...
CONTAINER::Scalar maximum(const CONTAINER &v)
double BETA
The resampling of particles will be performed when ESS (in range [0,1]) < BETA (default is 0...
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
ptrdiff_t random_generator_for_STL(ptrdiff_t i)
A random number generator for usage in STL algorithms expecting a function like this (eg...
double(* TParticleProbabilityEvaluator)(const bayes::CParticleFilter::TParticleFilterOptions &PF_options, const CParticleFilterCapable *obj, size_t index, const void *action, const void *observation)
A callback function type for evaluating the probability of m_particles of being selected, used in "fastDrawSample".
unsigned int KLD_maxSampleSize
CPosePDFPtr poseChange
The 2D pose change probabilistic estimation.
Represents a probabilistic 3D (6D) movement.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
Represents a probabilistic 2D movement of the robot mobile base.
double BASE_IMPEXP chi2inv(double P, unsigned int dim=1)
The "quantile" of the Chi-Square distribution, for dimension "dim" and probability 0<P<1 (the inverse...
bool verbose
Enable extra messages for each PF iteration (Default=false)
double max_loglikelihood_dyn_range
Only for PF_algorithm=pfAuxiliaryPFOptimal: If a given particle has a max_likelihood (from the a-prio...
Declares a class for storing a "sensory frame", a set of "observations" taken by the robot approximat...
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
void computeFromOdometry(const CPose2D &odometryIncrement, const TMotionModelOptions &options)
Computes the PDF of the pose increment from an odometry reading and according to the given motion mod...
double powFactor
An optional step to "smooth" dramatic changes in the observation model to affect the variance of the ...
The configuration of a particle filter.
void composeFrom(const CPose3D &A, const CPose3D &B)
Makes "this = A (+) B"; this method is slightly more efficient than "this= A + B;" since it avoids th...
Lightweight 3D pose (three spatial coordinates, plus three angular coordinates).
T::SmartPtr getActionByClass(const size_t &ith=0) const
Access to the i'th action of a given class, or a NULL smart pointer if there is no action of that cla...
double mean(const CONTAINER &v)
Computes the mean value of a vector.
bool pfAuxFilterOptimal_MLE
(Default=false) In the algorithm "CParticleFilter::pfAuxiliaryPFOptimal", if set to true...
static double PF_SLAM_particlesEvaluator_AuxPFStandard(const CParticleFilter::TParticleFilterOptions &PF_options, const CParticleFilterCapable *obj, size_t index, const void *action, const void *observation)
Compute w[i]·p(z_t | mu_t^i), with mu_t^i being the mean of the new robot pose.
std::vector< uint32_t > vector_uint
poses::CPose3DPDFGaussian poseChange
The 3D pose change probabilistic estimation.
bool PF_SLAM_implementation_gatherActionsCheckBothActObs(const CActionCollection *actions, const CSensoryFrame *sf)
Auxiliary method called by PF implementations: return true if we have both action & observation...
double BASE_IMPEXP averageLogLikelihood(const vector_double &logLikelihoods)
A numerically-stable method to compute average likelihood values with strongly different ranges (unwe...
void PF_SLAM_implementation_pfAuxiliaryPFStandard(const CActionCollection *actions, const CSensoryFrame *sf, const CParticleFilter::TParticleFilterOptions &PF_options, const TKLDParams &KLD_options)
A generic implementation of the PF method "prediction_and_update_pfAuxiliaryPFStandard" (Auxiliary pa...
bool adaptiveSampleSize
A flag that indicates whether the CParticleFilterCapable object should perform adative sample size (d...
double BASE_IMPEXP distance(const TPoint2D &p1, const TPoint2D &p2)
Gets the distance between two points in a 2D space.