test_filter_base.cpp
Go to the documentation of this file.
00001 #include "robot_localization/filter_base.h"
00002 #include "robot_localization/filter_common.h"
00003 
00004 #include <Eigen/Dense>
00005 
00006 #include <gtest/gtest.h>
00007 #include <queue>
00008 #include <iostream>
00009 
00010 namespace RobotLocalization
00011 {
00012   class FilterDerived : public FilterBase
00013   {
00014     public:
00015 
00016       double val;
00017 
00018       FilterDerived() : val(0) { }
00019 
00020       void correct(const Measurement &measurement)
00021       {
00022         EXPECT_EQ (val, measurement.time_);
00023         EXPECT_EQ (measurement.topicName_, "topic");
00024 
00025         EXPECT_EQ (measurement.updateVector_.size(), 10);
00026         for(size_t i = 0; i < measurement.updateVector_.size(); ++i)
00027         {
00028           EXPECT_EQ (measurement.updateVector_[i], true);
00029         }
00030       }
00031 
00032       void predict(const double delta)
00033       {
00034         val = delta;
00035       }
00036   };
00037 
00038   class FilterDerived2 : public FilterBase
00039   {
00040     public:
00041 
00042       FilterDerived2() { }
00043 
00044       void correct(const Measurement &measurement)
00045       {
00046 
00047       }
00048 
00049       void predict(const double delta)
00050       {
00051 
00052       }
00053 
00054       void processMeasurement(const Measurement &measurement)
00055       {
00056         FilterBase::processMeasurement(measurement);
00057       }
00058   };
00059 }
00060 
00061 TEST (FilterBaseTest, MeasurementStruct)
00062 {
00063     RobotLocalization::Measurement meas1;
00064     RobotLocalization::Measurement meas2;
00065 
00066     EXPECT_EQ (meas1.topicName_, std::string(""));
00067     EXPECT_EQ (meas1.time_, 0);
00068     EXPECT_EQ (meas2.time_, 0);
00069 
00070     // Comparison test is true if the first
00071     // argument is > the second, so should
00072     // be false if they're equal.
00073     EXPECT_EQ (meas1(meas1, meas2), false);
00074     EXPECT_EQ (meas2(meas2, meas1), false);
00075 
00076     meas1.time_ = 100;
00077     meas2.time_ = 200;
00078 
00079     EXPECT_EQ (meas1(meas1, meas2), false);
00080     EXPECT_EQ (meas1(meas2, meas1), true);
00081     EXPECT_EQ (meas2(meas1, meas2), false);
00082     EXPECT_EQ (meas2(meas2, meas1), true);
00083 }
00084 
00085 TEST (FilterBaseTest, DerivedFilterGetSet)
00086 {
00087     using namespace RobotLocalization;
00088 
00089     FilterDerived derived;
00090 
00091     // With the ostream argument as NULL,
00092     // the debug flag will remain false.
00093     derived.setDebug(true);
00094 
00095     EXPECT_FALSE(derived.getDebug());
00096 
00097     // Now set the stream and do it again
00098     std::stringstream os;
00099     derived.setDebug(true, &os);
00100 
00101     EXPECT_TRUE(derived.getDebug());
00102 
00103     // Simple get/set checks
00104     double timeout = 7.4;
00105     derived.setSensorTimeout(timeout);
00106     EXPECT_EQ(derived.getSensorTimeout(), timeout);
00107 
00108     double lastUpdateTime = 5.1;
00109     derived.setLastUpdateTime(lastUpdateTime);
00110     EXPECT_EQ(derived.getLastUpdateTime(), lastUpdateTime);
00111 
00112     double lastMeasTime = 3.83;
00113     derived.setLastMeasurementTime(lastMeasTime);
00114     EXPECT_EQ(derived.getLastMeasurementTime(), lastMeasTime);
00115 
00116     Eigen::MatrixXd pnCovar(STATE_SIZE, STATE_SIZE);
00117     for(size_t i = 0; i < STATE_SIZE; ++i)
00118     {
00119       for(size_t j = 0; j < STATE_SIZE; ++j)
00120       {
00121         pnCovar(i, j) = static_cast<double>(i * j);
00122       }
00123     }
00124     derived.setProcessNoiseCovariance(pnCovar);
00125     EXPECT_EQ(derived.getProcessNoiseCovariance(), pnCovar);
00126 
00127     Eigen::VectorXd state(STATE_SIZE);
00128     derived.setState(state);
00129     EXPECT_EQ(derived.getState(), state);
00130 
00131     EXPECT_EQ(derived.getInitializedStatus(), false);
00132 }
00133 
00134 TEST (FilterBaseTest, MeasurementProcessing)
00135 {
00136   using namespace RobotLocalization;
00137 
00138   FilterDerived2 derived;
00139 
00140   Measurement meas;
00141 
00142   Eigen::VectorXd measurement(STATE_SIZE);
00143   for(size_t i = 0; i < STATE_SIZE; ++i)
00144   {
00145     measurement[i] = 0.1 * static_cast<double>(i);
00146   }
00147 
00148   Eigen::MatrixXd measurementCovariance(STATE_SIZE, STATE_SIZE);
00149   for(size_t i = 0; i < STATE_SIZE; ++i)
00150   {
00151     for(size_t j = 0; j < STATE_SIZE; ++j)
00152     {
00153       measurementCovariance(i, j) = 0.1 * static_cast<double>(i * j);
00154     }
00155   }
00156 
00157   meas.topicName_ = "odomTest";
00158   meas.measurement_ = measurement;
00159   meas.covariance_ = measurementCovariance;
00160   meas.updateVector_.resize(STATE_SIZE, true);
00161   meas.time_ = 1000;
00162 
00163   // The filter shouldn't be initializedyet
00164   EXPECT_FALSE(derived.getInitializedStatus());
00165 
00166   derived.processMeasurement(meas);
00167 
00168   // Now it's initialized, and the entire filter state
00169   // should be equal to the first state
00170   EXPECT_TRUE(derived.getInitializedStatus());
00171   EXPECT_EQ(derived.getState(), measurement);
00172 
00173   // Process a measurement and make sure it updates the
00174   // lastMeasurementTime variable
00175   meas.time_ = 1002;
00176   derived.processMeasurement(meas);
00177   EXPECT_EQ(derived.getLastMeasurementTime(), meas.time_);
00178 }
00179 
00180 int main(int argc, char **argv)
00181 {
00182   testing::InitGoogleTest(&argc, argv);
00183   return RUN_ALL_TESTS();
00184 }


robot_localization
Author(s): Tom Moore
autogenerated on Fri Aug 28 2015 12:26:20