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
00081
00082
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
00100
00101 derived.setDebug(true);
00102
00103 EXPECT_FALSE(derived.getDebug());
00104
00105
00106 std::stringstream os;
00107 derived.setDebug(true, &os);
00108
00109 EXPECT_TRUE(derived.getDebug());
00110
00111
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
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
00178
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
00219 EXPECT_FALSE(derived.getInitializedStatus());
00220
00221 derived.processMeasurement(meas);
00222
00223
00224
00225 EXPECT_TRUE(derived.getInitializedStatus());
00226 EXPECT_EQ(derived.getState(), measurement);
00227
00228
00229
00230 meas.time_ = 1002;
00231 derived.processMeasurement(meas);
00232 EXPECT_EQ(derived.getLastMeasurementTime(), meas.time_);
00233
00234
00235 RobotLocalization::FilterDerived2 derived2;
00236
00237 std::vector<int> updateVector(12, 1);
00238
00239
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
00256 EXPECT_TRUE(derived.getInitializedStatus());
00257 EXPECT_EQ(derived2.getLastUpdateTime(), 1001);
00258 EXPECT_EQ(derived2.getLastMeasurementTime(), 1000);
00259
00260
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
00273
00274
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
00281
00282
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 }