const update method
parent
325ede23fe
commit
8aca431913
|
|
@ -67,11 +67,10 @@ void PreintegratedImuMeasurements::integrateMeasurement(
|
||||||
static const Matrix93 Gi = (Matrix93() << Z_3x3, I_3x3, Z_3x3).finished();
|
static const Matrix93 Gi = (Matrix93() << Z_3x3, I_3x3, Z_3x3).finished();
|
||||||
|
|
||||||
// Update preintegrated measurements (also get Jacobian)
|
// Update preintegrated measurements (also get Jacobian)
|
||||||
Matrix3 D_incrR_integratedOmega; // Right jacobian computed at theta_incr
|
|
||||||
Matrix9 F; // overall Jacobian wrt preintegrated measurements (df/dx)
|
Matrix9 F; // overall Jacobian wrt preintegrated measurements (df/dx)
|
||||||
Matrix93 G1, G2;
|
Matrix93 G1, G2;
|
||||||
updatePreintegratedMeasurements(measuredAcc, measuredOmega, dt,
|
Matrix3 D_incrR_integratedOmega;
|
||||||
&D_incrR_integratedOmega, &F, &G1, &G2);
|
updatePreintegratedMeasurements(measuredAcc, measuredOmega, dt, &D_incrR_integratedOmega, &F, &G1, &G2);
|
||||||
|
|
||||||
// first order covariance propagation:
|
// first order covariance propagation:
|
||||||
// as in [2] we consider a first order propagation that can be seen as a prediction phase in EKF
|
// as in [2] we consider a first order propagation that can be seen as a prediction phase in EKF
|
||||||
|
|
|
||||||
|
|
@ -60,12 +60,10 @@ bool PreintegrationBase::equals(const PreintegrationBase& other,
|
||||||
&& equal_with_abs_tol(delVdelBiasOmega_, other.delVdelBiasOmega_, tol);
|
&& equal_with_abs_tol(delVdelBiasOmega_, other.delVdelBiasOmega_, tol);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PreintegrationBase::updatePreintegratedMeasurements(
|
//------------------------------------------------------------------------------
|
||||||
const Vector3& measuredAcc, const Vector3& measuredOmega, const double dt,
|
NavState PreintegrationBase::update(const Vector3& measuredAcc,
|
||||||
Matrix3* D_incrR_integratedOmega, Matrix9* F, Matrix93* G1, Matrix93* G2) {
|
const Vector3& measuredOmega, const double dt, Matrix9* F, Matrix93* G1,
|
||||||
|
Matrix93* G2) const {
|
||||||
// NOTE: order is important here because each update uses old values, e.g., velocity and position updates are based on previous rotation estimate.
|
|
||||||
// (i.e., we have to update jacobians and covariances before updating preintegrated measurements).
|
|
||||||
|
|
||||||
// Correct for bias in the sensor frame
|
// Correct for bias in the sensor frame
|
||||||
Vector3 correctedAcc = biasHat_.correctAccelerometer(measuredAcc);
|
Vector3 correctedAcc = biasHat_.correctAccelerometer(measuredAcc);
|
||||||
|
|
@ -87,15 +85,28 @@ void PreintegrationBase::updatePreintegratedMeasurements(
|
||||||
correctedAcc = bRs * correctedAcc - correctedOmega.cross(b_velocity_bs);
|
correctedAcc = bRs * correctedAcc - correctedOmega.cross(b_velocity_bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do update in one fell swoop
|
||||||
|
return deltaXij_.update(correctedAcc, correctedOmega, dt, F, G1, G2);
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void PreintegrationBase::updatePreintegratedMeasurements(
|
||||||
|
const Vector3& measuredAcc, const Vector3& measuredOmega, const double dt,
|
||||||
|
Matrix3* D_incrR_integratedOmega, Matrix9* F, Matrix93* G1, Matrix93* G2) {
|
||||||
|
|
||||||
// Save current rotation for updating Jacobians
|
// Save current rotation for updating Jacobians
|
||||||
const Rot3 oldRij = deltaXij_.attitude();
|
const Rot3 oldRij = deltaXij_.attitude();
|
||||||
|
|
||||||
// Do update in one fell swoop
|
// Do update
|
||||||
deltaTij_ += dt;
|
deltaTij_ += dt;
|
||||||
deltaXij_ = deltaXij_.update(correctedAcc, correctedOmega, dt, F, G1, G2);
|
deltaXij_ = update(measuredAcc, measuredOmega, dt, F, G1, G2); // functional
|
||||||
|
|
||||||
// Update Jacobians
|
// Update Jacobians
|
||||||
// TODO(frank): we are repeating some computation here: accessible in F ?
|
// TODO(frank): we are repeating some computation here: accessible in F ?
|
||||||
|
// Correct for bias in the sensor frame
|
||||||
|
Vector3 correctedAcc = biasHat_.correctAccelerometer(measuredAcc);
|
||||||
|
Vector3 correctedOmega = biasHat_.correctGyroscope(measuredOmega);
|
||||||
|
|
||||||
Matrix3 D_acc_R;
|
Matrix3 D_acc_R;
|
||||||
oldRij.rotate(correctedAcc, D_acc_R);
|
oldRij.rotate(correctedAcc, D_acc_R);
|
||||||
const Matrix3 D_acc_biasOmega = D_acc_R * delRdelBiasOmega_;
|
const Matrix3 D_acc_biasOmega = D_acc_R * delRdelBiasOmega_;
|
||||||
|
|
@ -103,8 +114,7 @@ void PreintegrationBase::updatePreintegratedMeasurements(
|
||||||
const Vector3 integratedOmega = correctedOmega * dt;
|
const Vector3 integratedOmega = correctedOmega * dt;
|
||||||
const Rot3 incrR = Rot3::Expmap(integratedOmega, D_incrR_integratedOmega); // expensive !!
|
const Rot3 incrR = Rot3::Expmap(integratedOmega, D_incrR_integratedOmega); // expensive !!
|
||||||
const Matrix3 incrRt = incrR.transpose();
|
const Matrix3 incrRt = incrR.transpose();
|
||||||
delRdelBiasOmega_ = incrRt * delRdelBiasOmega_
|
delRdelBiasOmega_ = incrRt * delRdelBiasOmega_ - *D_incrR_integratedOmega * dt;
|
||||||
- *D_incrR_integratedOmega * dt;
|
|
||||||
|
|
||||||
double dt22 = 0.5 * dt * dt;
|
double dt22 = 0.5 * dt * dt;
|
||||||
const Matrix3 dRij = oldRij.matrix(); // expensive
|
const Matrix3 dRij = oldRij.matrix(); // expensive
|
||||||
|
|
|
||||||
|
|
@ -188,6 +188,10 @@ public:
|
||||||
/// check equality
|
/// check equality
|
||||||
bool equals(const PreintegrationBase& other, double tol) const;
|
bool equals(const PreintegrationBase& other, double tol) const;
|
||||||
|
|
||||||
|
/// Calculate the updated preintegrated measurement, does not modify
|
||||||
|
NavState update(const Vector3& measuredAcc, const Vector3& measuredOmega,
|
||||||
|
const double dt, Matrix9* F, Matrix93* G1, Matrix93* G2) const;
|
||||||
|
|
||||||
/// Update preintegrated measurements
|
/// Update preintegrated measurements
|
||||||
void updatePreintegratedMeasurements(const Vector3& measuredAcc,
|
void updatePreintegratedMeasurements(const Vector3& measuredAcc,
|
||||||
const Vector3& measuredOmega, const double deltaT,
|
const Vector3& measuredOmega, const double deltaT,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue