diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 1bab9866320dfeb0e85a501e7b3db0118ba62d3f..27f02386aaa0f0a9489573f33b7b34a457882546 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -64,6 +64,10 @@ target_link_libraries(gtest_frame_base ${PROJECT_NAME}) wolf_add_gtest(gtest_imu_tools gtest_imu_tools.cpp) # target_link_libraries(gtest_imu_tools ${PROJECT_NAME}) // WOLF library not needed +# IMU tools test +wolf_add_gtest(gtest_KF_pack_buffer gtest_KF_pack_buffer.cpp) +target_link_libraries(gtest_KF_pack_buffer ${PROJECT_NAME}) + # LocalParametrizationXxx classes test wolf_add_gtest(gtest_local_param gtest_local_param.cpp) target_link_libraries(gtest_local_param ${PROJECT_NAME}) diff --git a/src/test/gtest_KF_pack_buffer.cpp b/src/test/gtest_KF_pack_buffer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..810ab58e0497cef5f2381942b0696562a641bbd6 --- /dev/null +++ b/src/test/gtest_KF_pack_buffer.cpp @@ -0,0 +1,182 @@ +/* + * gtest_KF_pack_buffer.cpp + * + * Created on: Mar 5, 2018 + * Author: jsola + */ +//Wolf +#include "utils_gtest.h" + +#include "processor_odom_2D.h" +#include "sensor_odom_2D.h" + +#include "processor_tracker_feature_dummy.h" +#include "capture_void.h" + +#include "problem.h" + +// STL +#include <iterator> +#include <iostream> + +using namespace wolf; +using namespace Eigen; + +class KFPackBufferTest : public testing::Test +{ + public: + + KFPackBuffer kfpackbuffer; + FrameBasePtr f10, f20, f21, f28; + Scalar tt10, tt20, tt21, tt28; + TimeStamp timestamp; + Scalar timetolerance; + + void SetUp(void) + { + f10 = std::make_shared<FrameBase>(TimeStamp(10),nullptr,nullptr,nullptr); + f20 = std::make_shared<FrameBase>(TimeStamp(20),nullptr,nullptr,nullptr); + f21 = std::make_shared<FrameBase>(TimeStamp(21),nullptr,nullptr,nullptr); + f28 = std::make_shared<FrameBase>(TimeStamp(28),nullptr,nullptr,nullptr); + + tt10 = 1.0; + tt20 = 1.0; + tt21 = 1.0; + tt28 = 1.0; + }; +}; + +TEST_F(KFPackBufferTest, empty) +{ + ASSERT_TRUE(kfpackbuffer.empty()); +} + +TEST_F(KFPackBufferTest, add) +{ + kfpackbuffer.add(f10, tt10); + ASSERT_EQ(kfpackbuffer.size(),1); + kfpackbuffer.add(f20, tt20); + ASSERT_EQ(kfpackbuffer.size(),2); +} + +TEST_F(KFPackBufferTest, clear) +{ + kfpackbuffer.add(f10, tt10); + kfpackbuffer.add(f20, tt20); + ASSERT_EQ(kfpackbuffer.size(),2); + kfpackbuffer.clear(); + ASSERT_TRUE(kfpackbuffer.empty()); +} + +//TEST_F(KFPackBufferTest, print) +//{ +// kfpackbuffer.clear(); +// kfpackbuffer.add(f10, tt10); +// kfpackbuffer.add(f20, tt20); +// kfpackbuffer.print(); +//} + +TEST_F(KFPackBufferTest, checkTimeTolerance) +{ + kfpackbuffer.clear(); + kfpackbuffer.add(f10, tt10); + kfpackbuffer.add(f20, tt20); + // min time tolerance > diff between time stamps. It should return true + ASSERT_TRUE(kfpackbuffer.checkTimeTolerance(10, 20, 20, 20)); + // min time tolerance < diff between time stamps. It should return true + ASSERT_FALSE(kfpackbuffer.checkTimeTolerance(10, 1, 20, 20)); +} + +TEST_F(KFPackBufferTest, selectPack) +{ + // Evaluation using two packs (p1,p2) + // with different time tolerances (tp1,tp2) + // using a query pack (q) with also different time tolerances + // depending on these tolerances we will get one (p1) or the other (p2) + // packages from the buffer (res). + // This can be summarized in the table hereafter: + // + // p1 p2 q | resulting pack time stamp + // -------------------------------- + // 2 2 2 | nullptr + // 2 2 5 | nullptr + // 2 2 7 | nullptr + // 2 7 2 | nullptr + // 2 7 5 | 20 + // 2 7 7 | 20 + // 7 2 2 | nullptr + // 7 2 5 | nullptr + // 7 2 7 | 10 + // 7 7 2 | nullptr + // 7 7 5 | 20 + // 7 7 7 | 20 + + kfpackbuffer.clear(); + + // input packages + std::vector<int> p1 = {2, 7}; // Pack 1 time tolerances + std::vector<int> p2 = {2, 7}; // Pack 2 time tolerances + std::vector<int> q = {2, 5, 7}; // Query pack time tolerances + + // Solution matrix + Eigen::VectorXi res = Eigen::VectorXi::Zero(12); + res(4) = 20; + res(5) = 20; + res(8) = 10; + res(10) = 20; + res(11) = 20; + + // test + for (auto ip1=0;ip1<p1.size();++ip1) + { + for (auto ip2=0;ip2<p2.size();++ip2) + { + kfpackbuffer.add(f10, p1[ip1]); + kfpackbuffer.add(f20, p2[ip2]); + for (auto iq=0;iq<q.size();++iq) + { + KFPackPtr packQ = kfpackbuffer.selectPack(16, q[iq]); + if (packQ!=nullptr) + ASSERT_EQ(packQ->key_frame->getTimeStamp(),res(ip1*6+ip2*3+iq)); + } + kfpackbuffer.clear(); + } + } +} + +TEST_F(KFPackBufferTest, removeUpTo) +{ + // Small time tolerance for all test asserts + Scalar tt = 0.1; + kfpackbuffer.clear(); + kfpackbuffer.add(f10, tt10); + kfpackbuffer.add(f20, tt20); + kfpackbuffer.add(f21, tt21); + + // it should remove f20 and f10, thus size should be 1 after removal + // Specifically, only f21 should remain + KFPackPtr pack20 = std::make_shared<KFPack>(f20,tt20); + kfpackbuffer.removeUpTo( pack20->key_frame->getTimeStamp() ); + ASSERT_EQ(kfpackbuffer.size(),1); + ASSERT_TRUE(kfpackbuffer.selectPack(f10->getTimeStamp(),tt)==nullptr); + ASSERT_TRUE(kfpackbuffer.selectPack(f20->getTimeStamp(),tt)==nullptr); + ASSERT_TRUE(kfpackbuffer.selectPack(f21->getTimeStamp(),tt)!=nullptr); + + // Chech removal of an imprecise time stamp + // Specifically, only f28 should remain + kfpackbuffer.add(f28, tt28); + ASSERT_EQ(kfpackbuffer.size(),2); + FrameBasePtr f22 = std::make_shared<FrameBase>(TimeStamp(22),nullptr,nullptr,nullptr); + KFPackPtr pack22 = std::make_shared<KFPack>(f22,5); + kfpackbuffer.removeUpTo( pack22->key_frame->getTimeStamp() ); + ASSERT_EQ(kfpackbuffer.size(),1); + ASSERT_TRUE(kfpackbuffer.selectPack(f21->getTimeStamp(),tt)==nullptr); + ASSERT_TRUE(kfpackbuffer.selectPack(f28->getTimeStamp(),tt)!=nullptr); +} + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + diff --git a/src/test/gtest_processor_base.cpp b/src/test/gtest_processor_base.cpp index 2e061da25b7b9294b1da48b0ecfda79412a0eb39..ce31eeed39d927a660b33e249c76981c5c0bef50 100644 --- a/src/test/gtest_processor_base.cpp +++ b/src/test/gtest_processor_base.cpp @@ -23,158 +23,6 @@ using namespace wolf; using namespace Eigen; -class KFPackBufferTest : public testing::Test -{ - public: - - KFPackBuffer kfpackbuffer; - FrameBasePtr f10, f20, f21, f28; - Scalar tt10, tt20, tt21, tt28; - TimeStamp timestamp; - Scalar timetolerance; - - void SetUp(void) - { - f10 = std::make_shared<FrameBase>(TimeStamp(10),nullptr,nullptr,nullptr); - f20 = std::make_shared<FrameBase>(TimeStamp(20),nullptr,nullptr,nullptr); - f21 = std::make_shared<FrameBase>(TimeStamp(21),nullptr,nullptr,nullptr); - f28 = std::make_shared<FrameBase>(TimeStamp(28),nullptr,nullptr,nullptr); - - tt10 = 1.0; - tt20 = 1.0; - tt21 = 1.0; - tt28 = 1.0; - }; -}; - -TEST_F(KFPackBufferTest, empty) -{ - ASSERT_TRUE(kfpackbuffer.empty()); -} - -TEST_F(KFPackBufferTest, add) -{ - kfpackbuffer.add(f10, tt10); - ASSERT_EQ(kfpackbuffer.size(),1); - kfpackbuffer.add(f20, tt20); - ASSERT_EQ(kfpackbuffer.size(),2); -} - -TEST_F(KFPackBufferTest, clear) -{ - kfpackbuffer.add(f10, tt10); - kfpackbuffer.add(f20, tt20); - ASSERT_EQ(kfpackbuffer.size(),2); - kfpackbuffer.clear(); - ASSERT_TRUE(kfpackbuffer.empty()); -} - -//TEST_F(KFPackBufferTest, print) -//{ -// kfpackbuffer.clear(); -// kfpackbuffer.add(f10, tt10); -// kfpackbuffer.add(f20, tt20); -// kfpackbuffer.print(); -//} - -TEST_F(KFPackBufferTest, checkTimeTolerance) -{ - kfpackbuffer.clear(); - kfpackbuffer.add(f10, tt10); - kfpackbuffer.add(f20, tt20); - // min time tolerance > diff between time stamps. It should return true - ASSERT_TRUE(kfpackbuffer.checkTimeTolerance(10, 20, 20, 20)); - // min time tolerance < diff between time stamps. It should return true - ASSERT_FALSE(kfpackbuffer.checkTimeTolerance(10, 1, 20, 20)); -} - -TEST_F(KFPackBufferTest, selectPack) -{ - // Evaluation using two packs (p1,p2) - // with different time tolerances (tp1,tp2) - // using a query pack (q) with also different time tolerances - // depending on these tolerances we will get one (p1) or the other (p2) - // packages from the buffer (res). - // This can be summarized in the table hereafter: - // - // p1 p2 q | resulting pack time stamp - // -------------------------------- - // 2 2 2 | nullptr - // 2 2 5 | nullptr - // 2 2 7 | nullptr - // 2 7 2 | nullptr - // 2 7 5 | 20 - // 2 7 7 | 20 - // 7 2 2 | nullptr - // 7 2 5 | nullptr - // 7 2 7 | 10 - // 7 7 2 | nullptr - // 7 7 5 | 20 - // 7 7 7 | 20 - - kfpackbuffer.clear(); - - // input packages - std::vector<int> p1 = {2, 7}; // Pack 1 time tolerances - std::vector<int> p2 = {2, 7}; // Pack 2 time tolerances - std::vector<int> q = {2, 5, 7}; // Query pack time tolerances - - // Solution matrix - Eigen::VectorXi res = Eigen::VectorXi::Zero(12); - res(4) = 20; - res(5) = 20; - res(8) = 10; - res(10) = 20; - res(11) = 20; - - // test - for (auto ip1=0;ip1<p1.size();++ip1) - { - for (auto ip2=0;ip2<p2.size();++ip2) - { - kfpackbuffer.add(f10, p1[ip1]); - kfpackbuffer.add(f20, p2[ip2]); - for (auto iq=0;iq<q.size();++iq) - { - KFPackPtr packQ = kfpackbuffer.selectPack(16, q[iq]); - if (packQ!=nullptr) - ASSERT_EQ(packQ->key_frame->getTimeStamp(),res(ip1*6+ip2*3+iq)); - } - kfpackbuffer.clear(); - } - } -} - -TEST_F(KFPackBufferTest, removeUpTo) -{ - // Small time tolerance for all test asserts - Scalar tt = 0.1; - kfpackbuffer.clear(); - kfpackbuffer.add(f10, tt10); - kfpackbuffer.add(f20, tt20); - kfpackbuffer.add(f21, tt21); - - // it should remove f20 and f10, thus size should be 1 after removal - // Specifically, only f21 should remain - KFPackPtr pack20 = std::make_shared<KFPack>(f20,tt20); - kfpackbuffer.removeUpTo( pack20->key_frame->getTimeStamp() ); - ASSERT_EQ(kfpackbuffer.size(),1); - ASSERT_TRUE(kfpackbuffer.selectPack(f10->getTimeStamp(),tt)==nullptr); - ASSERT_TRUE(kfpackbuffer.selectPack(f20->getTimeStamp(),tt)==nullptr); - ASSERT_TRUE(kfpackbuffer.selectPack(f21->getTimeStamp(),tt)!=nullptr); - - // Chech removal of an imprecise time stamp - // Specifically, only f28 should remain - kfpackbuffer.add(f28, tt28); - ASSERT_EQ(kfpackbuffer.size(),2); - FrameBasePtr f22 = std::make_shared<FrameBase>(TimeStamp(22),nullptr,nullptr,nullptr); - KFPackPtr pack22 = std::make_shared<KFPack>(f22,5); - kfpackbuffer.removeUpTo( pack22->key_frame->getTimeStamp() ); - ASSERT_EQ(kfpackbuffer.size(),1); - ASSERT_TRUE(kfpackbuffer.selectPack(f21->getTimeStamp(),tt)==nullptr); - ASSERT_TRUE(kfpackbuffer.selectPack(f28->getTimeStamp(),tt)!=nullptr); -} - TEST(ProcessorBase, KeyFrameCallback) { @@ -226,6 +74,8 @@ TEST(ProcessorBase, KeyFrameCallback) { // Move t = t+dt; + WOLF_INFO("----------------------- ts: ", t , " --------------------------"); + capt_odo->setTimeStamp(t); proc_odo->process(capt_odo); @@ -234,7 +84,6 @@ TEST(ProcessorBase, KeyFrameCallback) proc_trk->process(capt_trk); // problem->print(4,1,1,0); - WOLF_INFO("-------------------------------------------------"); // Only odom creating KFs ASSERT_TRUE( problem->getLastKeyFramePtr()->getType().compare("PO 2D")==0 );