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
00071
00072
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
00092
00093 derived.setDebug(true);
00094
00095 EXPECT_FALSE(derived.getDebug());
00096
00097
00098 std::stringstream os;
00099 derived.setDebug(true, &os);
00100
00101 EXPECT_TRUE(derived.getDebug());
00102
00103
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
00164 EXPECT_FALSE(derived.getInitializedStatus());
00165
00166 derived.processMeasurement(meas);
00167
00168
00169
00170 EXPECT_TRUE(derived.getInitializedStatus());
00171 EXPECT_EQ(derived.getState(), measurement);
00172
00173
00174
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 }