diff --git a/include/core/processor/processor_motion.h b/include/core/processor/processor_motion.h index 953b9723bd362fbdca73fb7010cf3d8919684a0c..3d331805b70aed8e3cca165dc41613e71e7965ff 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..366d9e4aa1f9fa59880dc3f175a146577786cc6d 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), @@ -98,7 +99,7 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr) PackKeyFramePtr pack = computeProcessingStep(); if (pack) buffer_pack_kf_.removeUpTo( pack->key_frame->getTimeStamp() ); - + switch(processing_step_) { case FIRST_TIME_WITHOUT_KF : @@ -129,6 +130,18 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr) case RUNNING_WITH_KF_ON_ORIGIN : break; + default : + break; + } + + + // integrate data + // Done at this place because setPrior() needs + integrateOneStep(); + + + switch(processing_step_) + { case RUNNING_WITH_KF_BEFORE_ORIGIN : { @@ -161,13 +174,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 +193,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 +274,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 +286,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 +315,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()) {