@@ -115,17 +115,18 @@ void PreintegrationBase::integrateMeasurement(const Vector3& measuredAcc,
115115
116116// ------------------------------------------------------------------------------
117117NavState PreintegrationBase::predict (const NavState& state_i,
118- const imuBias::ConstantBias& bias_i, OptionalJacobian<9 , 9 > H1,
119- OptionalJacobian<9 , 6 > H2) const {
118+ const imuBias::ConstantBias& bias_i, const Vector3& n_gravity, OptionalJacobian<9 , 9 > H1,
119+ OptionalJacobian<9 , 6 > H2, OptionalJacobian< 9 , 3 > H3 ) const {
120120 Matrix96 D_biasCorrected_bias;
121121 Vector9 biasCorrected = biasCorrectedDelta (bias_i,
122122 H2 ? &D_biasCorrected_bias : nullptr );
123123
124124 // Correct for initial velocity and gravity
125125 Matrix9 D_delta_state, D_delta_biasCorrected;
126- Vector9 xi = state_i.correctPIM (biasCorrected, deltaTij_, p ().n_gravity ,
126+ Matrix93 D_delta_gravity;
127+ Vector9 xi = state_i.correctPIM (biasCorrected, deltaTij_, n_gravity,
127128 p ().omegaCoriolis , p ().use2ndOrderCoriolis , H1 ? &D_delta_state : nullptr ,
128- H2 ? &D_delta_biasCorrected : nullptr );
129+ H2 ? &D_delta_biasCorrected : nullptr , H3 ? &D_delta_gravity : nullptr );
129130
130131 // Use retract to get back to NavState manifold
131132 Matrix9 D_predict_state, D_predict_delta;
@@ -136,41 +137,64 @@ NavState PreintegrationBase::predict(const NavState& state_i,
136137 *H1 = D_predict_state + D_predict_delta * D_delta_state;
137138 if (H2)
138139 *H2 = D_predict_delta * D_delta_biasCorrected * D_biasCorrected_bias;
140+ if (H3)
141+ *H3 = D_predict_delta * D_delta_gravity;
139142 return state_j;
140143}
141144
145+ // ------------------------------------------------------------------------------
146+ NavState PreintegrationBase::predict (const NavState& state_i,
147+ const imuBias::ConstantBias& bias_i, OptionalJacobian<9 , 9 > H1,
148+ OptionalJacobian<9 , 6 > H2) const {
149+ return predict (state_i, bias_i, p ().n_gravity , H1, H2, boost::none);
150+ }
151+
142152// ------------------------------------------------------------------------------
143153Vector9 PreintegrationBase::computeError (const NavState& state_i,
144154 const NavState& state_j,
145155 const imuBias::ConstantBias& bias_i,
156+ const Vector3& n_gravity,
146157 OptionalJacobian<9 , 9 > H1,
147158 OptionalJacobian<9 , 9 > H2,
148- OptionalJacobian<9 , 6 > H3) const {
159+ OptionalJacobian<9 , 6 > H3,
160+ OptionalJacobian<9 , 3 > H4) const {
149161 // Predict state at time j
150162 Matrix9 D_predict_state_i;
151163 Matrix96 D_predict_bias_i;
164+ Matrix93 D_predict_gravity;
152165 NavState predictedState_j = predict (
153- state_i, bias_i, H1 ? &D_predict_state_i : 0 , H3 ? &D_predict_bias_i : 0 );
166+ state_i, bias_i, n_gravity, H1 ? &D_predict_state_i : 0 , H3 ? &D_predict_bias_i : 0 , H4 ? &D_predict_gravity : 0 );
154167
155168 // Calculate error
156169 Matrix9 D_error_state_j, D_error_predict;
157170 Vector9 error =
158171 state_j.localCoordinates (predictedState_j, H2 ? &D_error_state_j : 0 ,
159- H1 || H3 ? &D_error_predict : 0 );
172+ H1 || H3 || H4 ? &D_error_predict : 0 );
160173
161174 if (H1) *H1 << D_error_predict * D_predict_state_i;
162175 if (H2) *H2 << D_error_state_j;
163176 if (H3) *H3 << D_error_predict * D_predict_bias_i;
177+ if (H4) *H4 << D_error_predict * D_predict_gravity;
164178
165179 return error;
166180}
167181
182+ // ------------------------------------------------------------------------------
183+ Vector9 PreintegrationBase::computeError (const NavState& state_i,
184+ const NavState& state_j,
185+ const imuBias::ConstantBias& bias_i,
186+ OptionalJacobian<9 , 9 > H1,
187+ OptionalJacobian<9 , 9 > H2,
188+ OptionalJacobian<9 , 6 > H3) const {
189+ return computeError (state_i, state_j, bias_i, p ().n_gravity , H1, H2, H3, boost::none);
190+ }
191+
168192// ------------------------------------------------------------------------------
169193Vector9 PreintegrationBase::computeErrorAndJacobians (const Pose3& pose_i,
170194 const Vector3& vel_i, const Pose3& pose_j, const Vector3& vel_j,
171- const imuBias::ConstantBias& bias_i, OptionalJacobian<9 , 6 > H1,
195+ const imuBias::ConstantBias& bias_i, const Vector3& n_gravity, OptionalJacobian<9 , 6 > H1,
172196 OptionalJacobian<9 , 3 > H2, OptionalJacobian<9 , 6 > H3,
173- OptionalJacobian<9 , 3 > H4, OptionalJacobian<9 , 6 > H5) const {
197+ OptionalJacobian<9 , 3 > H4, OptionalJacobian<9 , 6 > H5, OptionalJacobian< 9 , 3 > H6 ) const {
174198
175199 // Note that derivative of constructors below is not identity for velocity, but
176200 // a 9*3 matrix == Z_3x3, Z_3x3, state.R().transpose()
@@ -179,8 +203,8 @@ Vector9 PreintegrationBase::computeErrorAndJacobians(const Pose3& pose_i,
179203
180204 // Predict state at time j
181205 Matrix9 D_error_state_i, D_error_state_j;
182- Vector9 error = computeError (state_i, state_j, bias_i,
183- H1 || H2 ? &D_error_state_i : 0 , H3 || H4 ? &D_error_state_j : 0 , H5);
206+ Vector9 error = computeError (state_i, state_j, bias_i, n_gravity,
207+ H1 || H2 ? &D_error_state_i : 0 , H3 || H4 ? &D_error_state_j : 0 , H5, H6 );
184208
185209 // Separate out derivatives in terms of 5 arguments
186210 // Note that doing so requires special treatment of velocities, as when treated as
@@ -197,4 +221,13 @@ Vector9 PreintegrationBase::computeErrorAndJacobians(const Pose3& pose_i,
197221
198222// ------------------------------------------------------------------------------
199223
224+ // ------------------------------------------------------------------------------
225+ Vector9 PreintegrationBase::computeErrorAndJacobians (const Pose3& pose_i,
226+ const Vector3& vel_i, const Pose3& pose_j, const Vector3& vel_j,
227+ const imuBias::ConstantBias& bias_i, OptionalJacobian<9 , 6 > H1,
228+ OptionalJacobian<9 , 3 > H2, OptionalJacobian<9 , 6 > H3,
229+ OptionalJacobian<9 , 3 > H4, OptionalJacobian<9 , 6 > H5) const {
230+ return computeErrorAndJacobians (pose_i, vel_i, pose_j, vel_j, bias_i, p ().n_gravity , H1, H2, H3, H4, H5, boost::none);
231+ }
232+
200233} // namespace gtsam
0 commit comments