diff --git a/src/processor_base.cpp b/src/processor_base.cpp index b14237b0366db2f567c8582f6969db8a20cbf933..b03bbdb8b18e3dc1da3a6a70e57a93ac90f3ecc5 100644 --- a/src/processor_base.cpp +++ b/src/processor_base.cpp @@ -67,4 +67,43 @@ void ProcessorBase::remove() } } +void KFPackBuffer::removeUpTo(const KFPackPtr& _pack) +{ + KFPackBuffer::Iterator post = container_.upper_bound(_pack->key_frame->getTimeStamp()); + container_.erase(container_.begin(), post); // erasing by range +} + +void KFPackBuffer::add(const FrameBasePtr& _key_frame, const Scalar& _time_tolerance) +{ + TimeStamp time_stamp = _key_frame->getTimeStamp(); + KFPackPtr kfpack = std::make_shared<KFPack>(_key_frame, _time_tolerance); + container_.emplace(time_stamp, kfpack); +} + +KFPackPtr KFPackBuffer::selectPack(const TimeStamp& _time_stamp, const Scalar& _time_tolerance) +{ + KFPackBuffer::Iterator post = container_.upper_bound(_time_stamp); + KFPackBuffer::Iterator prev = container_.begin(); + if (post != container_.begin()) + prev = post--; + + if (post == container_.end() && prev != container_.end() + && checkTimeTolerance(prev->first, prev->second->time_tolerance, _time_stamp, _time_tolerance)) + return prev->second; + else if (prev == container_.end() && post != container_.end() + && checkTimeTolerance(post->first, post->second->time_tolerance, _time_stamp, _time_tolerance)) + return post->second; + else if (post != container_.end() && prev != container_.end() + && checkTimeTolerance(prev->first, prev->second->time_tolerance, _time_stamp, _time_tolerance) + && checkTimeTolerance(post->first, post->second->time_tolerance, _time_stamp, _time_tolerance)) + { + if (std::fabs((*post).first - _time_stamp) < std::fabs((*prev).first - _time_stamp)) + return post->second; + else + return prev->second; + } + + return nullptr; +} + } // namespace wolf diff --git a/src/processor_base.h b/src/processor_base.h index e04aba1e24309e17e3bacd23beead112ac50c9a1..fbe714ac3570763a96c2a9491864d063c3a45d23 100644 --- a/src/processor_base.h +++ b/src/processor_base.h @@ -6,16 +6,51 @@ namespace wolf{ class SensorBase; } -//Wolf includes +// Wolf includes #include "wolf.h" #include "node_base.h" +#include "time_stamp.h" // std #include <memory> +#include <map> namespace wolf { +class KFPack +{ + public: + KFPack(const FrameBasePtr _key_frame, const Scalar _time_tolerance) : key_frame(_key_frame), time_tolerance(_time_tolerance) {}; + ~KFPack(){}; + FrameBasePtr key_frame; + Scalar time_tolerance; +}; + +WOLF_PTR_TYPEDEFS(KFPack); + +class KFPackBuffer +{ + public: + + typedef std::map<TimeStamp,KFPackPtr>::iterator Iterator; + KFPackBuffer(void); + ~KFPackBuffer(void); + + KFPackPtr selectPack(const TimeStamp& _time_stamp, const Scalar& _time_tolerance); + + size_t size(void); + + void add(const FrameBasePtr& _key_frame, const Scalar& _time_tolerance); + + void removeUpTo(const KFPackPtr& _pack); + + private: + + std::map<TimeStamp,KFPackPtr> container_; + + bool checkTimeTolerance(const TimeStamp& _time_stamp1, const Scalar& _time_tolerance1, const TimeStamp& _time_stamp2, const Scalar& _time_tolerance2); +}; /** \brief base struct for processor parameters * @@ -125,6 +160,26 @@ inline void ProcessorBase::setTimeTolerance(Scalar _time_tolerance) time_tolerance_ = _time_tolerance; } +inline KFPackBuffer::KFPackBuffer(void) +{ + +} + +inline KFPackBuffer::~KFPackBuffer(void) +{ + +} + +inline bool KFPackBuffer::checkTimeTolerance(const TimeStamp& _time_stamp1, const Scalar& _time_tolerance1, const TimeStamp& _time_stamp2, const Scalar& _time_tolerance2) +{ + return (std::fabs(_time_stamp1 - _time_stamp2) < std::min(_time_tolerance1, _time_tolerance2) ); +} + +inline size_t KFPackBuffer::size(void) +{ + return container_.size(); +} + } // namespace wolf #endif diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 738bccd2056638606f1d1a69a94e6978f49f4756..1bab9866320dfeb0e85a501e7b3db0118ba62d3f 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -76,6 +76,10 @@ target_link_libraries(gtest_motion_buffer ${PROJECT_NAME}) wolf_add_gtest(gtest_problem gtest_problem.cpp) target_link_libraries(gtest_problem ${PROJECT_NAME}) +# ProcessorBase class test +wolf_add_gtest(gtest_processor_base gtest_processor_base.cpp) +target_link_libraries(gtest_processor_base ${PROJECT_NAME}) + # ProcessorMotion class test wolf_add_gtest(gtest_processor_motion gtest_processor_motion.cpp) target_link_libraries(gtest_processor_motion ${PROJECT_NAME}) diff --git a/src/test/gtest_feature_motion.cpp b/src/test/gtest_feature_motion.cpp deleted file mode 100644 index 1620131a6dd4b2b8957c783e5693bab3c4e07f04..0000000000000000000000000000000000000000 --- a/src/test/gtest_feature_motion.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - * gtest_feature_motion.cpp - * - * Created on: Aug 11, 2017 - * Author: jsola - */ - -#include "utils_gtest.h" - -#include "/Users/jsola/dev/wolf/src/feature_motion.h" - -namespace wolf -{ - -TEST(DummyGroup, DummyTestExample) -{ - // TODO: Automatically generated TEST stub -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} - -} /* namespace wolf */ diff --git a/src/test/gtest_processor_base.cpp b/src/test/gtest_processor_base.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b859040c1c005dcb80f034ae856eeeccf6db69dc --- /dev/null +++ b/src/test/gtest_processor_base.cpp @@ -0,0 +1,96 @@ +/* + * gtest_capture_base.cpp + * + * Created on: Feb 15, 2018 + * Author: asantamaria + */ + + +#include "utils_gtest.h" + +#include "processor_base.h" + +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 = 0.1; + tt20 = 0.2; + tt21 = 0.21; + tt28 = 0.28; + }; +}; + +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, removeUpTo) +{ + kfpackbuffer.add(f10, tt10); + kfpackbuffer.add(f20, tt20); + kfpackbuffer.add(f21, tt21); + ASSERT_EQ(kfpackbuffer.size(),3); + + // 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 ); + ASSERT_EQ(kfpackbuffer.size(),1); + ASSERT_TRUE(kfpackbuffer.selectPack(f10->getTimeStamp(),tt10)==nullptr); + ASSERT_TRUE(kfpackbuffer.selectPack(f20->getTimeStamp(),tt20)==nullptr); + ASSERT_TRUE(kfpackbuffer.selectPack(f21->getTimeStamp(),tt21)!=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 ); + ASSERT_EQ(kfpackbuffer.size(),1); + ASSERT_TRUE(kfpackbuffer.selectPack(f21->getTimeStamp(),tt21)==nullptr); + ASSERT_TRUE(kfpackbuffer.selectPack(f28->getTimeStamp(),tt28)!=nullptr); +} + +//TEST_F(KFPackBufferTest, selectPack) +//{ +// kfpackbuffer.add(f10, tt10); +// kfpackbuffer.add(f20, tt20); +// kfpackbuffer.add(f21, tt21); +// +// // It should return f20 +// timestamp = 18; +// timetolerance = 2; +// +// KFPackPtr pack = kfpackbuffer.selectPack(timestamp, timetolerance); +// +// std::cout << pack->key_frame->getTimeStamp() << " " << pack->time_tolerance << std::endl; +//} + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +