$search
00001 /* 00002 * Copyright (c) 2008, Willow Garage, Inc. 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * 00008 * * Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * * Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * * Neither the name of the Willow Garage, Inc. nor the names of its 00014 * contributors may be used to endorse or promote products derived from 00015 * this software without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00018 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00021 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00022 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00023 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00024 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00025 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00026 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00027 * POSSIBILITY OF SUCH DAMAGE. 00028 */ 00029 00030 #include "gtest/gtest.h" 00031 #include "filters/filter_chain.h" 00032 00033 00034 00035 TEST(MultiChannelFilterChain, configuring){ 00036 double epsilon = 1e-9; 00037 filters::MultiChannelFilterChain<double> chain("double"); 00038 00039 EXPECT_TRUE(chain.configure(5, "MultiChannelMeanFilterDouble5")); 00040 00041 double input1[] = {1,2,3,4,5}; 00042 double input1a[] = {9,9,9,9,9};//seed w/incorrect values 00043 std::vector<double> v1 (input1, input1 + sizeof(input1) / sizeof(double)); 00044 std::vector<double> v1a (input1a, input1a + sizeof(input1a) / sizeof(double)); 00045 00046 00047 EXPECT_TRUE(chain.update(v1, v1a)); 00048 00049 chain.clear(); 00050 00051 for (unsigned int i = 1; i < v1.size(); i++) 00052 { 00053 EXPECT_NEAR(input1[i], v1a[i], epsilon); 00054 } 00055 } 00056 TEST(FilterChain, configuring){ 00057 double epsilon = 1e-9; 00058 filters::FilterChain<float> chain("float"); 00059 00060 EXPECT_TRUE(chain.configure("MeanFilterFloat5")); 00061 00062 float v1 = 1; 00063 float v1a = 9; 00064 00065 EXPECT_TRUE(chain.update(v1, v1a)); 00066 00067 chain.clear(); 00068 00069 EXPECT_NEAR(v1, v1a, epsilon); 00070 00071 } 00072 00073 TEST(MultiChannelFilterChain, MisconfiguredNumberOfChannels){ 00074 filters::MultiChannelFilterChain<double> chain("double"); 00075 00076 EXPECT_TRUE(chain.configure(10, "MultiChannelMedianFilterDouble5")); 00077 00078 // EXPECT_TRUE(chain.configure(10)); 00079 00080 double input1[] = {1,2,3,4,5}; 00081 double input1a[] = {1,2,3,4,5}; 00082 std::vector<double> v1 (input1, input1 + sizeof(input1) / sizeof(double)); 00083 std::vector<double> v1a (input1a, input1a + sizeof(input1a) / sizeof(double)); 00084 00085 00086 EXPECT_FALSE(chain.update(v1, v1a)); 00087 00088 chain.clear(); 00089 00090 } 00091 00092 TEST(MultiChannelFilterChain, TwoFilters){ 00093 double epsilon = 1e-9; 00094 filters::MultiChannelFilterChain<double> chain("double"); 00095 00096 EXPECT_TRUE(chain.configure(5, "TwoFilters")); 00097 00098 double input1[] = {1,2,3,4,5}; 00099 double input1a[] = {9,9,9,9,9};//seed w/incorrect values 00100 std::vector<double> v1 (input1, input1 + sizeof(input1) / sizeof(double)); 00101 std::vector<double> v1a (input1a, input1a + sizeof(input1a) / sizeof(double)); 00102 00103 00104 EXPECT_TRUE(chain.update(v1, v1a)); 00105 00106 chain.clear(); 00107 00108 for (unsigned int i = 1; i < v1.size(); i++) 00109 { 00110 EXPECT_NEAR(input1[i], v1a[i], epsilon); 00111 } 00112 } 00113 00114 00115 TEST(MultiChannelFilterChain, TransferFunction){ 00116 double epsilon = 1e-4; 00117 00118 filters::MultiChannelFilterChain<double> chain("double"); 00119 EXPECT_TRUE(chain.configure(3, "TransferFunction" )); 00120 00121 std::vector<double> in1,in2,in3,in4,in5,in6,in7; 00122 std::vector<double> out1; 00123 00124 in1.push_back(10.0); 00125 in1.push_back(10.0); 00126 in1.push_back(10.0); 00127 // 00128 in2.push_back(70.0); 00129 in2.push_back(30.0); 00130 in2.push_back(8.0); 00131 // 00132 in3.push_back(-1.0); 00133 in3.push_back(5.0); 00134 in3.push_back(22.0); 00135 // 00136 in4.push_back(44.0); 00137 in4.push_back(23.0); 00138 in4.push_back(8.0); 00139 // 00140 in5.push_back(10.0); 00141 in5.push_back(10.0); 00142 in5.push_back(10.0); 00143 // 00144 in6.push_back(5.0); 00145 in6.push_back(-1.0); 00146 in6.push_back(5.0); 00147 // 00148 in7.push_back(6.0); 00149 in7.push_back(-30.0); 00150 in7.push_back(2.0); 00151 // 00152 out1.push_back(17.1112); 00153 out1.push_back(9.0285); 00154 out1.push_back(8.3102); 00155 EXPECT_TRUE(chain.update(in1, in1)); 00156 EXPECT_TRUE(chain.update(in2, in2)); 00157 EXPECT_TRUE(chain.update(in3, in3)); 00158 EXPECT_TRUE(chain.update(in4, in4)); 00159 EXPECT_TRUE(chain.update(in5, in5)); 00160 EXPECT_TRUE(chain.update(in6, in6)); 00161 EXPECT_TRUE(chain.update(in7, in7)); 00162 00163 chain.clear(); 00164 00165 for(unsigned int i=0; i<out1.size(); i++) 00166 { 00167 EXPECT_NEAR(out1[i], in7[i], epsilon); 00168 } 00169 } 00170 00171 /* 00172 TEST(MultiChannelFilterChain, OverlappingNames){ 00173 filters::MultiChannelFilterChain<double> chain("double"); 00174 00175 00176 std::string bad_xml = "<filters> <filter type=\"MultiChannelMeanFilterDouble\" name=\"mean_test\"> <params number_of_observations=\"5\"/></filter><filter type=\"MedianFilter\" name=\"mean_test\"> <params number_of_observations=\"5\"/></filter></filters>"; 00177 00178 TiXmlDocument chain_def = TiXmlDocument(); 00179 chain_def.Parse(bad_xml.c_str()); 00180 TiXmlElement * config = chain_def.RootElement(); 00181 00182 EXPECT_FALSE(chain.configure(5, config)); 00183 00184 } 00185 */ 00186 00187 TEST(FilterChain, ReconfiguringChain){ 00188 filters::FilterChain<int> chain("int"); 00189 00190 int v1 = 1; 00191 int v1a = 9; 00192 00193 EXPECT_TRUE(chain.configure("OneIncrements")); 00194 EXPECT_TRUE(chain.update(v1, v1a)); 00195 EXPECT_EQ(2, v1a); 00196 chain.clear(); 00197 00198 EXPECT_TRUE(chain.configure("TwoIncrements")); 00199 EXPECT_TRUE(chain.update(v1, v1a)); 00200 EXPECT_EQ(3, v1a); 00201 chain.clear(); 00202 00203 } 00204 00205 TEST(FilterChain, ThreeIncrementChains){ 00206 filters::FilterChain<int> chain("int"); 00207 int v1 = 1; 00208 int v1a = 9; 00209 00210 EXPECT_TRUE(chain.configure("ThreeIncrements")); 00211 EXPECT_TRUE(chain.update(v1, v1a)); 00212 EXPECT_EQ(4, v1a); 00213 chain.clear(); 00214 00215 } 00216 00217 TEST(FilterChain, TenIncrementChains){ 00218 filters::FilterChain<int> chain("int"); 00219 int v1 = 1; 00220 int v1a = 9; 00221 00222 EXPECT_TRUE(chain.configure("TenIncrements")); 00223 EXPECT_TRUE(chain.update(v1, v1a)); 00224 EXPECT_EQ(11, v1a); 00225 chain.clear(); 00226 00227 } 00228 /* 00229 TEST(MultiChannelFilterChain, ReconfiguringMultiChannelChain){ 00230 filters::MultiChannelFilterChain<int> chain("int"); 00231 00232 int v1 = 1; 00233 int v1a = 9; 00234 00235 EXPECT_TRUE(chain.configure("OneMultiChannelIncrements")); 00236 EXPECT_TRUE(chain.update(v1, v1a)); 00237 EXPECT_EQ(2, v1a); 00238 chain.clear(); 00239 00240 EXPECT_TRUE(chain.configure("TwoMultiChannelIncrements")); 00241 EXPECT_TRUE(chain.update(v1, v1a)); 00242 EXPECT_EQ(3, v1a); 00243 chain.clear(); 00244 00245 } 00246 00247 TEST(MultiChannelFilterChain, ThreeMultiChannelIncrementChains){ 00248 filters::MultiChannelFilterChain<int> chain("int"); 00249 int v1 = 1; 00250 int v1a = 9; 00251 00252 EXPECT_TRUE(chain.configure("ThreeMultiChannelIncrements")); 00253 EXPECT_TRUE(chain.update(v1, v1a)); 00254 EXPECT_EQ(4, v1a); 00255 chain.clear(); 00256 00257 } 00258 */ 00259 TEST(MultiChannelFilterChain, TenMultiChannelIncrementChains){ 00260 filters::MultiChannelFilterChain<int> chain("int"); 00261 std::vector<int> v1; 00262 v1.push_back(1); 00263 v1.push_back(1); 00264 v1.push_back(1); 00265 std::vector<int> v1a = v1; 00266 00267 EXPECT_TRUE(chain.configure(3, "TenMultiChannelIncrements")); 00268 EXPECT_TRUE(chain.update(v1, v1a)); 00269 for (unsigned int i = 0; i < 3; i++) 00270 { 00271 EXPECT_EQ(11, v1a[i]); 00272 } 00273 chain.clear(); 00274 00275 } 00276 00277 00278 int main(int argc, char **argv){ 00279 testing::InitGoogleTest(&argc, argv); 00280 ros::init(argc, argv, "test_chain"); 00281 return RUN_ALL_TESTS(); 00282 }