00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef _PFGENERICPARTICLEFILTER_H_
00019 #define _PFGENERICPARTICLEFILTER_H_
00020
00021 #include "PFParticleFilter.h"
00022 #include "PFGenericParticle.h"
00023
00024 namespace RobotFlow {
00025
00026
00027
00028
00029
00030
00031
00032 class PFGenericParticleFilter : public PFParticleFilter
00033 {
00034 public:
00035 PFGenericParticleFilter();
00036
00037 PFGenericParticleFilter(unsigned int i_numSamples,
00038 unsigned int i_sampleStateSize, const FD::Vector<float> *i_initVariance);
00039
00040 PFGenericParticleFilter(std::string nodeName, FD::ParameterSet params);
00041
00042 virtual ~PFGenericParticleFilter();
00043
00044
00045 void printOn(std::ostream &out) const
00046 {
00047 throw new FD::GeneralException("Exception in PFGenericParticleFilter::printOn: method not yet implemented.",__FILE__,__LINE__);
00048 }
00049
00050
00051 void readFrom(std::istream &in)
00052 {
00053 throw new FD::GeneralException("Exception in PFGenericParticleFilter::printOn: method not yet implemented.",__FILE__,__LINE__);
00054 }
00055
00056 virtual void request(int output_id, const FD::ParameterSet &req);
00057
00058 void calculate(int output_id, int count, FD::Buffer &out);
00059
00060 void Initialize(const FD::Vector<float> *i_variance);
00061
00062 void InitSamples();
00063
00064 void Update();
00065
00066 void ComputeMeanState();
00067
00068 void Resample();
00069
00070 FD::RCPtr<PFGenericParticle> GetCurSample();
00071
00072 FD::RCPtr<PFGenericParticle> GetFirstSample();
00073
00074 FD::RCPtr<PFGenericParticle> GetSampleByIdx(int i_idx);
00075
00076 FD::RCPtr<PFGenericParticle> GetMeanState();
00077
00078 void SetRefMeanSample(PFGenericParticle *i_curSample);
00079
00080 void InitLikelihoodsSum();
00081
00082 void IncLikelihoodsSum(float i_likelihood);
00083
00084 private:
00085 void CopyTmpSamples();
00086
00087 private:
00088
00089 int m_initVarianceInID;
00090 int m_refMeanStateInID;
00091 int m_predictInID;
00092 int m_likelihoodInID;
00093
00094
00095 int m_finishedOutID;
00096 int m_particleOutID;
00097 int m_meanStateOutID;
00098
00099 bool m_init;
00100 bool m_initPF;
00101 bool m_initSamples;
00102 bool m_finished;
00103
00104 int m_curSampleIdx;
00105 unsigned int m_numSamples;
00106 unsigned int m_sampleStateSize;
00107 FD::RCPtr<PFGenericParticle> *m_samples;
00108 FD::RCPtr<PFGenericParticle> *m_tmpSamples;
00109 float m_likelihoodsSum;
00110 float *m_cumulWeight;
00111 FD::Vector<float> *m_initVariance;
00112
00113 FD::RCPtr<PFGenericParticle> m_curSample;
00114 FD::RCPtr<PFGenericParticle> m_refMeanState;
00115 FD::RCPtr<PFGenericParticle> m_outMeanState;
00116 };
00117
00118 }
00119
00120 #endif