test_filter_base.cpp
Go to the documentation of this file.
00001 #include "robot_localization/filter_base.h"
00002 
00003 #include <Eigen/Dense>
00004 
00005 #include <gtest/gtest.h>
00006 #include <queue>
00007 #include <iostream>
00008 
00009 namespace RobotLocalization
00010 {
00011   class FilterDerived : public FilterBase
00012   {
00013     public:
00014 
00015       double val;
00016 
00017       FilterDerived() : val(0) { }
00018 
00019       void correct(const Measurement &measurement)
00020       {
00021         EXPECT_EQ (val, measurement.time_);
00022         EXPECT_EQ (measurement.topicName_, "topic");
00023 
00024         EXPECT_EQ (measurement.updateVector_.size(), 10);
00025         for(size_t i = 0; i < measurement.updateVector_.size(); ++i)
00026         {
00027           EXPECT_EQ (measurement.updateVector_[i], true);
00028         }
00029       }
00030 
00031       void predict(const double delta)
00032       {
00033         val = delta;
00034       }
00035 
00036       std::priority_queue<Measurement, std::vector<Measurement>, Measurement> getMeasurementQueue()
00037       {
00038         return measurementQueue_;
00039       }
00040   };
00041 
00042   class FilterDerived2 : public FilterBase
00043   {
00044     public:
00045 
00046       FilterDerived2() { }
00047 
00048       void correct(const Measurement &measurement)
00049       {
00050 
00051       }
00052 
00053       void predict(const double delta)
00054       {
00055 
00056       }
00057 
00058       void processMeasurement(const Measurement &measurement)
00059       {
00060         FilterBase::processMeasurement(measurement);
00061       }
00062 
00063       void integrateMeasurements(double currentTime,
00064                                  std::map<std::string, Eigen::VectorXd> &postUpdateStates)
00065       {
00066         FilterBase::integrateMeasurements(currentTime, postUpdateStates);
00067       }
00068   };
00069 }
00070 
00071 TEST (FilterBaseTest, MeasurementStruct)
00072 {
00073     RobotLocalization::Measurement meas1;
00074     RobotLocalization::Measurement meas2;
00075 
00076     EXPECT_EQ (meas1.topicName_, std::string(""));
00077     EXPECT_EQ (meas1.time_, 0);
00078     EXPECT_EQ (meas2.time_, 0);
00079 
00080     // Comparison test is true if the first
00081     // argument is > the second, so should
00082     // be false if they're equal.
00083     EXPECT_EQ (meas1(meas1, meas2), false);
00084     EXPECT_EQ (meas2(meas2, meas1), false);
00085 
00086     meas1.time_ = 100;
00087     meas2.time_ = 200;
00088 
00089     EXPECT_EQ (meas1(meas1, meas2), false);
00090     EXPECT_EQ (meas1(meas2, meas1), true);
00091     EXPECT_EQ (meas2(meas1, meas2), false);
00092     EXPECT_EQ (meas2(meas2, meas1), true);
00093 }
00094 
00095 TEST (FilterBaseTest, DerivedFilterGetSet)
00096 {
00097     RobotLocalization::FilterDerived derived;
00098 
00099     // With the ostream argument as NULL,
00100     // the debug flag will remain false.
00101     derived.setDebug(true);
00102 
00103     EXPECT_FALSE(derived.getDebug());
00104 
00105     // Now set the stream and do it again
00106     std::stringstream os;
00107     derived.setDebug(true, &os);
00108 
00109     EXPECT_TRUE(derived.getDebug());
00110 
00111     // Simple get/set checks
00112     double timeout = 7.4;
00113     derived.setSensorTimeout(timeout);
00114     EXPECT_EQ(derived.getSensorTimeout(), timeout);
00115 
00116     double lastUpdateTime = 5.1;
00117     derived.setLastUpdateTime(lastUpdateTime);
00118     EXPECT_EQ(derived.getLastUpdateTime(), lastUpdateTime);
00119 
00120     double lastMeasTime = 3.83;
00121     derived.setLastMeasurementTime(lastMeasTime);
00122     EXPECT_EQ(derived.getLastMeasurementTime(), lastMeasTime);
00123 
00124     Eigen::MatrixXd pnCovar(12, 12);
00125     for(size_t i = 0; i < 12; ++i)
00126     {
00127       for(size_t j = 0; j < 12; ++j)
00128       {
00129         pnCovar(i, j) = static_cast<double>(i * j);
00130       }
00131     }
00132     derived.setProcessNoiseCovariance(pnCovar);
00133     EXPECT_EQ(derived.getProcessNoiseCovariance(), pnCovar);
00134 
00135     Eigen::VectorXd state(12);
00136     derived.setState(state);
00137     EXPECT_EQ(derived.getState(), state);
00138 
00139     EXPECT_EQ(derived.getInitializedStatus(), false);
00140 }
00141 
00142 TEST (FilterBaseTest, DerivedFilterEnqueue)
00143 {
00144     RobotLocalization::FilterDerived derived;
00145 
00146     Eigen::VectorXd measurement(12);
00147     for(size_t i = 0; i < 12; ++i)
00148     {
00149       measurement[i] = static_cast<double>(i);
00150     }
00151 
00152     Eigen::MatrixXd measurementCovariance(12, 12);
00153     for(size_t i = 0; i < 12; ++i)
00154     {
00155       for(size_t j = 0; j < 12; ++j)
00156       {
00157         measurementCovariance(i, j) = static_cast<double>(i * j);
00158       }
00159     }
00160 
00161     std::vector<int> updateVector(12, true);
00162     updateVector[5] = false;
00163 
00164     // Ensure that measurements are being placed in the queue correctly
00165     derived.enqueueMeasurement("odom0",
00166                                 measurement,
00167                                 measurementCovariance,
00168                                 updateVector,
00169                                 1000);
00170 
00171     std::priority_queue<RobotLocalization::Measurement, std::vector<RobotLocalization::Measurement>, RobotLocalization::Measurement> measQueue = derived.getMeasurementQueue();
00172     RobotLocalization::Measurement meas = measQueue.top();
00173     EXPECT_EQ(meas.measurement_, measurement);
00174     EXPECT_EQ(meas.covariance_, measurementCovariance);
00175     EXPECT_EQ(meas.updateVector_, updateVector);
00176 
00177     // Enqueue a second measurement with an earlier time. Verify that it's at the
00178     // top of the queue.
00179     measurement(0) = -5;
00180     derived.enqueueMeasurement("odom0",
00181                                 measurement,
00182                                 measurementCovariance,
00183                                 updateVector,
00184                                 999);
00185 
00186     measQueue = derived.getMeasurementQueue();
00187     meas = measQueue.top();
00188     EXPECT_EQ(meas.measurement_(0), measurement(0));
00189 }
00190 
00191 TEST (FilterBaseTest, MeasurementProcessing)
00192 {
00193   RobotLocalization::FilterDerived2 derived;
00194 
00195   RobotLocalization::Measurement meas;
00196 
00197   Eigen::VectorXd measurement(12);
00198   for(size_t i = 0; i < 12; ++i)
00199   {
00200     measurement[i] = 0.1 * static_cast<double>(i);
00201   }
00202 
00203   Eigen::MatrixXd measurementCovariance(12, 12);
00204   for(size_t i = 0; i < 12; ++i)
00205   {
00206     for(size_t j = 0; j < 12; ++j)
00207     {
00208       measurementCovariance(i, j) = 0.1 * static_cast<double>(i * j);
00209     }
00210   }
00211 
00212   meas.topicName_ = "odomTest";
00213   meas.measurement_ = measurement;
00214   meas.covariance_ = measurementCovariance;
00215   meas.updateVector_.resize(12, true);
00216   meas.time_ = 1000;
00217 
00218   // The filter shouldn't be initializedyet
00219   EXPECT_FALSE(derived.getInitializedStatus());
00220 
00221   derived.processMeasurement(meas);
00222 
00223   // Now it's initialized, and the entire filter state
00224   // should be equal to the first state
00225   EXPECT_TRUE(derived.getInitializedStatus());
00226   EXPECT_EQ(derived.getState(), measurement);
00227 
00228   // Process a measurement and make sure it updates the
00229   // lastMeasurementTime variable
00230   meas.time_ = 1002;
00231   derived.processMeasurement(meas);
00232   EXPECT_EQ(derived.getLastMeasurementTime(), meas.time_);
00233 
00234   // Initialize a new one
00235   RobotLocalization::FilterDerived2 derived2;
00236 
00237   std::vector<int> updateVector(12, 1);
00238 
00239   // Enqueue two measurements and integrate them
00240   derived2.enqueueMeasurement("odom0",
00241                               measurement,
00242                               measurementCovariance,
00243                               updateVector,
00244                               999);
00245 
00246   derived2.enqueueMeasurement("odom0",
00247                               measurement,
00248                               measurementCovariance,
00249                               updateVector,
00250                               1000);
00251 
00252   std::map<std::string, Eigen::VectorXd> postUpdateStates;
00253   derived2.integrateMeasurements(1001, postUpdateStates);
00254 
00255   // Make sure the update times were set correctly
00256   EXPECT_TRUE(derived.getInitializedStatus());
00257   EXPECT_EQ(derived2.getLastUpdateTime(), 1001);
00258   EXPECT_EQ(derived2.getLastMeasurementTime(), 1000);
00259 
00260   // Now enqueue a third and integrate again
00261   derived2.enqueueMeasurement("odom0",
00262                               measurement,
00263                               measurementCovariance,
00264                               updateVector,
00265                               1002);
00266 
00267   derived2.integrateMeasurements(1003, postUpdateStates);
00268 
00269   EXPECT_EQ(derived2.getLastMeasurementTime(), 1002);
00270   EXPECT_EQ(derived2.getLastUpdateTime(), 1003);
00271 
00272   // Set the sensor timeout, and then integrate without
00273   // enqueueing. This will cause a predict/update cycle
00274   // and update the last update and measurement times.
00275   derived2.setSensorTimeout(0.5);
00276   derived2.integrateMeasurements(1003.52, postUpdateStates);
00277   EXPECT_EQ(derived2.getLastUpdateTime(), 1003.50);
00278   EXPECT_EQ(derived2.getLastMeasurementTime(), 1002.50);
00279 
00280   // Enqueue a measurement that's in the past and make sure
00281   // it doesn't change the last measurement time, but does
00282   // change the last update time.
00283   derived2.enqueueMeasurement("odom0",
00284                               measurement,
00285                               measurementCovariance,
00286                               updateVector,
00287                               1000);
00288 
00289   derived2.integrateMeasurements(1004, postUpdateStates);
00290   EXPECT_EQ(derived2.getLastMeasurementTime(), 1002.50);
00291   EXPECT_EQ(derived2.getLastUpdateTime(), 1004);
00292 }
00293 
00294 int main(int argc, char **argv)
00295 {
00296   testing::InitGoogleTest(&argc, argv);
00297   return RUN_ALL_TESTS();
00298 }


robot_localization
Author(s): Tom Moore
autogenerated on Mon Oct 6 2014 04:11:15