diff --git a/src/processor_motion.cpp b/src/processor_motion.cpp index c5e830084b3790b1501acfe81fa8dc2086dc645a..7119d09bc82890e823d8a0575b612603aeabdb79 100644 --- a/src/processor_motion.cpp +++ b/src/processor_motion.cpp @@ -278,78 +278,95 @@ bool ProcessorMotion::keyFrameCallback(FrameBasePtr _new_keyframe, const Scalar& { assert(_new_keyframe->getTrajectoryPtr() != nullptr - && "ProcessorMotion::keyFrameCallback: key frame must be in the trajectory."); + && "ProcessorMotion::keyFrameCallback: key frame must be in the trajectory."); // get keyframe's time stamp TimeStamp new_ts = _new_keyframe->getTimeStamp(); // find the capture whose buffer is affected by the new keyframe auto existing_capture = findCaptureContainingTimeStamp(new_ts); - assert(existing_capture != nullptr - && "ProcessorMotion::keyFrameCallback: no motion capture containing the required TimeStamp found"); - - // Find the frame acting as the capture's origin - auto keyframe_origin = existing_capture->getOriginFramePtr(); - - // emplace a new motion capture to the new keyframe - auto new_capture = emplaceCapture(_new_keyframe, - getSensorPtr(), - new_ts, - Eigen::VectorXs::Zero(data_size_), - existing_capture->getDataCovariance(), - existing_capture->getCalibration(), - existing_capture->getCalibration(), - keyframe_origin); - - // split the buffer - // and give the part of the buffer before the new keyframe to the key_capture - existing_capture->getBuffer().split(new_ts, new_capture->getBuffer()); - - // interpolate individual delta - if (!existing_capture->getBuffer().get().empty() && new_capture->getBuffer().get().back().ts_ != new_ts) + + + if(existing_capture == nullptr) // Keyframe without Capture --> first time { - // interpolate Motion at the new time stamp - Motion motion_interpolated = interpolate(new_capture->getBuffer().get().back(), // last Motion of old buffer - existing_capture->getBuffer().get().front(), // first motion of new buffer - new_ts); - // add to old buffer - new_capture->getBuffer().get().push_back(motion_interpolated); + CaptureMotionPtr new_capture = createCapture(new_ts, + getSensorPtr(), + Eigen::VectorXs::Zero(data_size_), + getSensorPtr()->getNoiseCov(), + _new_keyframe); + + new_capture->setCalibration(getSensorPtr()->getCalibration()); + new_capture->setCalibrationPreint(getSensorPtr()->getCalibration()); + + emplaceFrame(NON_KEY_FRAME, new_capture); } + else // Normal operation + { + + // Find the frame acting as the capture's origin + auto keyframe_origin = existing_capture->getOriginFramePtr(); + + // emplace a new motion capture to the new keyframe + auto new_capture = emplaceCapture(_new_keyframe, + getSensorPtr(), + new_ts, + Eigen::VectorXs::Zero(data_size_), + existing_capture->getDataCovariance(), + existing_capture->getCalibration(), + existing_capture->getCalibration(), + keyframe_origin); + + // split the buffer + // and give the part of the buffer before the new keyframe to the key_capture + existing_capture->getBuffer().split(new_ts, new_capture->getBuffer()); + + // interpolate individual delta + if (!existing_capture->getBuffer().get().empty() && new_capture->getBuffer().get().back().ts_ != new_ts) + { + // interpolate Motion at the new time stamp + Motion motion_interpolated = interpolate(new_capture->getBuffer().get().back(), // last Motion of old buffer + existing_capture->getBuffer().get().front(), // first motion of new buffer + new_ts); + // add to old buffer + new_capture->getBuffer().get().push_back(motion_interpolated); + } - // create motion feature and add it to the capture - auto new_feature = emplaceFeature(new_capture); -// reintegrateBuffer(new_capture); + // create motion feature and add it to the capture + auto new_feature = emplaceFeature(new_capture); + // reintegrateBuffer(new_capture); - // create motion constraint and add it to the feature, and constrain to the other capture (origin) - emplaceConstraint(new_feature, keyframe_origin->getCaptureOf(getSensorPtr()) ); + // create motion constraint and add it to the feature, and constrain to the other capture (origin) + emplaceConstraint(new_feature, keyframe_origin->getCaptureOf(getSensorPtr()) ); - ///////////////////////////////////////////////////////// - // Update the existing capture - if (existing_capture == last_ptr_) - // reset processor origin - origin_ptr_ = new_capture; + ///////////////////////////////////////////////////////// + // Update the existing capture + if (existing_capture == last_ptr_) + // reset processor origin + origin_ptr_ = new_capture; - existing_capture->setOriginFramePtr(_new_keyframe); + existing_capture->setOriginFramePtr(_new_keyframe); - // reintegrate existing buffer -- note: the result of re-integration is stored in the same buffer! - reintegrateBuffer(existing_capture); + // reintegrate existing buffer -- note: the result of re-integration is stored in the same buffer! + reintegrateBuffer(existing_capture); - // modify existing feature and constraint (if they exist in the existing capture) - if (!existing_capture->getFeatureList().empty()) - { - auto existing_feature = existing_capture->getFeatureList().back(); // there is only one feature! + // modify existing feature and constraint (if they exist in the existing capture) + if (!existing_capture->getFeatureList().empty()) + { + auto existing_feature = existing_capture->getFeatureList().back(); // there is only one feature! + + // Modify existing feature -------- + existing_feature->setMeasurement (existing_capture->getBuffer().get().back().delta_integr_); + existing_feature->setMeasurementCovariance(existing_capture->getBuffer().get().back().delta_integr_cov_); - // Modify existing feature -------- - existing_feature->setMeasurement (existing_capture->getBuffer().get().back().delta_integr_); - existing_feature->setMeasurementCovariance(existing_capture->getBuffer().get().back().delta_integr_cov_); + // Modify existing constraint -------- + // Instead of modifying, we remove one ctr, and create a new one. + auto ctr_to_remove = existing_feature->getConstraintList().back(); // there is only one constraint! + auto new_ctr = emplaceConstraint(existing_feature, new_capture); + ctr_to_remove ->remove(); // remove old constraint now (otherwise c->remove() gets propagated to f, C, F, etc.) + } - // Modify existing constraint -------- - // Instead of modifying, we remove one ctr, and create a new one. - auto ctr_to_remove = existing_feature->getConstraintList().back(); // there is only one constraint! - auto new_ctr = emplaceConstraint(existing_feature, new_capture); - ctr_to_remove ->remove(); // remove old constraint now (otherwise c->remove() gets propagated to f, C, F, etc.) } return true;