27 using namespace gtsam;
33 return X.translation(
H);
37 TEST(IEKF_Pose2, PredictUpdateSequence) {
40 Pose2 X0(0.0, 0.0, 0.0);
41 Matrix3
P0 = Matrix3::Identity() * 0.1;
43 Matrix3
Q = (
Vector3(0.05, 0.05, 0.001)).asDiagonal();
44 Matrix2
R = I_2x2 * 0.01;
46 Pose2 U1(1.0, 1.0, 0.5), U2(1.0, 1.0, 0.0);
63 Matrix3 P1_expected = Ad_U1_inv *
P0 * Ad_U1_inv.transpose() +
Q;
77 Matrix S1 = H1 * P1_expected * H1.transpose() +
R;
78 Matrix K1 = P1_expected * H1.transpose() *
S1.inverse();
80 Pose2 X1_updated_expected = X1_expected.
retract(delta_xi1);
81 Matrix3 I_KH1 = Matrix3::Identity() -
K1 * H1;
82 Matrix3 P1_updated_expected = I_KH1 * P1_expected;
95 Matrix3 P2_expected = Ad_U2_inv * P1_updated_expected * Ad_U2_inv.transpose() +
Q;
112 Pose2 X2_updated_expected = X2_expected.
retract(delta_xi2);
113 Matrix3 I_KH2 = Matrix3::Identity() -
K2 * H2;
114 Matrix3 P2_updated_expected = I_KH2 * P2_expected;
129 H->resize(1,
p.size());
130 (*H) << 1.0, 0.0, 0.0, 1.0;
132 return p(0, 0) +
p(1, 1);
136 TEST(InvariantEKF_DynamicMatrix, PredictAndUpdate) {
138 Matrix p0Matrix = (
Matrix(2, 2) << 1.0, 2.0, 3.0, 4.0).finished();
139 Matrix p0Covariance = I_4x4 * 0.01;
140 Vector velocityTangent = (
Vector(4) << 0.5, 0.1, -0.1, -0.5).finished();
143 Matrix R = Matrix::Identity(1, 1) * 0.005;
154 Matrix pCovariancePredictedExpected = p0Covariance +
Q;
164 double zObserved = zTrue - 0.03;
171 double innovationY_tangent = zObserved - zPredictionManual;
172 Matrix S =
H * pCovarianceBeforeUpdate *
H.transpose() +
R;
173 Matrix kalmanGainK = pCovarianceBeforeUpdate *
H.transpose() *
S.inverse();
174 Vector deltaXiTangent = kalmanGainK * innovationY_tangent;
176 Matrix I_KH = I_4x4 - kalmanGainK *
H;
177 Matrix pUpdatedCovarianceExpected = I_KH * pCovarianceBeforeUpdate * I_KH.transpose() + kalmanGainK *
R * kalmanGainK.
transpose();