diff --git a/include/bodydynamics/processor/processor_force_torque.h b/include/bodydynamics/processor/processor_force_torque.h index 8c9a8d4ab0a8bf944a86f88c8d7ad44bfb330d33..1b8197fc27350412ec330feb802d0a5751bcb916 100644 --- a/include/bodydynamics/processor/processor_force_torque.h +++ b/include/bodydynamics/processor/processor_force_torque.h @@ -104,9 +104,8 @@ class ProcessorForceTorque : public ProcessorMotion{ const VectorXd& _calib, const VectorXd& _calib_preint, const CaptureBasePtr& _capture_origin) override; - FeatureBasePtr emplaceFeature(CaptureMotionPtr _capture_motion) override; - FactorBasePtr emplaceFactor(FeatureBasePtr _feature_motion, - CaptureBasePtr _capture_origin) override; + void emplaceFeaturesAndFactors(CaptureBasePtr _capture_origin, CaptureMotionPtr _capture_own) override; + private: ParamsProcessorForceTorquePtr params_motion_force_torque_; diff --git a/include/bodydynamics/processor/processor_force_torque_inertial.h b/include/bodydynamics/processor/processor_force_torque_inertial.h index 616411f510f74ff6fa12d26d5270ce0252bb5dee..c51dff8a183d77f33856abd55fc665e44b703024 100644 --- a/include/bodydynamics/processor/processor_force_torque_inertial.h +++ b/include/bodydynamics/processor/processor_force_torque_inertial.h @@ -70,6 +70,7 @@ class ProcessorForceTorqueInertial : public ProcessorMotion protected: ParamsProcessorForceTorqueInertialPtr params_force_torque_inertial_; SensorForceTorqueInertialPtr sensor_fti_; + Matrix6d imu_drift_cov_; public: /** \brief convert raw CaptureMotion data to the delta-state format. @@ -225,16 +226,8 @@ class ProcessorForceTorqueInertial : public ProcessorMotion const VectorXd& _calib_preint, const CaptureBasePtr& _capture_origin_ptr) override; - /** \brief emplace a feature corresponding to given capture and add the feature to this capture - * \param _capture_motion: the parent capture - */ - FeatureBasePtr emplaceFeature(CaptureMotionPtr _capture_own) override; + void emplaceFeaturesAndFactors(CaptureBasePtr _capture_origin, CaptureMotionPtr _capture_own) override; - /** \brief emplace a factor and link it in the wolf tree - * \param _feature_motion: the parent feature - * \param _frame_origin: the frame constrained by this motion factor - */ - FactorBasePtr emplaceFactor(FeatureBasePtr _feature_motion, CaptureBasePtr _capture_origin) override; void setCalibration(const CaptureBasePtr _capture, const VectorXd& _calibration) override; diff --git a/include/bodydynamics/processor/processor_force_torque_inertial_dynamics.h b/include/bodydynamics/processor/processor_force_torque_inertial_dynamics.h index c05887e9614252f80afd8861e4b7fc16fe45243c..dd9eef9ee86e6fd6daab00cdd142fc6713217d59 100644 --- a/include/bodydynamics/processor/processor_force_torque_inertial_dynamics.h +++ b/include/bodydynamics/processor/processor_force_torque_inertial_dynamics.h @@ -231,17 +231,6 @@ class ProcessorForceTorqueInertialDynamics : public ProcessorMotion const VectorXd& _calib_preint, const CaptureBasePtr& _capture_origin_ptr) override; - /** \brief emplace a feature corresponding to given capture and add the feature to this capture - * \param _capture_motion: the parent capture - */ - FeatureBasePtr emplaceFeature(CaptureMotionPtr _capture_own) override; - - /** \brief emplace a factor and link it in the wolf tree - * \param _feature_motion: the parent feature - * \param _capture_origin: the capture constrained by this motion factor - */ - FactorBasePtr emplaceFactor(FeatureBasePtr _feature_motion, CaptureBasePtr _capture_origin) override; - /** \brief Emplace features and factors * * This processor emplaces tree possible factors (with its features): diff --git a/src/processor/processor_force_torque.cpp b/src/processor/processor_force_torque.cpp index d9bd77e5474df95514c60c72c5f3f138e92415b4..dd7f5806463b14bbe56ee458d542048675879b7a 100644 --- a/src/processor/processor_force_torque.cpp +++ b/src/processor/processor_force_torque.cpp @@ -126,17 +126,17 @@ CaptureMotionPtr ProcessorForceTorque::emplaceCapture(const FrameBasePtr& _fra return cap; } -FeatureBasePtr ProcessorForceTorque::emplaceFeature(CaptureMotionPtr _capture_motion) -{ - // Retrieving the origin capture and getting the bias from here should be done here? - auto feature = FeatureBase::emplace<FeatureForceTorque>( - _capture_motion, - _capture_motion->getBuffer().back().delta_integr_, - _capture_motion->getBuffer().back().delta_integr_cov_ + unmeasured_perturbation_cov_, - _capture_motion->getCalibrationPreint(), - _capture_motion->getBuffer().back().jacobian_calib_); - return feature; -} +// FeatureBasePtr ProcessorForceTorque::emplaceFeature(CaptureMotionPtr _capture_motion) +// { +// // Retrieving the origin capture and getting the bias from here should be done here? +// auto feature = FeatureBase::emplace<FeatureForceTorque>( +// _capture_motion, +// _capture_motion->getBuffer().back().delta_integr_, +// _capture_motion->getBuffer().back().delta_integr_cov_ + unmeasured_perturbation_cov_, +// _capture_motion->getCalibrationPreint(), +// _capture_motion->getBuffer().back().jacobian_calib_); +// return feature; +// } Eigen::VectorXd ProcessorForceTorque::correctDelta(const Eigen::VectorXd& delta_preint, const Eigen::VectorXd& delta_step) const @@ -190,21 +190,27 @@ void ProcessorForceTorque::setCalibration(const CaptureBasePtr _capture, const V cap_ft->getGyroCaptureOther()->getSensorIntrinsic()->setState(calib_imu); } -FactorBasePtr ProcessorForceTorque::emplaceFactor(FeatureBasePtr _feature_motion, CaptureBasePtr _capture_origin) +void ProcessorForceTorque::emplaceFeaturesAndFactors(CaptureBasePtr _capture_origin, CaptureMotionPtr _capture_own) { + // Retrieving the origin capture and getting the bias from here should be done here? + auto feature = FeatureBase::emplace<FeatureForceTorque>( + _capture_own, + _capture_own->getBuffer().back().delta_integr_, + _capture_own->getBuffer().back().delta_integr_cov_ + unmeasured_perturbation_cov_, + _capture_own->getCalibrationPreint(), + _capture_own->getBuffer().back().jacobian_calib_); + CaptureForceTorquePtr cap_ft_origin = std::static_pointer_cast<CaptureForceTorque>(_capture_origin); - FeatureForceTorquePtr ftr_ft = std::static_pointer_cast<FeatureForceTorque>(_feature_motion); + FeatureForceTorquePtr ftr_ft = std::static_pointer_cast<FeatureForceTorque>(feature); CaptureForceTorquePtr cap_ft_new = std::static_pointer_cast<CaptureForceTorque>(ftr_ft->getCapture()); - auto fac_ft = FactorBase::emplace<FactorForceTorque>(ftr_ft, - ftr_ft, - cap_ft_origin, - shared_from_this(), - cap_ft_origin->getIkinCaptureOther(), // to retrieve sb_bp1 - cap_ft_origin->getGyroCaptureOther(), // to retrieve sb_w1 - false); - - return fac_ft; + FactorBase::emplace<FactorForceTorque>(ftr_ft, + ftr_ft, + cap_ft_origin, + shared_from_this(), + cap_ft_origin->getIkinCaptureOther(), // to retrieve sb_bp1 + cap_ft_origin->getGyroCaptureOther(), // to retrieve sb_w1 + false); } void ProcessorForceTorque::computeCurrentDelta(const Eigen::VectorXd& _data, diff --git a/src/processor/processor_force_torque_inertial.cpp b/src/processor/processor_force_torque_inertial.cpp index 8b54a8cb543393a0bd4198d95e214fc9c65f0d0a..dc3256c2674eb1205a59c98ece711c9fb2f734c8 100644 --- a/src/processor/processor_force_torque_inertial.cpp +++ b/src/processor/processor_force_torque_inertial.cpp @@ -34,6 +34,7 @@ // wolf #include <core/state_block/state_composite.h> #include <core/capture/capture_motion.h> +#include <core/factor/factor_block_difference.h> namespace wolf { @@ -75,18 +76,58 @@ CaptureMotionPtr ProcessorForceTorqueInertial::emplaceCapture(const FrameBasePtr return capture; } -FeatureBasePtr ProcessorForceTorqueInertial::emplaceFeature(CaptureMotionPtr _capture_own) +void ProcessorForceTorqueInertial::emplaceFeaturesAndFactors(CaptureBasePtr _capture_origin, + CaptureMotionPtr _capture_own) { - FeatureBasePtr returnValue; - return returnValue; + // 1. Feature and factor FTI -- force-torque-inertial + //---------------------------------------------------- + auto motion = _capture_own->getBuffer().back(); + auto ftr_fti = FeatureBase::emplace<FeatureMotion>(_capture_own, + "FeatureMotion", + motion.delta_integr_, + motion.delta_integr_cov_ + unmeasured_perturbation_cov_, + _capture_own->getCalibrationPreint(), + motion.jacobian_calib_); + + FactorBase::emplace<FactorForceTorqueInertial>( + ftr_fti, ftr_fti, _capture_origin, shared_from_this(), params_->apply_loss_function); + + + // 2. Feature and factor bias -- IMU bias drift for acc and gyro + //--------------------------------------------------------------- + // - This factor only if IMU biases are Dynamic (check sensor->isStateBlockDynamic('I')) + // - feature has zero measurement size 6, with the cov of the bias drift size 6x6 + // - factor relates bias(last capture) and bias(origin capture) + if (getSensor()->isStateBlockDynamic('I')) + { + const auto& sb_imubias_own = _capture_own->getStateBlock('I'); + const auto& sb_imubias_origin = _capture_origin->getStateBlock('I'); + if (sb_imubias_own != sb_imubias_origin) // make sure it's two different state blocks! -- just in case + { + auto dt = _capture_own->getTimeStamp() - _capture_origin->getTimeStamp(); + auto ftr_bias = + FeatureBase::emplace<FeatureBase>(_capture_own, + "FeatureBase", + Vector6d::Zero(), // mean IMU drift is zero + imu_drift_cov_ * dt); // IMU drift cov specified in continuous time + FactorBase::emplace<FactorBlockDifference>(ftr_bias, + ftr_bias, + sb_imubias_own, // IMU bias block at t=own + sb_imubias_origin, // IMU bias block at t=origin + nullptr, // frame other + _capture_origin, // origin capture + nullptr, // feature other + nullptr, // landmark other + 0, // take all of first state block + -1, // take all of first state block + 0, // take all of first second block + -1, // take all of first second block + shared_from_this(), // this processor + false); // loss function + } + } } -FactorBasePtr ProcessorForceTorqueInertial::emplaceFactor(FeatureBasePtr _feature_motion, - CaptureBasePtr _capture_origin) -{ - FactorBasePtr returnValue; - return returnValue; -} void ProcessorForceTorqueInertial::setCalibration(const CaptureBasePtr _capture, const VectorXd& _calibration) { @@ -96,6 +137,14 @@ void ProcessorForceTorqueInertial::setCalibration(const CaptureBasePtr _capture, void ProcessorForceTorqueInertial::configure(SensorBasePtr _sensor) { sensor_fti_ = std::static_pointer_cast<SensorForceTorqueInertial>(_sensor); + + + auto acc_drift_std = sensor_fti_->getParamsSensorForceTorqueInertial()->acc_drift_std; + auto gyro_drift_std = sensor_fti_->getParamsSensorForceTorqueInertial()->gyro_drift_std; + + ArrayXd imu_drift_sigmas(6); + imu_drift_sigmas << acc_drift_std, acc_drift_std, acc_drift_std, gyro_drift_std, gyro_drift_std, gyro_drift_std; + imu_drift_cov_ = imu_drift_sigmas.square().matrix().asDiagonal(); } void ProcessorForceTorqueInertial::computeCurrentDelta(const Eigen::VectorXd& _data, diff --git a/src/processor/processor_force_torque_inertial_dynamics.cpp b/src/processor/processor_force_torque_inertial_dynamics.cpp index 8becfc0a198f2c4169067d9ceae7b81ecc0ed4bd..678074d6f632f70b47712da7ffcf056fa8a64146 100644 --- a/src/processor/processor_force_torque_inertial_dynamics.cpp +++ b/src/processor/processor_force_torque_inertial_dynamics.cpp @@ -77,28 +77,6 @@ CaptureMotionPtr ProcessorForceTorqueInertialDynamics::emplaceCapture(const Fram return capture; } -FeatureBasePtr ProcessorForceTorqueInertialDynamics::emplaceFeature(CaptureMotionPtr _capture_own) -{ - auto motion = _capture_own->getBuffer().back(); - FeatureBasePtr ftr = FeatureBase::emplace<FeatureMotion>(_capture_own, - "FeatureMotion", - motion.delta_integr_, - motion.delta_integr_cov_ + unmeasured_perturbation_cov_, - _capture_own->getCalibrationPreint(), - motion.jacobian_calib_); - return ftr; -} - -FactorBasePtr ProcessorForceTorqueInertialDynamics::emplaceFactor(FeatureBasePtr _feature_motion, - CaptureBasePtr _capture_origin) -{ - FeatureMotionPtr ftr_ftipd = std::static_pointer_cast<FeatureMotion>(_feature_motion); - - auto fac_ftipd = FactorBase::emplace<FactorForceTorqueInertialDynamics>( - _feature_motion, ftr_ftipd, _capture_origin, shared_from_this(), params_->apply_loss_function); - return fac_ftipd; -} - void ProcessorForceTorqueInertialDynamics::emplaceFeaturesAndFactors(CaptureBasePtr _capture_origin, CaptureMotionPtr _capture_own) {