diff --git a/src/processor_base.cpp b/src/processor_base.cpp index 28a6f3dde73ebba6bba0e9c632660d9d13180803..ea4bdc4e82e1edbcb83c9500656f0b0d05de6ab8 100644 --- a/src/processor_base.cpp +++ b/src/processor_base.cpp @@ -11,8 +11,7 @@ ProcessorBase::ProcessorBase(const std::string& _type, ProcessorParamsBasePtr _p NodeBase("PROCESSOR", _type, _params->name), processor_id_(++processor_id_count_), params_(_params), - sensor_ptr_(), - is_removing_(false) + sensor_ptr_() { // WOLF_DEBUG("constructed +p" , id()); } @@ -98,6 +97,12 @@ PackKeyFramePtr PackKeyFrameBuffer::selectPack(const TimeStamp& _time_stamp, con PackKeyFrameBuffer::Iterator post = container_.upper_bound(_time_stamp); + // remove packs corresponding to removed KFs (keeping the next iterator in post) + while (post != container_.end() && post->second->key_frame->isRemoving()) + post = container_.erase(post); + while (post != container_.begin() && std::prev(post)->second->key_frame->isRemoving()) + container_.erase(std::prev(post)); + bool prev_exists = (post != container_.begin()); bool post_exists = (post != container_.end()); @@ -133,33 +138,33 @@ PackKeyFramePtr PackKeyFrameBuffer::selectPack(const CaptureBasePtr _capture, co return selectPack(_capture->getTimeStamp(), _time_tolerance); } -PackKeyFramePtr PackKeyFrameBuffer::selectPackBefore(const TimeStamp& _time_stamp, const Scalar& _time_tolerance) +PackKeyFramePtr PackKeyFrameBuffer::selectFirstPackBefore(const TimeStamp& _time_stamp, const Scalar& _time_tolerance) { - if (container_.empty()) - return nullptr; + // remove packs corresponding to removed KFs + while (!container_.empty() && container_.begin()->second->key_frame->isRemoving()) + container_.erase(container_.begin()); - PackKeyFrameBuffer::Iterator post = container_.upper_bound(_time_stamp); + // There is no pack + if (container_.empty()) + return nullptr; - bool prev_exists = (post != container_.begin()); + // Checking on begin() since packs are ordered in time + // Return first pack if is older than time stamp + if (container_.begin()->first < _time_stamp) + return container_.begin()->second; - if (prev_exists) + // Return first pack if despite being newer, it is within the time tolerance + if (checkTimeTolerance(container_.begin()->first, container_.begin()->second->time_tolerance, _time_stamp, _time_tolerance)) return container_.begin()->second; - else - { - bool post_exists = (post != container_.end()); - bool post_ok = post_exists && checkTimeTolerance(post->first, post->second->time_tolerance, _time_stamp, _time_tolerance); - - if (post_ok) - return post->second; - } - + // otherwise return nullptr (no pack before the provided ts or within the tolerance was found) return nullptr; + } -PackKeyFramePtr PackKeyFrameBuffer::selectPackBefore(const CaptureBasePtr _capture, const Scalar& _time_tolerance) +PackKeyFramePtr PackKeyFrameBuffer::selectFirstPackBefore(const CaptureBasePtr _capture, const Scalar& _time_tolerance) { - return selectPackBefore(_capture->getTimeStamp(), _time_tolerance); + return selectFirstPackBefore(_capture->getTimeStamp(), _time_tolerance); } void PackKeyFrameBuffer::print(void) diff --git a/src/processor_base.h b/src/processor_base.h index b9dc4b8d6464062e21a91e8d4133462731ac1be6..bcf5c46b62730d593165f99fdb8d021296964812 100644 --- a/src/processor_base.h +++ b/src/processor_base.h @@ -58,8 +58,8 @@ class PackKeyFrameBuffer PackKeyFramePtr selectPack(const TimeStamp& _time_stamp, const Scalar& _time_tolerance); PackKeyFramePtr selectPack(const CaptureBasePtr _capture, const Scalar& _time_tolerance); - PackKeyFramePtr selectPackBefore(const TimeStamp& _time_stamp, const Scalar& _time_tolerance); - PackKeyFramePtr selectPackBefore(const CaptureBasePtr _capture, const Scalar& _time_tolerance); + PackKeyFramePtr selectFirstPackBefore(const TimeStamp& _time_stamp, const Scalar& _time_tolerance); + PackKeyFramePtr selectFirstPackBefore(const CaptureBasePtr _capture, const Scalar& _time_tolerance); /**\brief Buffer size * @@ -147,15 +147,13 @@ class ProcessorBase : public NodeBase, public std::enable_shared_from_this<Proce private: SensorBaseWPtr sensor_ptr_; - bool is_removing_; ///< A flag for safely removing nodes from the Wolf tree. See remove(). - static unsigned int processor_id_count_; public: ProcessorBase(const std::string& _type, ProcessorParamsBasePtr _params); virtual ~ProcessorBase(); virtual void configure(SensorBasePtr _sensor) = 0; - void remove(); + virtual void remove(); unsigned int id(); diff --git a/src/processor_motion.cpp b/src/processor_motion.cpp index 450cd9d8c2333e06ef76a269939430fe42a18705..c72c02973a4c57abea464811a32f59f707271c7a 100644 --- a/src/processor_motion.cpp +++ b/src/processor_motion.cpp @@ -584,7 +584,7 @@ PackKeyFramePtr ProcessorMotion::computeProcessingStep() throw std::runtime_error("ProcessorMotion received data before being initialized."); } - PackKeyFramePtr pack = kf_pack_buffer_.selectPackBefore(last_ptr_, params_motion_->time_tolerance); + PackKeyFramePtr pack = kf_pack_buffer_.selectFirstPackBefore(last_ptr_, params_motion_->time_tolerance); if (pack) { diff --git a/src/test/gtest_pack_KF_buffer.cpp b/src/test/gtest_pack_KF_buffer.cpp index dab222c29248b5be35c61d9de10ffb041647217f..1204254c1024266c98cfe2c8e3764f76453fe2ee 100644 --- a/src/test/gtest_pack_KF_buffer.cpp +++ b/src/test/gtest_pack_KF_buffer.cpp @@ -144,7 +144,7 @@ TEST_F(BufferPackKeyFrameTest, selectPack) } } -TEST_F(BufferPackKeyFrameTest, selectPackBefore) +TEST_F(BufferPackKeyFrameTest, selectFirstPackBefore) { pack_kf_buffer.clear(); @@ -194,7 +194,7 @@ TEST_F(BufferPackKeyFrameTest, selectPackBefore) int j = 0; for (auto ts : q_ts) { - packQ = pack_kf_buffer.selectPackBefore(ts, tt); + packQ = pack_kf_buffer.selectFirstPackBefore(ts, tt); if (packQ) res(i,j) = packQ->key_frame->getTimeStamp().get();