The following C++ classes are the base for different PF implementations all across MRPT:
- mrpt::bayes::CParticleFilterCapable: This virtual class defines the interface that any particles based PDF class must implement in order to be executed by a CParticleFilter.
- mrpt::bayes::CParticleFilter: The class that executes iterations on a CParticleFilterCapable object.
- The container model mrpt::bayes::CParticleFilterData is used by some classes which are not really intended to be processed with a PF. It just represent a C++ template for sets of weighted samples a any given type, and common memory-keeping tasks.
Both the specific particle filter algorithm to run and the resampling scheme to use can be independently selected in the options structuremrpt::bayes::CParticleFilter::TParticleFilterOptions:
- PF algorithms – See also the description of the algorithms.
- pfStandardProposal: Standard proposal distribution + weights according to likelihood function.
- pfAuxiliaryPFStandard: An auxiliary PF using the standard proposal distribution.
- pfOptimalProposal: Use the exact optimal proposal distribution (where available!, usually this will perform approximations)
- pfAuxiliaryPFOptimal: Use the optimal proposal and a auxiliary particle filter (see paper).
- In addition, adaptiveSampleSize can select whether to use a dynamic number of samples, or not. Take into account that only a subset of all the possible combinations of algorithms may be implemented for each problem.
- Resampling algorithms – See also the description of the algorithms.
- prMultinomial (Default): Uses standard select with replacement (draws M random uniform numbers)
- prResidual: The residual or “remainder” method.
- prStratified: The stratified resampling, where a uniform sample is drawn for each of M subdivisions of the range (0,1].
- prSystematic: A single uniform sample is drawn in the range (0,1/M].
An illustrative implementation: 2D tracking
The following video shows the example samples/bayesianTracking running. Follow the link to check out the source code to get all the details of the implementation. The same code demonstrates Kalman filtering.