diff --git a/include/core/processor/processor_motion.h b/include/core/processor/processor_motion.h index 8533e66caf5da96a06680098b44236a4fb420482..41787e38eee63f02fec7012f64684a4b887c5537 100644 --- a/include/core/processor/processor_motion.h +++ b/include/core/processor/processor_motion.h @@ -484,7 +484,8 @@ class ProcessorMotion : public ProcessorBase, public IsMotion CaptureMotionPtr origin_ptr_; CaptureMotionPtr last_ptr_; CaptureMotionPtr incoming_ptr_; - + bool last_nullptr_; + protected: // helpers to avoid allocation double dt_; ///< Time step diff --git a/src/processor/processor_motion.cpp b/src/processor/processor_motion.cpp index ead3fc9e5d0bcbd56367ef12e1a703e658541478..5cb8b42909b9fe93be361983a4f664fef17ce608 100644 --- a/src/processor/processor_motion.cpp +++ b/src/processor/processor_motion.cpp @@ -33,6 +33,7 @@ ProcessorMotion::ProcessorMotion(const std::string& _type, origin_ptr_(), last_ptr_(), incoming_ptr_(), + last_nullptr_(false), dt_(0.0), x_(_state_size), delta_(_delta_size), @@ -95,10 +96,19 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr) preProcess(); // Derived class operations + // integrate data + if (last_ptr_ != nullptr) + { + integrateOneStep(); + } + else { + last_nullptr_ = true; + } + PackKeyFramePtr pack = computeProcessingStep(); if (pack) buffer_pack_kf_.removeUpTo( pack->key_frame->getTimeStamp() ); - + switch(processing_step_) { case FIRST_TIME_WITHOUT_KF : @@ -161,13 +171,15 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr) // extract pack elements FrameBasePtr keyframe_from_callback = pack->key_frame; + TimeStamp ts_from_callback = keyframe_from_callback->getTimeStamp(); + keyframe_from_callback->setState(getState(ts_from_callback)); // find the capture whose buffer is affected by the new keyframe - auto capture_existing = findCaptureContainingTimeStamp(keyframe_from_callback->getTimeStamp()); // k + auto capture_existing = findCaptureContainingTimeStamp(ts_from_callback); // k if (!capture_existing) { - WOLF_WARN("A KF before first motion capture (TS = ", keyframe_from_callback->getTimeStamp(), "). ProcessorMotion cannot do anything."); + WOLF_WARN("A KF before first motion capture (TS = ", ts_from_callback, "). ProcessorMotion cannot do anything."); break; } @@ -178,7 +190,6 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr) VectorXd calib_origin = getCalibration(capture_origin); // emplace a new motion capture to the new keyframe - TimeStamp ts_from_callback = keyframe_from_callback->getTimeStamp(); auto capture_for_keyframe_callback = emplaceCapture(keyframe_from_callback, // j getSensor(), ts_from_callback, @@ -260,6 +271,8 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr) // extract pack elements FrameBasePtr keyframe_from_callback = pack->key_frame; + TimeStamp ts_from_callback = keyframe_from_callback->getTimeStamp(); + keyframe_from_callback->setState(getState(ts_from_callback)); auto & capture_existing = last_ptr_; @@ -270,7 +283,6 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr) VectorXd calib_origin = getCalibration(capture_origin); // emplace a new motion capture to the new keyframe - TimeStamp ts_from_callback = keyframe_from_callback->getTimeStamp(); auto capture_for_keyframe_callback = emplaceCapture(keyframe_from_callback, getSensor(), ts_from_callback, @@ -300,17 +312,18 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr) break; } - //////////////////////////////////////////////////// - // NOW on with the received data + if (last_nullptr_){ + integrateOneStep(); + last_nullptr_ = false; + } - // integrate data - integrateOneStep(); // Update state and time stamps const auto& ts = getTimeStamp(); last_ptr_->setTimeStamp( ts ); last_ptr_->getFrame()->setTimeStamp( ts ); - last_ptr_->getFrame()->setState( getProblem()->getState( ts ) ); + VectorComposite state_propa = getState( ts ); + last_ptr_->getFrame()->setState( state_propa ); if (permittedKeyFrame() && voteForKeyFrame()) {