diff --git a/src/processor/processor_imu_3d.cpp b/src/processor/processor_imu_3d.cpp index a70c9394b17634220b0fac1702c7dd5c5c6f1553..e31b359ffdf328b264ea4b46ee50dfc1d2be477f 100644 --- a/src/processor/processor_imu_3d.cpp +++ b/src/processor/processor_imu_3d.cpp @@ -99,13 +99,13 @@ bool ProcessorImu3d::voteForKeyFrame() const return false; } -CaptureMotionPtr ProcessorImu3d::emplaceCapture(const FrameBasePtr & _frame_own, - const SensorBasePtr & _sensor, - const TimeStamp & _ts, - const VectorXd & _data, - const MatrixXd & _data_cov, - const VectorXd & _calib, - const VectorXd & _calib_preint, +CaptureMotionPtr ProcessorImu3d::emplaceCapture(const FrameBasePtr &_frame_own, + const SensorBasePtr &_sensor, + const TimeStamp &_ts, + const VectorXd &_data, + const MatrixXd &_data_cov, + const VectorXd &_calib, + const VectorXd &_calib_preint, const CaptureBasePtr &_capture_origin) { auto cap_motion = std::static_pointer_cast<CaptureMotion>( @@ -177,9 +177,9 @@ void ProcessorImu3d::computeCurrentDelta(const Eigen::VectorXd &_data, const Eigen::MatrixXd &_data_cov, const Eigen::VectorXd &_calib, const double _dt, - Eigen::VectorXd & _delta, - Eigen::MatrixXd & _delta_cov, - Eigen::MatrixXd & _jac_delta_calib) const + Eigen::VectorXd &_delta, + Eigen::MatrixXd &_delta_cov, + Eigen::MatrixXd &_jac_delta_calib) const { assert(_data.size() == data_size_ && "Wrong data size!"); @@ -218,7 +218,7 @@ void ProcessorImu3d::computeCurrentDelta(const Eigen::VectorXd &_data, void ProcessorImu3d::deltaPlusDelta(const Eigen::VectorXd &_delta_preint, const Eigen::VectorXd &_delta, const double _dt, - Eigen::VectorXd & _delta_preint_plus_delta) const + Eigen::VectorXd &_delta_preint_plus_delta) const { /* MATHS according to Sola-16 * Dp' = Dp + Dv*dt + 1/2*Dq*(a-a_b)*dt^2 = Dp + Dv*dt + Dq*dp if dp = @@ -235,7 +235,7 @@ void ProcessorImu3d::deltaPlusDelta(const Eigen::VectorXd &_delta_preint, void ProcessorImu3d::statePlusDelta(const VectorComposite &_x, const Eigen::VectorXd &_delta, const double _dt, - VectorComposite & _x_plus_delta) const + VectorComposite &_x_plus_delta) const { assert(_delta.size() == 10 && "Wrong _delta vector size"); assert(_dt >= 0 && "Time interval _dt is negative!"); @@ -255,9 +255,9 @@ void ProcessorImu3d::statePlusDelta(const VectorComposite &_x, void ProcessorImu3d::deltaPlusDelta(const Eigen::VectorXd &_delta_preint, const Eigen::VectorXd &_delta, const double _dt, - Eigen::VectorXd & _delta_preint_plus_delta, - Eigen::MatrixXd & _jacobian_delta_preint, - Eigen::MatrixXd & _jacobian_delta) const + Eigen::VectorXd &_delta_preint_plus_delta, + Eigen::MatrixXd &_jacobian_delta_preint, + Eigen::MatrixXd &_jacobian_delta) const { /* * Expression of the delta integration step, D' = D (+) d: @@ -492,9 +492,16 @@ VectorXd ProcessorImu3d::bootstrapDelta() const for (const auto &fac : bootstrap_factor_list_) // here, we take advantage of the list of IMU factors to recover all deltas { - if (std::dynamic_pointer_cast<FactorImu3d>(fac) != nullptr) + auto cap_motion = std::dynamic_pointer_cast<CaptureMotion>(fac->getCapture()); + if (std::dynamic_pointer_cast<FactorImu3d>(fac) and cap_motion) { - dt = fac->getCapture()->getTimeStamp() - fac->getCapturesFactored().front().lock()->getTimeStamp(); + dt = cap_motion->getTimeStamp() - cap_motion->getOriginCapture()->getTimeStamp(); + const auto &delta = fac->getFeature()->getMeasurement(); // In FeatImu, delta = measurement + delta_int = imu::compose(delta_int, delta, dt); + } + else if (std::dynamic_pointer_cast<FactorRelativePose3d>(fac) and cap_motion) + { + dt = cap_motion->getTimeStamp() - cap_motion->getOriginCapture()->getTimeStamp(); const auto &delta = fac->getFeature()->getMeasurement(); // In FeatImu, delta = measurement delta_int = imu::compose(delta_int, delta, dt); } @@ -525,8 +532,8 @@ bool ProcessorImu3d::recomputeStates() const const auto &cap_origin = cap->getOriginCapture(); const auto &frm_origin = cap_origin->getFrame(); const auto &delta = VectorComposite({{'P', ftr->getMeasurement().head<3>()}, - {'O', ftr->getMeasurement().segment<4>(3)}, - {'V', ftr->getMeasurement().tail<3>()}}); + {'O', ftr->getMeasurement().segment<4>(3)}, + {'V', ftr->getMeasurement().tail<3>()}}); const auto &x_origin = frm_origin->getState(); auto dt = cap->getTimeStamp() - cap_origin->getTimeStamp(); auto x = imu::composeOverState(x_origin, delta, dt);