00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <gtest/gtest.h>
00031 #include <sys/time.h>
00032 #include "filters/mean.h"
00033
00034 using namespace filters ;
00035
00036 void seed_rand()
00037 {
00038
00039 timeval temp_time_struct;
00040 gettimeofday(&temp_time_struct,NULL);
00041 srand(temp_time_struct.tv_usec);
00042 };
00043
00044 void generate_rand_vectors(double scale, uint64_t runs, std::vector<double>& xvalues, std::vector<double>& yvalues, std::vector<double>&zvalues)
00045 {
00046 seed_rand();
00047 for ( uint64_t i = 0; i < runs ; i++ )
00048 {
00049 xvalues[i] = 1.0 * ((double) rand() - (double)RAND_MAX /2.0) /(double)RAND_MAX;
00050 yvalues[i] = 1.0 * ((double) rand() - (double)RAND_MAX /2.0) /(double)RAND_MAX;
00051 zvalues[i] = 1.0 * ((double) rand() - (double)RAND_MAX /2.0) /(double)RAND_MAX;
00052 }
00053 }
00054
00055 TEST(MultiChannelMeanFilterDouble, ConfirmIdentityNRows)
00056 {
00057 double epsilon = 1e-6;
00058 int length = 5;
00059 int rows = 5;
00060
00061 MultiChannelFilterBase<double > * filter = new MultiChannelMeanFilter<double> ();
00062 EXPECT_TRUE(filter->configure(rows, "MultiChannelMeanFilterDouble5"));
00063
00064 double input1[] = {1,2,3,4,5};
00065 double input1a[] = {1,2,3,4,5};
00066 std::vector<double> v1 (input1, input1 + sizeof(input1) / sizeof(double));
00067 std::vector<double> v1a (input1a, input1a + sizeof(input1a) / sizeof(double));
00068
00069
00070 for (int32_t i =0; i < rows*10; i++)
00071 {
00072 EXPECT_TRUE(filter->update(v1, v1a));
00073
00074 for (int i = 1; i < length; i++)
00075 {
00076 EXPECT_NEAR(v1[i], v1a[i], epsilon);
00077 }
00078 }
00079 }
00080
00081 TEST(MultiChannelMeanFilterDouble, ThreeRows)
00082 {
00083 double epsilon = 1e-6;
00084 int length = 5;
00085 int rows = 5;
00086
00087 MultiChannelFilterBase<double > * filter = new MultiChannelMeanFilter<double> ();
00088 EXPECT_TRUE(filter->configure(rows, "MultiChannelMeanFilterDouble5"));
00089
00090 double input1[] = {0,1,2,3,4};
00091 std::vector<double> v1 (input1, input1 + sizeof(input1) / sizeof(double));
00092 double input2[] = {1,2,3,4,5};
00093 std::vector<double> v2 (input2, input2 + sizeof(input2) / sizeof(double));
00094 double input3[] = {2,3,4,5,6};
00095 std::vector<double> v3 (input3, input3 + sizeof(input3) / sizeof(double));
00096 double input1a[] = {1,2,3,4,5};
00097 std::vector<double> v1a (input1a, input1a + sizeof(input1a) / sizeof(double));
00098
00099
00100 EXPECT_TRUE(filter->update(v1, v1a));
00101 EXPECT_TRUE(filter->update(v2, v1a));
00102 EXPECT_TRUE(filter->update(v3, v1a));
00103
00104 for (int i = 1; i < length; i++)
00105 {
00106 EXPECT_NEAR(v2[i], v1a[i], epsilon);
00107 }
00108
00109 }
00110
00111 TEST(MeanFilterDouble, ConfirmIdentityNRows)
00112 {
00113 double epsilon = 1e-6;
00114 int length = 5;
00115 int rows = 5;
00116
00117 FilterBase<double > * filter = new MeanFilter<double> ();
00118 EXPECT_TRUE(filter->configure("MeanFilterDouble5"));
00119
00120 double input = 1;
00121 double output = 0;
00122
00123
00124 for (int32_t i =0; i < rows*10; i++)
00125 {
00126 EXPECT_TRUE(filter->update(input, output));
00127
00128 for (int i = 1; i < length; i++)
00129 {
00130 EXPECT_NEAR(input, output, epsilon);
00131 }
00132 }
00133 }
00134
00135 TEST(MeanFilterDouble, ThreeRows)
00136 {
00137 double epsilon = 1e-6;
00138
00139 FilterBase<double > * filter = new MeanFilter<double> ();
00140 EXPECT_TRUE(filter->configure("MeanFilterDouble5"));
00141
00142 double input1 = 0;
00143 double input2 =1;
00144 double input3 = 2;
00145 double output = 3;
00146
00147
00148 EXPECT_TRUE(filter->update(input1, output));
00149 EXPECT_NEAR(input1, output, epsilon);
00150 EXPECT_TRUE(filter->update(input2, output));
00151 EXPECT_NEAR((input1+ input2)/2.0, output, epsilon);
00152 EXPECT_TRUE(filter->update(input3, output));
00153 EXPECT_NEAR((input1 + input2 + input3)/3, output, epsilon);
00154
00155
00156 }
00157
00158
00159 int main(int argc, char **argv){
00160 testing::InitGoogleTest(&argc, argv);
00161 ros::init(argc, argv, "test_mean");
00162 return RUN_ALL_TESTS();
00163 }