mergeWith prototype
parent
e626de696a
commit
0d07e8764d
|
|
@ -158,26 +158,26 @@ Vector ImuFactor::evaluateError(const Pose3& pose_i, const Vector3& vel_i,
|
||||||
PreintegratedImuMeasurements ImuFactor::Merge(
|
PreintegratedImuMeasurements ImuFactor::Merge(
|
||||||
const PreintegratedImuMeasurements& pim01,
|
const PreintegratedImuMeasurements& pim01,
|
||||||
const PreintegratedImuMeasurements& pim12) {
|
const PreintegratedImuMeasurements& pim12) {
|
||||||
if(!pim01.matchesParamsWith(pim12))
|
if (!pim01.matchesParamsWith(pim12))
|
||||||
throw std::domain_error("Cannot merge PreintegratedImuMeasurements with different params");
|
throw std::domain_error(
|
||||||
|
"Cannot merge PreintegratedImuMeasurements with different params");
|
||||||
|
|
||||||
if(pim01.params()->body_P_sensor)
|
if (pim01.params()->body_P_sensor)
|
||||||
throw std::domain_error("Cannot merge PreintegratedImuMeasurements with sensor pose yet");
|
throw std::domain_error(
|
||||||
|
"Cannot merge PreintegratedImuMeasurements with sensor pose yet");
|
||||||
|
|
||||||
// the bias for the merged factor will be the bias from 01
|
// the bias for the merged factor will be the bias from 01
|
||||||
PreintegratedImuMeasurements pim02(pim01.params(), pim01.biasHat());
|
PreintegratedImuMeasurements pim02 = pim01;
|
||||||
|
|
||||||
const double& t01 = pim01.deltaTij();
|
Matrix9 H1, H2;
|
||||||
const double& t12 = pim12.deltaTij();
|
pim02.mergeWith(pim12, &H1, &H2);
|
||||||
pim02.deltaTij_ = t01 + t12;
|
|
||||||
|
|
||||||
const Rot3 R01 = pim01.deltaRij(), R12 = pim12.deltaRij();
|
pim02.preintMeasCov_ = H1 * pim01.preintMeasCov_ * H1.transpose() +
|
||||||
pim02.preintegrated_ << Rot3::Logmap(R01 * R12),
|
H2 * pim12.preintMeasCov_ * H2.transpose();
|
||||||
pim01.deltaPij() + pim01.deltaVij() * t12 + R01 * pim12.deltaPij(),
|
|
||||||
pim01.deltaVij() + R01 * pim12.deltaVij();
|
|
||||||
|
|
||||||
return pim02;
|
return pim02;
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
#ifdef GTSAM_ALLOW_DEPRECATED_SINCE_V4
|
#ifdef GTSAM_ALLOW_DEPRECATED_SINCE_V4
|
||||||
ImuFactor::ImuFactor(Key pose_i, Key vel_i, Key pose_j, Key vel_j, Key bias,
|
ImuFactor::ImuFactor(Key pose_i, Key vel_i, Key pose_j, Key vel_j, Key bias,
|
||||||
|
|
|
||||||
|
|
@ -308,6 +308,63 @@ Vector9 PreintegrationBase::computeErrorAndJacobians(const Pose3& pose_i,
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// sugar for derivative blocks
|
||||||
|
#define D_R_R(H) (H)->block<3,3>(0,0)
|
||||||
|
#define D_R_t(H) (H)->block<3,3>(0,3)
|
||||||
|
#define D_R_v(H) (H)->block<3,3>(0,6)
|
||||||
|
#define D_t_R(H) (H)->block<3,3>(3,0)
|
||||||
|
#define D_t_t(H) (H)->block<3,3>(3,3)
|
||||||
|
#define D_t_v(H) (H)->block<3,3>(3,6)
|
||||||
|
#define D_v_R(H) (H)->block<3,3>(6,0)
|
||||||
|
#define D_v_t(H) (H)->block<3,3>(6,3)
|
||||||
|
#define D_v_v(H) (H)->block<3,3>(6,6)
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void PreintegrationBase::mergeWith(const PreintegrationBase& pim12, Matrix9* H1,
|
||||||
|
Matrix9* H2) {
|
||||||
|
if (!matchesParamsWith(pim12))
|
||||||
|
throw std::domain_error(
|
||||||
|
"Cannot merge preintegrated measurements with different params");
|
||||||
|
|
||||||
|
if (params()->body_P_sensor)
|
||||||
|
throw std::domain_error(
|
||||||
|
"Cannot merge preintegrated measurements with sensor pose yet");
|
||||||
|
|
||||||
|
const double& t01 = deltaTij();
|
||||||
|
const double& t12 = pim12.deltaTij();
|
||||||
|
deltaTij_ = t01 + t12;
|
||||||
|
|
||||||
|
Matrix3 R01_H_theta01, R12_H_theta12;
|
||||||
|
const Rot3 R01 = Rot3::Expmap(theta(), R01_H_theta01);
|
||||||
|
const Rot3 R12 = Rot3::Expmap(pim12.theta(), R12_H_theta12);
|
||||||
|
|
||||||
|
Matrix3 R02_H_R01, R02_H_R12;
|
||||||
|
const Rot3 R02 = R01.compose(R12, R02_H_R01, R02_H_R12);
|
||||||
|
|
||||||
|
Matrix3 theta02_H_R02;
|
||||||
|
preintegrated_ << Rot3::Logmap(R02, theta02_H_R02),
|
||||||
|
deltaPij() + deltaVij() * t12 + R01 * pim12.deltaPij(),
|
||||||
|
deltaVij() + R01 * pim12.deltaVij();
|
||||||
|
|
||||||
|
H1->setZero();
|
||||||
|
D_R_R(H1) = theta02_H_R02 * R02_H_R01 * R01_H_theta01;
|
||||||
|
D_t_t(H1) = I_3x3;
|
||||||
|
D_t_v(H1) = I_3x3 * t12;
|
||||||
|
D_v_v(H1) = I_3x3;
|
||||||
|
|
||||||
|
H2->setZero();
|
||||||
|
D_R_R(H2) = theta02_H_R02 * R02_H_R12 * R12_H_theta12; // I_3x3 ??
|
||||||
|
D_t_t(H2) = R01.matrix(); // + rotated_H_theta1 ??
|
||||||
|
D_v_v(H2) = R01.matrix(); // + rotated_H_theta1 ??
|
||||||
|
|
||||||
|
preintegrated_H_biasAcc_ =
|
||||||
|
(*H1) * preintegrated_H_biasAcc_ + (*H2) * pim12.preintegrated_H_biasAcc_;
|
||||||
|
|
||||||
|
preintegrated_H_biasOmega_ = (*H1) * preintegrated_H_biasOmega_ +
|
||||||
|
(*H2) * pim12.preintegrated_H_biasOmega_;
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
#ifdef GTSAM_ALLOW_DEPRECATED_SINCE_V4
|
#ifdef GTSAM_ALLOW_DEPRECATED_SINCE_V4
|
||||||
PoseVelocityBias PreintegrationBase::predict(const Pose3& pose_i,
|
PoseVelocityBias PreintegrationBase::predict(const Pose3& pose_i,
|
||||||
|
|
|
||||||
|
|
@ -211,6 +211,9 @@ public:
|
||||||
OptionalJacobian<9, 6> H3 = boost::none, OptionalJacobian<9, 3> H4 =
|
OptionalJacobian<9, 6> H3 = boost::none, OptionalJacobian<9, 3> H4 =
|
||||||
boost::none, OptionalJacobian<9, 6> H5 = boost::none) const;
|
boost::none, OptionalJacobian<9, 6> H5 = boost::none) const;
|
||||||
|
|
||||||
|
/// Merge in a different set of measurements and update bias derivatives accordingly
|
||||||
|
/// The derivatives apply to the preintegrated Vector9
|
||||||
|
void mergeWith(const PreintegrationBase& pim, Matrix9* H1, Matrix9* H2);
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
/** Dummy clone for MATLAB */
|
/** Dummy clone for MATLAB */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue