diff --git a/src/processor_tracker.cpp b/src/processor_tracker.cpp index 503a39fb3b2ef55a37a7f92f9a1fc5d949dc57e1..55992602cd63e6c9e562921a2109189d5e00b0e1 100644 --- a/src/processor_tracker.cpp +++ b/src/processor_tracker.cpp @@ -42,33 +42,136 @@ void ProcessorTracker::process(CaptureBasePtr const _incoming_ptr) incoming_ptr_ = _incoming_ptr; - if ( !kf_pack_buffer_.empty() ) + preProcess(); // Derived class operations + + computeProcessingStep(); + + switch(processing_step_) { - KFPackPtr pack; + case FIRST_TIME_WITH_PACK : + { + // (1) + // pack.KF.addCapture(incoming) + // makeF; F.addCapture(incoming) + // o <- i + // l <- i + + KFPackPtr pack = selectPack( incoming_ptr_); + kf_pack_buffer_.removeUpTo( incoming_ptr_->getTimeStamp() ); - // Select using last_ptr - if (last_ptr_ != nullptr) + // Append incoming to KF + pack->key_frame->addCapture(incoming_ptr_); + + // TODO process info + processNew(max_new_features_); // TODO not sure. Check code inside. + + origin_ptr_ = incoming_ptr_; + last_ptr_ = incoming_ptr_; + incoming_ptr_ = nullptr; + // KF_O, F_L, - + + break; + } + case FIRST_TIME_WITHOUT_PACK : { - pack = kf_pack_buffer_.selectPack( last_ptr_->getTimeStamp(), time_tolerance_ ); - if (pack!=nullptr) - { - keyFrameCallback(pack->key_frame,pack->time_tolerance); - kf_pack_buffer_.removeUpTo( last_ptr_->getTimeStamp() ); - } + // (4) WARNING No pack on first incoming! + // makeKF; KF.addCapture(incoming) + // makeF; F.addCapture(incoming) + // o <- i + // l <- i + + FrameBasePtr kfrm = getProblem()->emplaceFrame(KEY_FRAME, incoming_ptr_->getTimeStamp()); + kfrm->addCapture(incoming_ptr_); + FrameBasePtr frm = getProblem()->emplaceFrame(NON_KEY_FRAME, incoming_ptr_->getTimeStamp()); + frm->addCapture(incoming_ptr_); + + // TODO process info + + // Issue KF callback with new KF + getProblem()->keyFrameCallback(kfrm, shared_from_this(), time_tolerance_); + + + origin_ptr_ = incoming_ptr_; + last_ptr_ = incoming_ptr_; + incoming_ptr_ = nullptr; + + break; } + case SECOND_TIME_WITHOUT_PACK : + { + // (2) + // origin.F.unlink(last) + // makeF; F.addCapture(incoming) + // o <- l + // l <- i + + origin_ptr_->getFramePtr()->unlinkCapture(last_ptr_); + + FrameBasePtr frm = getProblem()->emplaceFrame(NON_KEY_FRAME, incoming_ptr_->getTimeStamp()); + frm->addCapture(incoming_ptr_); + + // TODO process info + + origin_ptr_ = last_ptr_; + last_ptr_ = incoming_ptr_; + incoming_ptr_ = nullptr; - // Select using incoming_ptr - pack = kf_pack_buffer_.selectPack( incoming_ptr_->getTimeStamp(), time_tolerance_ ); - if (pack!=nullptr) + break; + } + case RUNNING_WITH_PACK : { - keyFrameCallback(pack->key_frame,pack->time_tolerance); - kf_pack_buffer_.removeUpTo( incoming_ptr_->getTimeStamp() ); + // (1) + // pack.KF.addCapture(last) + // makeF; F.addCapture(incoming) + // o <- l + // l <- i + + KFPackPtr pack = selectPack( last_ptr_ ); + kf_pack_buffer_.removeUpTo( last_ptr_->getTimeStamp() ); + + WOLF_DEBUG( "PT: KF" , pack->key_frame->id() , " callback received at ts= " , pack->key_frame->getTimeStamp().get() ); + + // Capture last_ is added to the new keyframe + FrameBasePtr last_old_frame = last_ptr_->getFramePtr(); + last_old_frame->unlinkCapture(last_ptr_); + last_old_frame->remove(); + pack->key_frame->addCapture(last_ptr_); + WOLF_DEBUG( " --> appended last capture" ); + + // Create new frame + FrameBasePtr frm = getProblem()->emplaceFrame(NON_KEY_FRAME, incoming_ptr_->getTimeStamp()); + frm->addCapture(incoming_ptr_); + + // Detect new Features, initialize Landmarks, create Constraints, ... + processNew(max_new_features_); + + // Establish constraints between last and origin + // TODO: revise this fcn: code inside, and placement in here + establishConstraints(); + + // reset pointers + origin_ptr_ = last_ptr_; + last_ptr_ = incoming_ptr_; + incoming_ptr_ = nullptr; + + break; } - } + case RUNNING_WITHOUT_PACK : + { + // (3) + // o <- o // verbose + // l <- i - preProcess(); + // TODO process info - computeProcessingStep(); + last_ptr_ = incoming_ptr_; + incoming_ptr_ = nullptr; + + break; + } + default : + break; + } switch (processing_step_) { @@ -245,40 +348,41 @@ void ProcessorTracker::process(CaptureBasePtr const _incoming_ptr) bool ProcessorTracker::keyFrameCallback(FrameBasePtr _keyframe_ptr, const Scalar& _time_tol_other) { - WOLF_DEBUG( "PT: KF" , _keyframe_ptr->id() , " callback received at ts= " , _keyframe_ptr->getTimeStamp().get() ); - - assert((last_ptr_ == nullptr || last_ptr_->getFramePtr() != nullptr) && "ProcessorTracker::keyFrameCallback: last_ptr_ must have a frame always"); - - Scalar time_tol = std::min(time_tolerance_, _time_tol_other); - - - // Nothing to do if: - // - there is no last - // - last frame is already a key frame - // - last frame is too far in time from keyframe - if (last_ptr_ == nullptr || last_ptr_->getFramePtr()->isKey() || std::abs(last_ptr_->getTimeStamp() - _keyframe_ptr->getTimeStamp()) > time_tol) - { - WOLF_DEBUG( " --> nothing done" ); - return false; - } - - WOLF_DEBUG( " --> appended last capture" ); - //std::cout << "ProcessorTracker::keyFrameCallback in sensor " << getSensorPtr()->id() << std::endl; - - // Capture last_ is added to the new keyframe - FrameBasePtr last_old_frame = last_ptr_->getFramePtr(); - last_old_frame->unlinkCapture(last_ptr_); - last_old_frame->remove(); - _keyframe_ptr->addCapture(last_ptr_); - - // Detect new Features, initialize Landmarks, create Constraints, ... - processNew(max_new_features_); - - // Establish constraints between last and origin - establishConstraints(); - - // Set ready to go to 2nd case in process() - origin_ptr_ = nullptr; + WOLF_TRACE("This callback doing nothing!!! "); +// WOLF_DEBUG( "PT: KF" , _keyframe_ptr->id() , " callback received at ts= " , _keyframe_ptr->getTimeStamp().get() ); +// +// assert((last_ptr_ == nullptr || last_ptr_->getFramePtr() != nullptr) && "ProcessorTracker::keyFrameCallback: last_ptr_ must have a frame always"); +// +// Scalar time_tol = std::min(time_tolerance_, _time_tol_other); +// +// +// // Nothing to do if: +// // - there is no last +// // - last frame is already a key frame +// // - last frame is too far in time from keyframe +// if (last_ptr_ == nullptr || last_ptr_->getFramePtr()->isKey() || std::abs(last_ptr_->getTimeStamp() - _keyframe_ptr->getTimeStamp()) > time_tol) +// { +// WOLF_DEBUG( " --> nothing done" ); +// return false; +// } +// +// WOLF_DEBUG( " --> appended last capture" ); +// //std::cout << "ProcessorTracker::keyFrameCallback in sensor " << getSensorPtr()->id() << std::endl; +// +// // Capture last_ is added to the new keyframe +// FrameBasePtr last_old_frame = last_ptr_->getFramePtr(); +// last_old_frame->unlinkCapture(last_ptr_); +// last_old_frame->remove(); +// _keyframe_ptr->addCapture(last_ptr_); +// +// // Detect new Features, initialize Landmarks, create Constraints, ... +// processNew(max_new_features_); +// +// // Establish constraints between last and origin +// establishConstraints(); +// +// // Set ready to go to 2nd case in process() +// origin_ptr_ = nullptr; return true; @@ -309,6 +413,7 @@ KFPackPtr ProcessorTracker::selectPack(const CaptureBasePtr & _cap) void ProcessorTracker::computeProcessingStep() { + enum {FIRST_TIME, SECOND_TIME, RUNNING} step; if (origin_ptr_ == nullptr && last_ptr_ == nullptr) step = FIRST_TIME; @@ -317,33 +422,29 @@ void ProcessorTracker::computeProcessingStep() else step = RUNNING; - //////////////////// + switch (step) { case FIRST_TIME : - { + if (selectPack(incoming_ptr_)) - { processing_step_ = FIRST_TIME_WITH_PACK; - // (1) - // pack.KF.addCapture(incoming) - // makeF; F.addCapture(incoming) - // o <- i - // l <- i - } else // ! last && ! pack(incoming) { + WOLF_WARN("\n||*||"); + WOLF_INFO("\n ... It seems you missed something!"); + WOLF_INFO("\nReceived first Capture without KF pack to associate to"); + WOLF_INFO("Creating a KF for the Capture. But...") + WOLF_INFO("Check the following:"); + WOLF_INFO(" - You have all processors installed before starting receiving any data"); + WOLF_INFO(" - You issued a problem->setPrior() after all processors are installed"); + WOLF_INFO(" - You have configured all your processors with compatible time tolerances"); processing_step_ = FIRST_TIME_WITHOUT_PACK; - // (4) WARNING No pack on first incoming! - // makeKF; KF.addCapture(incoming) - // makeF; F.addCapture(incoming) - // o <- i - // l <- i } - } break; + case SECOND_TIME : - { + if (selectPack(last_ptr_)) { WOLF_WARN("\n||*||"); @@ -356,37 +457,30 @@ void ProcessorTracker::computeProcessingStep() WOLF_ERROR("Pack's KF and origin's KF have matching time stamps (i.e. below time tolerances). Check time tolerances!"); } else - { processing_step_ = SECOND_TIME_WITHOUT_PACK; - // (2) - // last.F.setKey() - // makeF; F.addCapture(incoming) - // o <- l - // l <- i - } break; - } + case RUNNING : default : - { + if (selectPack(last_ptr_)) { + if (last_ptr_->getFramePtr()->isKey()) + { + WOLF_WARN("\n||*||"); + WOLF_INFO("\n ... It seems you missed something!"); + WOLF_INFO("\nPack's KF and last's KF have matching time stamps (i.e. below time tolerances)"); + WOLF_INFO("Check the following:"); + WOLF_INFO(" - You have all processors installed before starting receiving any data"); + WOLF_INFO(" - You issued a problem->setPrior() after all processors are installed"); + 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). Check time tolerances!"); + } processing_step_ = RUNNING_WITH_PACK; - // (1) - // pack.KF.addCapture(last) - // makeF; F.addCapture(incoming) - // o <- l - // l <- i } else - { processing_step_ = RUNNING_WITHOUT_PACK; - // (3) - // o <- o // verbose - // l <- i - } break; - } } }