• R/O
  • SSH
  • HTTPS

particle-filter: 提交


Commit MetaInfo

修订版29 (tree)
时间2010-12-24 20:37:31
作者linuxchecker

Log Message

improved reversed observed function

更改概述

差异

--- test/test_filter.cc (revision 28)
+++ test/test_filter.cc (revision 29)
@@ -4,6 +4,10 @@
44 #include <filter.h>
55 using namespace std;
66
7+#define NUM_PARTICLE 100
8+#define SYS_DIST 5.0
9+#define OBS_DIST 0.01
10+
711 Particles<double> func1(Particles<double> &p, Particles<double> &v)
812 {
913 for(int i=0;i<p.size();++i)
@@ -18,9 +22,21 @@
1822 }
1923 double func2(Particles<double> &p, Particle<double> &q)
2024 {
25+ double diff = 0.0;
26+ for(int i=0;i<p.size();++i)
27+ {
28+ Particle<double> x = p[i];
29+ double d = 0.0;
30+ for(int j=0;j<x.size();++j)
31+ {
32+ d += (x[j]-q[j])*(x[j]-q[j]);
33+ }
34+ diff += sqrt(d);
35+ }
2136
2237 // cout<<"robserve function"<<endl;
23- return(p[0][0]-q[0]);
38+// return(p[0][0]-q[0]);
39+ return(diff/p.size());
2440 }
2541 double func3(Particles<double> &p, Particle<double> &q)
2642 {
@@ -30,7 +46,7 @@
3046 double func4(double w)
3147 {
3248 // cout<<"robserve density function"<<endl;
33- return(1.0/sqrt(2.0*M_PI*0.1*0.1)*exp(-w*w/(2.0*0.1*0.1)));
49+ return(1.0/sqrt(2.0*M_PI*OBS_DIST*OBS_DIST)*exp(-w*w/(2.0*OBS_DIST*OBS_DIST)));
3450 }
3551
3652 namespace test_filter
@@ -46,16 +62,23 @@
4662 {
4763 // Constructor
4864 Filter a(0.0);
49- a.setNumber(5);
65+ a.setNumber(NUM_PARTICLE);
5066 a.setDimension(3);
5167 a.createInitialParticles();
52- cut_assert_equal_string("(0.000000,0.000000,0.000000)(0.000000,0.000000,0.000000)(0.000000,0.000000,0.000000)(0.000000,0.000000,0.000000)(0.000000,0.000000,0.000000)",a.get_predict_particles().toString().c_str());
68+ for(int i=0;i<NUM_PARTICLE;++i)
69+ {
70+ for(int j=0;j<3;++j)
71+ {
72+ // initial values should be zero
73+ cut_assert_equal_double(0.0, 0.1, a.get_particles().toVector().at(i).toVector().at(j));
74+ }
75+ }
5376 // a.dump_predict_particles();
5477 }
5578 void test_manipulation(void)
5679 {
5780 Filter a(0.0);
58- a.setNumber(5);
81+ a.setNumber(NUM_PARTICLE);
5982 a.setDimension(3);
6083 a.set_state_func(&func1);
6184 a.set_robserve_func(&func2);
@@ -63,11 +86,25 @@
6386 a.set_robserve_density_func(func4);
6487
6588 a.createInitialParticles();
66- a.create_system_noise();
89+ a.create_system_noise(0.0, 1.0);
6790
6891 // initial value
69- cut_assert_equal_string("(0.000000,0.000000,0.000000)(0.000000,0.000000,0.000000)(0.000000,0.000000,0.000000)(0.000000,0.000000,0.000000)(0.000000,0.000000,0.000000)",a.get_predict_particles().toString().c_str());
70- cut_assert_not_equal_string("(0.000000,0.000000,0.000000)(0.000000,0.000000,0.000000)(0.000000,0.000000,0.000000)(0.000000,0.000000,0.000000)(0.000000,0.000000,0.000000)",a.get_system_noise().toString().c_str());
92+ for(int i=0;i<NUM_PARTICLE;++i)
93+ {
94+ for(int j=0;j<3;++j)
95+ {
96+ // initial values should be zero
97+ cut_assert_equal_double(0.0, 0.1, a.get_particles()[i][j]);
98+ }
99+ }
100+ for(int i=0;i<NUM_PARTICLE;++i)
101+ {
102+ for(int j=0;j<3;++j)
103+ {
104+ // initial values should be near zero
105+ cut_assert_equal_double(0.0, 10.0, a.get_system_noise()[i][j]);
106+ }
107+ }
71108
72109 Particles<double> noise(a.get_system_noise());
73110 Particles<double> prediction(a.get_predict_particles());
@@ -77,9 +114,11 @@
77114 // initial value+system noise
78115 cut_assert_equal_string(predict.toString().c_str(),a.get_predict_particles().toString().c_str());
79116 cout<<"predict1:"<<predict.toString()<<endl;
80- Particles<double> y(5,3);
117+ Particles<double> y(NUM_PARTICLE,3);
81118 Particle<double> x(3);
82119 x[0]=0.1; x[1]=-1.1; x[2]=1.5;
120+
121+ // no noise. tracking point should be (0.1, -1.1, 1.5)
83122 for(int i=0;i<y.size();++i)
84123 {
85124 y[i] = x;
@@ -86,9 +125,10 @@
86125 }
87126 cout<<"observed1:"<<y.toString()<<endl;
88127 a.set_observed_data(y);
89- double diff = x[0]-predict[0][0];
90- cut_assert_equal_double(diff ,1e-4,a.get_observed_noise(0));
91- cut_assert_equal_double(1.14882e-24,1e-5,a.get_robserved_density_value(diff));
128+ double diff;
129+ diff = x[0]-predict[0][0];
130+ cut_assert_equal_double(0.0, 2.0, diff);
131+ cut_assert_equal_double(1.0,1.0 ,a.get_robserved_density_value(diff));
92132 a.compute_likelihood();
93133 a.resampling();
94134 cout<<"resampled1:"<<a.get_predict_particles().toString()<<endl;
@@ -102,7 +142,7 @@
102142
103143 // step 2
104144
105- a.create_system_noise();
145+ a.create_system_noise(0.0, 1.0);
106146 a.get_next_state();
107147 cout<<"predict2:"<<a.get_predict_particles().toString()<<endl;
108148 for(int j=0;j<a.get_predict_particles().size();++j)
@@ -119,9 +159,10 @@
119159 }
120160 cout<<"observed2:"<<y.toString()<<endl;
121161 a.set_observed_data(y);
122- cut_assert_equal_double(-0.36319,1.0,a.get_observed_noise(0));
162+ cut_assert_equal_double(x[0],10.0,a.get_observed_noise(0));
123163 a.set_robserve_density_func(func4);
124- cut_assert_equal_double(1.14882e-24,1e-5,a.get_robserved_density_value(-1.06308));
164+ diff = x[0]-predict[0][0];
165+ cut_assert_equal_double(1.0,1.0,a.get_robserved_density_value(diff));
125166 a.compute_likelihood();
126167 a.resampling();
127168 cout<<"resampled2:"<<a.get_predict_particles().toString()<<endl;
--- src/filter.cc (revision 28)
+++ src/filter.cc (revision 29)
@@ -49,13 +49,13 @@
4949 v.resize(number, dimension);
5050 return(true);
5151 }
52-bool Filter::create_system_noise()
52+bool Filter::create_system_noise(double mean, double dist)
5353 {
5454 for(int i=0;i<v.size();++i)
5555 {
5656 for(int j=0;j<v[i].size();++j)
5757 {
58- v[i][j] = mtrand.randNorm(0.0, 1.2); // ToDO: functionize
58+ v[i][j] = mtrand.randNorm(mean, dist); // ToDO: functionize
5959 }
6060 }
6161 return(true);
--- src/filter.h (revision 28)
+++ src/filter.h (revision 29)
@@ -28,7 +28,7 @@
2828 bool setNumber(int n);
2929 bool setDimension(int d);
3030 bool createInitialParticles();
31- bool create_system_noise();
31+ bool create_system_noise(double mean, double dist);
3232 bool createInitialParticles(double d);
3333 int dump_predict_particles();
3434 Particles<double> get_particles();
Show on old repository browser