diff --git a/src/processor_motion.cpp b/src/processor_motion.cpp index 7119d09bc82890e823d8a0575b612603aeabdb79..8cdbd2c1d884f22d8eda0056cd82b5f1b2caf0c5 100644 --- a/src/processor_motion.cpp +++ b/src/processor_motion.cpp @@ -10,6 +10,7 @@ ProcessorMotion::ProcessorMotion(const std::string& _type, Scalar _time_tolerance, Size _calib_size) : ProcessorBase(_type, _time_tolerance), + processing_step_(FIRST_TIME_WITHOUT_PACK), x_size_(_state_size), data_size_(_data_size), delta_size_(_delta_size), @@ -38,6 +39,61 @@ ProcessorMotion::~ProcessorMotion() // std::cout << "destructed -p-Mot" << id() << std::endl; } +void ProcessorMotion::process2(CaptureBasePtr _incoming_ptr) +{ + if (_incoming_ptr == nullptr) + { + WOLF_ERROR("Received capture is nullptr."); + return; + } + + incoming_ptr_ = std::static_pointer_cast<CaptureMotion>(_incoming_ptr); + + preProcess(); // Derived class operations + + computeProcessingStep(); + + switch(processing_step_) + { + case FIRST_TIME_WITH_PACK : + { + KFPackPtr pack = selectPack( incoming_ptr_); + setOrigin(pack->key_frame); + + // TODO process + break; + } + case FIRST_TIME_WITHOUT_PACK : + { + // Create new KF for origin + std::cout << "PM: make KF" << std::endl; + VectorXs x0 = getProblem()->zeroState(); + setOrigin(x0, _incoming_ptr->getTimeStamp()); + break; + } + case SECOND_TIME_WITH_PACK : + { + KFPackPtr pack = selectPack( last_ptr_); + break; + } + case SECOND_TIME_WITHOUT_PACK : + { + break; + } + case RUNNING_WITH_PACK : + { + KFPackPtr pack = selectPack( last_ptr_); + break; + } + case RUNNING_WITHOUT_PACK : + { + break; + } + default : + break; + } +} + void ProcessorMotion::process(CaptureBasePtr _incoming_ptr) { if (_incoming_ptr == nullptr) @@ -566,5 +622,67 @@ FeatureBasePtr ProcessorMotion::emplaceFeature(CaptureMotionPtr _capture_motion) return feature; } +KFPackPtr ProcessorMotion::selectPack(const CaptureBasePtr & _cap) +{ + if (_cap) + return kf_pack_buffer_.selectPack(_cap->getTimeStamp(), time_tolerance_); + + return nullptr; +} + +void ProcessorMotion::computeProcessingStep() +{ + // First determine the processing phase by checking the status of the tracker pointers + enum {FIRST_TIME, SECOND_TIME, RUNNING} step; + if (origin_ptr_ == nullptr && last_ptr_ == nullptr) + step = FIRST_TIME; + else if (origin_ptr_ == last_ptr_) + step = SECOND_TIME; + else + step = RUNNING; + + + // Then combine with the existence (or not) of a keyframe callback pack + switch (step) + { + case FIRST_TIME : + + if (selectPack(incoming_ptr_)) + processing_step_ = FIRST_TIME_WITH_PACK; + else // ! last && ! pack(incoming) + processing_step_ = FIRST_TIME_WITHOUT_PACK; + break; + + case SECOND_TIME : + + if (selectPack(last_ptr_)) + processing_step_ = SECOND_TIME_WITH_PACK; + else + processing_step_ = SECOND_TIME_WITHOUT_PACK; + break; + + case RUNNING : + default : + + if (selectPack(last_ptr_)) + { + if (last_ptr_->getFramePtr()->isKey()) + { + WOLF_WARN("||*||"); + WOLF_INFO(" ... It seems you missed something!"); + WOLF_INFO("Pack's KF and last's KF have matching time stamps (i.e. below time tolerances)"); + WOLF_INFO("Check the following for correctness:"); + WOLF_INFO(" - You have all processors installed before starting receiving any data"); + WOLF_INFO(" - You issued a problem->setPrior() after all processors are installed ---> ", (getProblem()->priorIsSet() ? "OK" : "NOK")); + WOLF_INFO(" - You have configured all your processors with compatible time tolerances"); + WOLF_ERROR("Pack's KF and last's KF have matching time stamps (i.e. below time tolerances)."); + } + processing_step_ = RUNNING_WITH_PACK; + } + else + processing_step_ = RUNNING_WITHOUT_PACK; + break; + } +} } diff --git a/src/processor_motion.h b/src/processor_motion.h index 4def813e2b5b2588f95b9b71ccd7998378fb5599..89ecfd0704f24ed7ccd9865f5062b8a78a7aa689 100644 --- a/src/processor_motion.h +++ b/src/processor_motion.h @@ -99,6 +99,19 @@ namespace wolf */ class ProcessorMotion : public ProcessorBase { + public: + typedef enum { + FIRST_TIME_WITH_PACK, + FIRST_TIME_WITHOUT_PACK, + SECOND_TIME_WITH_PACK, + SECOND_TIME_WITHOUT_PACK, + RUNNING_WITH_PACK, + RUNNING_WITHOUT_PACK + } ProcessingStep ; + + protected: + ProcessingStep processing_step_; ///< State machine controlling the processing step + private: enum { @@ -119,6 +132,7 @@ class ProcessorMotion : public ProcessorBase // Instructions to the processor: + void process2(CaptureBasePtr _incoming_ptr); void process(CaptureBasePtr _incoming_ptr); virtual void resetDerived(); @@ -221,6 +235,10 @@ class ProcessorMotion : public ProcessorBase */ virtual void postProcess() { }; + KFPackPtr selectPack(const CaptureBasePtr & _cap); + + void computeProcessingStep(); + // These are the pure virtual functions doing the mathematics protected: