9 #ifndef PF_implementations_data_H
10 #define PF_implementations_data_H
25 template <
class PARTICLETYPE,
class BINTYPE>
28 const PARTICLETYPE* currentParticleValue =
nullptr,
36 class PARTICLE_TYPE,
class MYSELF,
67 mutable std::vector<mrpt::math::TPose3D>
77 template <
class BINTYPE>
82 const void* action,
const void* observation);
84 template <
class BINTYPE>
89 const void* action,
const void* observation);
115 template <
class BINTYPE>
137 template <
class BINTYPE>
151 template <
class BINTYPE>
168 const size_t i,
bool& is_valid_pose)
const = 0;
171 PARTICLE_TYPE* particleData,
185 PARTICLE_TYPE, STORAGE>::CParticleList& old_particles,
186 const std::vector<mrpt::math::TPose3D>& newParticles,
187 const std::vector<double>& newParticlesWeight,
188 const std::vector<size_t>& newParticlesDerivedFromIdx)
const
196 const size_t N = newParticles.size();
197 std::remove_reference_t<decltype(old_particles)> newParticlesArray(N);
202 const auto N_old = old_particles.size();
203 std::vector<bool> oldParticleAlreadyCopied(N_old,
false);
204 std::vector<PARTICLE_TYPE*> oldParticleFirstCopies(N_old,
nullptr);
206 auto newPartIt = newParticlesArray.begin();
207 for (
size_t i = 0; newPartIt != newParticlesArray.end();
211 newPartIt->log_w = newParticlesWeight[i];
214 PARTICLE_TYPE* newPartData;
215 const size_t i_in_old = newParticlesDerivedFromIdx[i];
216 if (!oldParticleAlreadyCopied[i_in_old])
219 newPartData = old_particles[i_in_old].d.release();
220 oldParticleAlreadyCopied[i_in_old] =
true;
221 oldParticleFirstCopies[i_in_old] = newPartData;
226 ASSERT_(oldParticleFirstCopies[i_in_old]);
228 new PARTICLE_TYPE(*oldParticleFirstCopies[i_in_old]);
231 newPartIt->d.reset(newPartData);
238 newPartIt = newParticlesArray.begin();
239 for (
size_t i = 0; i < N;
242 newPartIt->d.get(), newParticles[i]);
248 auto newPartIt = newParticlesArray.begin();
249 for (
size_t i = 0; newPartIt != newParticlesArray.end();
252 newPartIt->log_w = newParticlesWeight[i];
253 const size_t i_in_old = newParticlesDerivedFromIdx[i];
254 newPartIt->d = old_particles[i_in_old].d;
258 newPartIt = newParticlesArray.begin();
259 for (
size_t i = 0; i < N; ++newPartIt, ++i)
261 &newPartIt->d, newParticles[i]);
264 old_particles = std::move(newParticlesArray);
269 PARTICLE_TYPE,STORAGE>::CParticleList& particles,
287 const size_t particleIndexForMap,
302 template <
class BINTYPE>
311 template <
class BINTYPE>
316 const TKLDParams& KLD_options,
const bool USE_OPTIMAL_SAMPLING);
318 template <
class BINTYPE>
320 const bool USE_OPTIMAL_SAMPLING,
const bool doResample,
321 const double maxMeanLik,
This virtual class defines the interface that any particles based PDF class must implement in order t...
This template class declares the array of particles and its internal data, managing some memory-relat...
Column vector, like Eigen::MatrixX*, but automatically initialized to zeros since construction.
Declares a class for storing a collection of robot actions.
Represents a probabilistic 2D movement of the robot mobile base.
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).
Declares a class that represents a Probability Density function (PDF) of a 3D pose .
An efficient generator of random samples drawn from a given 2D (CPosePDF) or 3D (CPose3DPDF) pose pro...
A set of common data shared by PF implementations for both SLAM and localization.
mrpt::math::CVectorDouble m_pfAuxiliaryPFStandard_estimatedProb
Auxiliary variable used in the "pfAuxiliaryPFStandard" algorithm.
std::vector< mrpt::math::TPose3D > m_pfAuxiliaryPFOptimal_maxLikDrawnMovement
Auxiliary variable used in the "pfAuxiliaryPFOptimal" algorithm.
mrpt::poses::CPose3DPDFGaussian m_accumRobotMovement3D
static double PF_SLAM_particlesEvaluator_AuxPFOptimal(const mrpt::bayes::CParticleFilter::TParticleFilterOptions &PF_options, const mrpt::bayes::CParticleFilterCapable *obj, size_t index, const void *action, const void *observation)
virtual bool PF_SLAM_implementation_doWeHaveValidObservations(const typename mrpt::bayes::CParticleFilterData< PARTICLE_TYPE, STORAGE >::CParticleList &particles, const mrpt::obs::CSensoryFrame *sf) const
bool m_accumRobotMovement2DIsValid
std::vector< bool > m_pfAuxiliaryPFOptimal_maxLikMovementDrawHasBeenUsed
mrpt::obs::CActionRobotMovement2D m_accumRobotMovement2D
void PF_SLAM_implementation_pfStandardProposal(const mrpt::obs::CActionCollection *actions, const mrpt::obs::CSensoryFrame *sf, const mrpt::bayes::CParticleFilter::TParticleFilterOptions &PF_options, const TKLDParams &KLD_options)
A generic implementation of the PF method "pfStandardProposal" (standard proposal distribution,...
mrpt::math::CVectorDouble m_pfAuxiliaryPFOptimal_estimatedProb
Auxiliary variable used in the "pfAuxiliaryPFOptimal" algorithm.
static double PF_SLAM_particlesEvaluator_AuxPFStandard(const mrpt::bayes::CParticleFilter::TParticleFilterOptions &PF_options, const mrpt::bayes::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.
bool m_accumRobotMovement3DIsValid
mrpt::poses::CPoseRandomSampler m_movementDrawer
Used in al PF implementations.
virtual bool PF_SLAM_implementation_skipRobotMovement() const
Make a specialization if needed, eg.
virtual void PF_SLAM_implementation_custom_update_particle_with_new_pose(PARTICLE_TYPE *particleData, const mrpt::math::TPose3D &newPose) const =0
void PF_SLAM_implementation_pfAuxiliaryPFStandardAndOptimal(const mrpt::obs::CActionCollection *actions, const mrpt::obs::CSensoryFrame *sf, const mrpt::bayes::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...
virtual void PF_SLAM_implementation_replaceByNewParticleSet(typename mrpt::bayes::CParticleFilterData< PARTICLE_TYPE, STORAGE >::CParticleList &old_particles, const std::vector< mrpt::math::TPose3D > &newParticles, const std::vector< double > &newParticlesWeight, const std::vector< size_t > &newParticlesDerivedFromIdx) const
This is the default algorithm to efficiently replace one old set of samples by another new set.
void PF_SLAM_implementation_pfAuxiliaryPFOptimal(const mrpt::obs::CActionCollection *actions, const mrpt::obs::CSensoryFrame *sf, const mrpt::bayes::CParticleFilter::TParticleFilterOptions &PF_options, const TKLDParams &KLD_options)
A generic implementation of the PF method "prediction_and_update_pfAuxiliaryPFOptimal" (optimal sampl...
void PF_SLAM_aux_perform_one_rejection_sampling_step(const bool USE_OPTIMAL_SAMPLING, const bool doResample, const double maxMeanLik, size_t k, const mrpt::obs::CSensoryFrame *sf, const mrpt::bayes::CParticleFilter::TParticleFilterOptions &PF_options, mrpt::poses::CPose3D &out_newPose, double &out_newParticleLogWeight)
void PF_SLAM_implementation_pfAuxiliaryPFStandard(const mrpt::obs::CActionCollection *actions, const mrpt::obs::CSensoryFrame *sf, const mrpt::bayes::CParticleFilter::TParticleFilterOptions &PF_options, const TKLDParams &KLD_options)
A generic implementation of the PF method "prediction_and_update_pfAuxiliaryPFStandard" (Auxiliary pa...
virtual mrpt::math::TPose3D getLastPose(const size_t i, bool &is_valid_pose) const =0
Return the last robot pose in the i'th particle; is_valid_pose will be false if there is no such last...
virtual double PF_SLAM_computeObservationLikelihoodForParticle(const mrpt::bayes::CParticleFilter::TParticleFilterOptions &PF_options, const size_t particleIndexForMap, const mrpt::obs::CSensoryFrame &observation, const mrpt::poses::CPose3D &x) const =0
Evaluate the observation likelihood for one particle at a given location.
mrpt::math::CVectorDouble m_pfAuxiliaryPFOptimal_maxLikelihood
Auxiliary variable used in the "pfAuxiliaryPFOptimal" algorithm.
Option set for KLD algorithm.
Versatile class for consistent logging and management of output messages.
COutputLogger()
Default class constructor.
#define MRPT_UNUSED_PARAM(a)
Determines whether this is an X86 or AMD64 platform.
#define ASSERT_(f)
Defines an assertion mechanism.
GLsizei GLsizei GLuint * obj
particle_storage_mode
use for CProbabilityParticle
bool PF_SLAM_implementation_gatherActionsCheckBothActObs(const mrpt::obs::CActionCollection *actions, const mrpt::obs::CSensoryFrame *sf)
Auxiliary method called by PF implementations: return true if we have both action & observation,...
void KLF_loadBinFromParticle(BINTYPE &outBin, const TKLDParams &opts, const PARTICLETYPE *currentParticleValue=nullptr, const mrpt::math::TPose3D *newPoseToBeInserted=nullptr)
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
The configuration of a particle filter.
Lightweight 3D pose (three spatial coordinates, plus three angular coordinates).