refactoring F and G
							parent
							
								
									8aca431913
								
							
						
					
					
						commit
						7901077a7a
					
				|  | @ -50,18 +50,33 @@ void PreintegratedCombinedMeasurements::resetIntegration() { | ||||||
|   preintMeasCov_.setZero(); |   preintMeasCov_.setZero(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | //------------------------------------------------------------------------------
 | ||||||
|  | // 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) | ||||||
|  | #define D_a_a(H) (H)->block<3,3>(9,9) | ||||||
|  | #define D_g_g(H) (H)->block<3,3>(12,12) | ||||||
|  | 
 | ||||||
| //------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------
 | ||||||
| void PreintegratedCombinedMeasurements::integrateMeasurement( | void PreintegratedCombinedMeasurements::integrateMeasurement( | ||||||
|     const Vector3& measuredAcc, const Vector3& measuredOmega, double deltaT, |     const Vector3& measuredAcc, const Vector3& measuredOmega, double deltaT, | ||||||
|     boost::optional<Matrix&> F_test, boost::optional<Matrix&> G_test) { |     OptionalJacobian<15, 15> F_test, OptionalJacobian<15, 21> G_test) { | ||||||
| 
 | 
 | ||||||
|   const Matrix3 dRij = deltaRij_.matrix(); // expensive when quaternion
 |   const Matrix3 dRij = deltaXij_.R(); // expensive when quaternion
 | ||||||
| 
 | 
 | ||||||
|   // Update preintegrated measurements.
 |   // Update preintegrated measurements.
 | ||||||
|   Matrix3 D_incrR_integratedOmega; // Right jacobian computed at theta_incr
 |   Matrix3 D_incrR_integratedOmega; // Right jacobian computed at theta_incr
 | ||||||
|   Matrix9 F_9x9; // overall Jacobian wrt preintegrated measurements (df/dx)
 |   Matrix9 F_9x9; // overall Jacobian wrt preintegrated measurements (df/dx)
 | ||||||
|  |   Matrix93 G1,G2; | ||||||
|   updatePreintegratedMeasurements(measuredAcc, measuredOmega, deltaT, |   updatePreintegratedMeasurements(measuredAcc, measuredOmega, deltaT, | ||||||
|       &D_incrR_integratedOmega, &F_9x9); |       &D_incrR_integratedOmega, &F_9x9, &G1, &G2); | ||||||
| 
 | 
 | ||||||
|   // Update preintegrated measurements covariance: as in [2] we consider a first order propagation that
 |   // Update preintegrated measurements covariance: as in [2] we consider a first order propagation that
 | ||||||
|   // can be seen as a prediction phase in an EKF framework. In this implementation, contrarily to [2] we
 |   // can be seen as a prediction phase in an EKF framework. In this implementation, contrarily to [2] we
 | ||||||
|  | @ -74,17 +89,11 @@ void PreintegratedCombinedMeasurements::integrateMeasurement( | ||||||
| 
 | 
 | ||||||
|   // overall Jacobian wrt preintegrated measurements (df/dx)
 |   // overall Jacobian wrt preintegrated measurements (df/dx)
 | ||||||
|   Eigen::Matrix<double,15,15> F; |   Eigen::Matrix<double,15,15> F; | ||||||
|   // for documentation:
 |  | ||||||
|   //  F << I_3x3,    I_3x3 * deltaT,   Z_3x3,             Z_3x3,            Z_3x3,
 |  | ||||||
|   //       Z_3x3,    I_3x3,            H_vel_angles,      H_vel_biasacc,    Z_3x3,
 |  | ||||||
|   //       Z_3x3,    Z_3x3,            H_angles_angles,   Z_3x3,            H_angles_biasomega,
 |  | ||||||
|   //       Z_3x3,    Z_3x3,            Z_3x3,             I_3x3,            Z_3x3,
 |  | ||||||
|   //       Z_3x3,    Z_3x3,            Z_3x3,             Z_3x3,            I_3x3;
 |  | ||||||
|   F.setZero(); |   F.setZero(); | ||||||
|   F.block<9, 9>(0, 0) = F_9x9; |   F.block<9, 9>(0, 0) = F_9x9; | ||||||
|  |   F.block<3, 3>(0, 12) = H_angles_biasomega; | ||||||
|  |   F.block<3, 3>(6, 9) = H_vel_biasacc; | ||||||
|   F.block<6, 6>(9, 9) = I_6x6; |   F.block<6, 6>(9, 9) = I_6x6; | ||||||
|   F.block<3, 3>(3, 9) = H_vel_biasacc; |  | ||||||
|   F.block<3, 3>(6, 12) = H_angles_biasomega; |  | ||||||
| 
 | 
 | ||||||
|   // first order uncertainty propagation
 |   // first order uncertainty propagation
 | ||||||
|   // Optimized matrix multiplication   (1/deltaT) * G * measurementCovariance * G.transpose()
 |   // Optimized matrix multiplication   (1/deltaT) * G * measurementCovariance * G.transpose()
 | ||||||
|  | @ -92,38 +101,36 @@ void PreintegratedCombinedMeasurements::integrateMeasurement( | ||||||
|   G_measCov_Gt.setZero(15, 15); |   G_measCov_Gt.setZero(15, 15); | ||||||
| 
 | 
 | ||||||
|   // BLOCK DIAGONAL TERMS
 |   // BLOCK DIAGONAL TERMS
 | ||||||
|   G_measCov_Gt.block<3, 3>(0, 0) = deltaT * p().integrationCovariance; |   D_t_t(&G_measCov_Gt) = deltaT * p().integrationCovariance; | ||||||
|   G_measCov_Gt.block<3, 3>(3, 3) = (1 / deltaT) * (H_vel_biasacc) |   D_v_v(&G_measCov_Gt) = (1 / deltaT) * (H_vel_biasacc) | ||||||
|       * (p().accelerometerCovariance + p().biasAccOmegaInit.block<3, 3>(0, 0)) |       * (p().accelerometerCovariance + p().biasAccOmegaInit.block<3, 3>(0, 0)) | ||||||
|       * (H_vel_biasacc.transpose()); |       * (H_vel_biasacc.transpose()); | ||||||
|   G_measCov_Gt.block<3, 3>(6, 6) = (1 / deltaT) * (H_angles_biasomega) |   D_R_R(&G_measCov_Gt) = (1 / deltaT) * (H_angles_biasomega) | ||||||
|       * (p().gyroscopeCovariance + p().biasAccOmegaInit.block<3, 3>(3, 3)) |       * (p().gyroscopeCovariance + p().biasAccOmegaInit.block<3, 3>(3, 3)) | ||||||
|       * (H_angles_biasomega.transpose()); |       * (H_angles_biasomega.transpose()); | ||||||
|   G_measCov_Gt.block<3, 3>(9, 9) = (1 / deltaT) * p().biasAccCovariance; |   D_a_a(&G_measCov_Gt) = (1 / deltaT) * p().biasAccCovariance; | ||||||
|   G_measCov_Gt.block<3, 3>(12, 12) = (1 / deltaT) * p().biasOmegaCovariance; |   D_g_g(&G_measCov_Gt) = (1 / deltaT) * p().biasOmegaCovariance; | ||||||
| 
 | 
 | ||||||
|   // OFF BLOCK DIAGONAL TERMS
 |   // OFF BLOCK DIAGONAL TERMS
 | ||||||
|   Matrix3 block23 = H_vel_biasacc * p().biasAccOmegaInit.block<3, 3>(3, 0) |   Matrix3 temp = H_vel_biasacc * p().biasAccOmegaInit.block<3, 3>(3, 0) | ||||||
|       * H_angles_biasomega.transpose(); |       * H_angles_biasomega.transpose(); | ||||||
|   G_measCov_Gt.block<3, 3>(3, 6) = block23; |   D_v_R(&G_measCov_Gt) = temp; | ||||||
|   G_measCov_Gt.block<3, 3>(6, 3) = block23.transpose(); |   D_R_v(&G_measCov_Gt) = temp.transpose(); | ||||||
|   preintMeasCov_ = F * preintMeasCov_ * F.transpose() + G_measCov_Gt; |   preintMeasCov_ = F * preintMeasCov_ * F.transpose() + G_measCov_Gt; | ||||||
| 
 | 
 | ||||||
|   // F_test and G_test are used for testing purposes and are not needed by the factor
 |   // F_test and G_test are used for testing purposes and are not needed by the factor
 | ||||||
|   if (F_test) { |   if (F_test) { | ||||||
|     F_test->resize(15, 15); |  | ||||||
|     (*F_test) << F; |     (*F_test) << F; | ||||||
|   } |   } | ||||||
|   if (G_test) { |   if (G_test) { | ||||||
|     G_test->resize(15, 21); |  | ||||||
|     // This is for testing & documentation
 |     // This is for testing & documentation
 | ||||||
|     ///< measurementCovariance_ : cov[integrationError measuredAcc measuredOmega biasAccRandomWalk biasOmegaRandomWalk biasAccInit biasOmegaInit] in R^(21 x 21)
 |     ///< measurementCovariance_ : cov[integrationError measuredAcc measuredOmega biasAccRandomWalk biasOmegaRandomWalk biasAccInit biasOmegaInit] in R^(21 x 21)
 | ||||||
|     (*G_test) << //
 |     (*G_test) << //
 | ||||||
|         I_3x3 * deltaT, Z_3x3, Z_3x3, Z_3x3, Z_3x3, Z_3x3, Z_3x3, //
 |         -H_angles_biasomega, Z_3x3, Z_3x3, Z_3x3, Z_3x3, Z_3x3, H_angles_biasomega, //
 | ||||||
|     Z_3x3, -H_vel_biasacc, Z_3x3, Z_3x3, Z_3x3, H_vel_biasacc, Z_3x3, //
 |         Z_3x3, I_3x3 * deltaT, Z_3x3, Z_3x3, Z_3x3, Z_3x3, Z_3x3, //
 | ||||||
|     Z_3x3, Z_3x3, -H_angles_biasomega, Z_3x3, Z_3x3, Z_3x3, H_angles_biasomega, //
 |         Z_3x3, Z_3x3, -H_vel_biasacc, Z_3x3, Z_3x3, H_vel_biasacc, Z_3x3, //
 | ||||||
|     Z_3x3, Z_3x3, Z_3x3, I_3x3, Z_3x3, Z_3x3, Z_3x3, //
 |         Z_3x3, Z_3x3, Z_3x3, I_3x3, Z_3x3, Z_3x3, Z_3x3, //
 | ||||||
|     Z_3x3, Z_3x3, Z_3x3, Z_3x3, I_3x3, Z_3x3, Z_3x3; |         Z_3x3, Z_3x3, Z_3x3, Z_3x3, I_3x3, Z_3x3, Z_3x3; | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -198,7 +205,7 @@ Vector CombinedImuFactor::evaluateError(const Pose3& pose_i, | ||||||
|   Matrix93 D_r_vel_i, D_r_vel_j; |   Matrix93 D_r_vel_i, D_r_vel_j; | ||||||
| 
 | 
 | ||||||
|   // error wrt preintegrated measurements
 |   // error wrt preintegrated measurements
 | ||||||
|   Vector9 r_pvR = _PIM_.computeErrorAndJacobians(pose_i, vel_i, pose_j, vel_j, bias_i, |   Vector9 r_Rpv = _PIM_.computeErrorAndJacobians(pose_i, vel_i, pose_j, vel_j, bias_i, | ||||||
|       H1 ? &D_r_pose_i : 0, H2 ? &D_r_vel_i : 0, H3 ? &D_r_pose_j : 0, |       H1 ? &D_r_pose_i : 0, H2 ? &D_r_vel_i : 0, H3 ? &D_r_pose_j : 0, | ||||||
|       H4 ? &D_r_vel_j : 0, H5 ? &D_r_bias_i : 0); |       H4 ? &D_r_vel_j : 0, H5 ? &D_r_bias_i : 0); | ||||||
| 
 | 
 | ||||||
|  | @ -242,7 +249,7 @@ Vector CombinedImuFactor::evaluateError(const Pose3& pose_i, | ||||||
| 
 | 
 | ||||||
|   // overall error
 |   // overall error
 | ||||||
|   Vector r(15); |   Vector r(15); | ||||||
|   r << r_pvR, fbias; // vector of size 15
 |   r << r_Rpv, fbias; // vector of size 15
 | ||||||
|   return r; |   return r; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -142,10 +142,10 @@ class PreintegratedCombinedMeasurements : public PreintegrationBase { | ||||||
|    * @param body_P_sensor Optional sensor frame (pose of the IMU in the body |    * @param body_P_sensor Optional sensor frame (pose of the IMU in the body | ||||||
|    * frame) |    * frame) | ||||||
|    */ |    */ | ||||||
|   void integrateMeasurement( |   void integrateMeasurement(const Vector3& measuredAcc, | ||||||
|       const Vector3& measuredAcc, const Vector3& measuredOmega, double deltaT, |       const Vector3& measuredOmega, double deltaT, | ||||||
|       boost::optional<Matrix&> F_test = boost::none, |       OptionalJacobian<15, 15> F_test = boost::none, | ||||||
|       boost::optional<Matrix&> G_test = boost::none); |       OptionalJacobian<15, 21> G_test = boost::none); | ||||||
| 
 | 
 | ||||||
|   /// methods to access class variables
 |   /// methods to access class variables
 | ||||||
|   Matrix preintMeasCov() const { return preintMeasCov_; } |   Matrix preintMeasCov() const { return preintMeasCov_; } | ||||||
|  |  | ||||||
|  | @ -47,36 +47,30 @@ namespace { | ||||||
| Vector updatePreintegratedMeasurementsTest(const Vector3 deltaPij_old, | Vector updatePreintegratedMeasurementsTest(const Vector3 deltaPij_old, | ||||||
|     const Vector3& deltaVij_old, const Rot3& deltaRij_old, |     const Vector3& deltaVij_old, const Rot3& deltaRij_old, | ||||||
|     const imuBias::ConstantBias& bias_old, const Vector3& correctedAcc, |     const imuBias::ConstantBias& bias_old, const Vector3& correctedAcc, | ||||||
|     const Vector3& correctedOmega, const double deltaT, |     const Vector3& correctedOmega, const double deltaT) { | ||||||
|     const bool use2ndOrderIntegration) { |  | ||||||
| 
 | 
 | ||||||
|   Matrix3 dRij = deltaRij_old.matrix(); |   Matrix3 dRij = deltaRij_old.matrix(); | ||||||
|   Vector3 temp = dRij * (correctedAcc - bias_old.accelerometer()) * deltaT; |   Vector3 temp = dRij * (correctedAcc - bias_old.accelerometer()) * deltaT; | ||||||
|   Vector3 deltaPij_new; |   Vector3 deltaPij_new; | ||||||
|   if (!use2ndOrderIntegration) { |   deltaPij_new = deltaPij_old + deltaVij_old * deltaT + 0.5 * temp * deltaT; | ||||||
|     deltaPij_new = deltaPij_old + deltaVij_old * deltaT; |  | ||||||
|   } else { |  | ||||||
|     deltaPij_new = deltaPij_old + deltaVij_old * deltaT + 0.5 * temp * deltaT; |  | ||||||
|   } |  | ||||||
|   Vector3 deltaVij_new = deltaVij_old + temp; |   Vector3 deltaVij_new = deltaVij_old + temp; | ||||||
|   Rot3 deltaRij_new = deltaRij_old |   Rot3 deltaRij_new = deltaRij_old | ||||||
|       * Rot3::Expmap((correctedOmega - bias_old.gyroscope()) * deltaT); |       * Rot3::Expmap((correctedOmega - bias_old.gyroscope()) * deltaT); | ||||||
|   Vector3 logDeltaRij_new = Rot3::Logmap(deltaRij_new); // not important any more
 |   Vector3 logDeltaRij_new = Rot3::Logmap(deltaRij_new); // not important any more
 | ||||||
|   imuBias::ConstantBias bias_new(bias_old); |   imuBias::ConstantBias bias_new(bias_old); | ||||||
|   Vector result(15); |   Vector result(15); | ||||||
|   result << deltaPij_new, deltaVij_new, logDeltaRij_new, bias_new.vector(); |   result << logDeltaRij_new, deltaPij_new, deltaVij_new, bias_new.vector(); | ||||||
|   return result; |   return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Rot3 updatePreintegratedMeasurementsRot(const Vector3 deltaPij_old, | Rot3 updatePreintegratedMeasurementsRot(const Vector3 deltaPij_old, | ||||||
|     const Vector3& deltaVij_old, const Rot3& deltaRij_old, |     const Vector3& deltaVij_old, const Rot3& deltaRij_old, | ||||||
|     const imuBias::ConstantBias& bias_old, const Vector3& correctedAcc, |     const imuBias::ConstantBias& bias_old, const Vector3& correctedAcc, | ||||||
|     const Vector3& correctedOmega, const double deltaT, |     const Vector3& correctedOmega, const double deltaT) { | ||||||
|     const bool use2ndOrderIntegration) { |  | ||||||
| 
 | 
 | ||||||
|   Vector result = updatePreintegratedMeasurementsTest(deltaPij_old, |   Vector result = updatePreintegratedMeasurementsTest(deltaPij_old, | ||||||
|       deltaVij_old, deltaRij_old, bias_old, correctedAcc, correctedOmega, |       deltaVij_old, deltaRij_old, bias_old, correctedAcc, correctedOmega, | ||||||
|       deltaT, use2ndOrderIntegration); |       deltaT); | ||||||
| 
 | 
 | ||||||
|   return Rot3::Expmap(result.segment < 3 > (6)); |   return Rot3::Expmap(result.segment < 3 > (6)); | ||||||
| } | } | ||||||
|  | @ -377,10 +371,8 @@ TEST( CombinedImuFactor, JacobianPreintegratedCovariancePropagation ) { | ||||||
|   Matrix oldPreintCovariance = pim.preintMeasCov(); |   Matrix oldPreintCovariance = pim.preintMeasCov(); | ||||||
| 
 | 
 | ||||||
|   Matrix Factual, Gactual; |   Matrix Factual, Gactual; | ||||||
|   pim.integrateMeasurement(newMeasuredAcc, newMeasuredOmega, |   pim.integrateMeasurement(newMeasuredAcc, newMeasuredOmega, newDeltaT, Factual, | ||||||
|       newDeltaT, Factual, Gactual); |       Gactual); | ||||||
| 
 |  | ||||||
|   bool use2ndOrderIntegration = false; |  | ||||||
| 
 | 
 | ||||||
|   //////////////////////////////////////////////////////////////////////////////////////////////
 |   //////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|   // COMPUTE NUMERICAL DERIVATIVES FOR F
 |   // COMPUTE NUMERICAL DERIVATIVES FOR F
 | ||||||
|  | @ -388,51 +380,51 @@ TEST( CombinedImuFactor, JacobianPreintegratedCovariancePropagation ) { | ||||||
|   // Compute expected F wrt positions (15,3)
 |   // Compute expected F wrt positions (15,3)
 | ||||||
|   Matrix df_dpos = numericalDerivative11<Vector, Vector3>( |   Matrix df_dpos = numericalDerivative11<Vector, Vector3>( | ||||||
|       boost::bind(&updatePreintegratedMeasurementsTest, _1, deltaVij_old, |       boost::bind(&updatePreintegratedMeasurementsTest, _1, deltaVij_old, | ||||||
|           deltaRij_old, bias_old, newMeasuredAcc, newMeasuredOmega, newDeltaT, |           deltaRij_old, bias_old, newMeasuredAcc, newMeasuredOmega, newDeltaT | ||||||
|           use2ndOrderIntegration), deltaPij_old); |           ), deltaPij_old); | ||||||
|   // rotation part has to be done properly, on manifold
 |   // rotation part has to be done properly, on manifold
 | ||||||
|   df_dpos.block<3, 3>(6, 0) = numericalDerivative11<Rot3, Vector3>( |   df_dpos.block<3, 3>(0, 0) = numericalDerivative11<Rot3, Vector3>( | ||||||
|       boost::bind(&updatePreintegratedMeasurementsRot, _1, deltaVij_old, |       boost::bind(&updatePreintegratedMeasurementsRot, _1, deltaVij_old, | ||||||
|           deltaRij_old, bias_old, newMeasuredAcc, newMeasuredOmega, newDeltaT, |           deltaRij_old, bias_old, newMeasuredAcc, newMeasuredOmega, newDeltaT | ||||||
|           use2ndOrderIntegration), deltaPij_old); |           ), deltaPij_old); | ||||||
|  |   EXPECT(assert_equal(df_dpos, Factual.block<15, 3>(0, 3), 1e-5)); | ||||||
| 
 | 
 | ||||||
|   // Compute expected F wrt velocities (15,3)
 |   // Compute expected F wrt velocities (15,3)
 | ||||||
|   Matrix df_dvel = numericalDerivative11<Vector, Vector3>( |   Matrix df_dvel = numericalDerivative11<Vector, Vector3>( | ||||||
|       boost::bind(&updatePreintegratedMeasurementsTest, deltaPij_old, _1, |       boost::bind(&updatePreintegratedMeasurementsTest, deltaPij_old, _1, | ||||||
|           deltaRij_old, bias_old, newMeasuredAcc, newMeasuredOmega, newDeltaT, |           deltaRij_old, bias_old, newMeasuredAcc, newMeasuredOmega, newDeltaT | ||||||
|           use2ndOrderIntegration), deltaVij_old); |           ), deltaVij_old); | ||||||
|   // rotation part has to be done properly, on manifold
 |   // rotation part has to be done properly, on manifold
 | ||||||
|   df_dvel.block<3, 3>(6, 0) = numericalDerivative11<Rot3, Vector3>( |   df_dvel.block<3, 3>(0, 0) = numericalDerivative11<Rot3, Vector3>( | ||||||
|       boost::bind(&updatePreintegratedMeasurementsRot, deltaPij_old, _1, |       boost::bind(&updatePreintegratedMeasurementsRot, deltaPij_old, _1, | ||||||
|           deltaRij_old, bias_old, newMeasuredAcc, newMeasuredOmega, newDeltaT, |           deltaRij_old, bias_old, newMeasuredAcc, newMeasuredOmega, newDeltaT | ||||||
|           use2ndOrderIntegration), deltaVij_old); |           ), deltaVij_old); | ||||||
|  |   EXPECT(assert_equal(df_dvel, Factual.block<15, 3>(0, 6), 1e-5)); | ||||||
| 
 | 
 | ||||||
|   // Compute expected F wrt angles (15,3)
 |   // Compute expected F wrt angles (15,3)
 | ||||||
|   Matrix df_dangle = numericalDerivative11<Vector, Rot3>( |   Matrix df_dangle = numericalDerivative11<Vector, Rot3>( | ||||||
|       boost::bind(&updatePreintegratedMeasurementsTest, deltaPij_old, |       boost::bind(&updatePreintegratedMeasurementsTest, deltaPij_old, | ||||||
|           deltaVij_old, _1, bias_old, newMeasuredAcc, newMeasuredOmega, |           deltaVij_old, _1, bias_old, newMeasuredAcc, newMeasuredOmega, | ||||||
|           newDeltaT, use2ndOrderIntegration), deltaRij_old); |           newDeltaT), deltaRij_old); | ||||||
|   // rotation part has to be done properly, on manifold
 |   // rotation part has to be done properly, on manifold
 | ||||||
|   df_dangle.block<3, 3>(6, 0) = numericalDerivative11<Rot3, Rot3>( |   df_dangle.block<3, 3>(0, 0) = numericalDerivative11<Rot3, Rot3>( | ||||||
|       boost::bind(&updatePreintegratedMeasurementsRot, deltaPij_old, |       boost::bind(&updatePreintegratedMeasurementsRot, deltaPij_old, | ||||||
|           deltaVij_old, _1, bias_old, newMeasuredAcc, newMeasuredOmega, |           deltaVij_old, _1, bias_old, newMeasuredAcc, newMeasuredOmega, | ||||||
|           newDeltaT, use2ndOrderIntegration), deltaRij_old); |           newDeltaT), deltaRij_old); | ||||||
|  |   EXPECT(assert_equal(df_dangle, Factual.block<15, 3>(0, 0), 1e-5)); | ||||||
| 
 | 
 | ||||||
|   // Compute expected F wrt biases (15,6)
 |   // Compute expected F wrt biases (15,6)
 | ||||||
|   Matrix df_dbias = numericalDerivative11<Vector, imuBias::ConstantBias>( |   Matrix df_dbias = numericalDerivative11<Vector, imuBias::ConstantBias>( | ||||||
|       boost::bind(&updatePreintegratedMeasurementsTest, deltaPij_old, |       boost::bind(&updatePreintegratedMeasurementsTest, deltaPij_old, | ||||||
|           deltaVij_old, deltaRij_old, _1, newMeasuredAcc, newMeasuredOmega, |           deltaVij_old, deltaRij_old, _1, newMeasuredAcc, newMeasuredOmega, | ||||||
|           newDeltaT, use2ndOrderIntegration), bias_old); |           newDeltaT), bias_old); | ||||||
|   // rotation part has to be done properly, on manifold
 |   // rotation part has to be done properly, on manifold
 | ||||||
|   df_dbias.block<3, 6>(6, 0) = |   df_dbias.block<3, 6>(0, 0) = | ||||||
|       numericalDerivative11<Rot3, imuBias::ConstantBias>( |       numericalDerivative11<Rot3, imuBias::ConstantBias>( | ||||||
|           boost::bind(&updatePreintegratedMeasurementsRot, deltaPij_old, |           boost::bind(&updatePreintegratedMeasurementsRot, deltaPij_old, | ||||||
|               deltaVij_old, deltaRij_old, _1, newMeasuredAcc, newMeasuredOmega, |               deltaVij_old, deltaRij_old, _1, newMeasuredAcc, newMeasuredOmega, | ||||||
|               newDeltaT, use2ndOrderIntegration), bias_old); |               newDeltaT), bias_old); | ||||||
| 
 |   EXPECT(assert_equal(df_dbias, Factual.block<15, 6>(0, 9), 1e-5)); | ||||||
|   Matrix Fexpected(15, 15); |  | ||||||
|   Fexpected << df_dpos, df_dvel, df_dangle, df_dbias; |  | ||||||
|   EXPECT(assert_equal(Fexpected, Factual,1e-5)); |  | ||||||
| 
 | 
 | ||||||
|   //////////////////////////////////////////////////////////////////////////////////////////////
 |   //////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|   // COMPUTE NUMERICAL DERIVATIVES FOR G
 |   // COMPUTE NUMERICAL DERIVATIVES FOR G
 | ||||||
|  | @ -444,24 +436,24 @@ TEST( CombinedImuFactor, JacobianPreintegratedCovariancePropagation ) { | ||||||
|   // Compute expected G wrt acc noise (15,3)
 |   // Compute expected G wrt acc noise (15,3)
 | ||||||
|   Matrix df_daccNoise = numericalDerivative11<Vector, Vector3>( |   Matrix df_daccNoise = numericalDerivative11<Vector, Vector3>( | ||||||
|       boost::bind(&updatePreintegratedMeasurementsTest, deltaPij_old, |       boost::bind(&updatePreintegratedMeasurementsTest, deltaPij_old, | ||||||
|           deltaVij_old, deltaRij_old, bias_old, _1, newMeasuredOmega, newDeltaT, |           deltaVij_old, deltaRij_old, bias_old, _1, newMeasuredOmega, newDeltaT | ||||||
|           use2ndOrderIntegration), newMeasuredAcc); |           ), newMeasuredAcc); | ||||||
|   // rotation part has to be done properly, on manifold
 |   // rotation part has to be done properly, on manifold
 | ||||||
|   df_daccNoise.block<3, 3>(6, 0) = numericalDerivative11<Rot3, Vector3>( |   df_daccNoise.block<3, 3>(6, 0) = numericalDerivative11<Rot3, Vector3>( | ||||||
|       boost::bind(&updatePreintegratedMeasurementsRot, deltaPij_old, |       boost::bind(&updatePreintegratedMeasurementsRot, deltaPij_old, | ||||||
|           deltaVij_old, deltaRij_old, bias_old, _1, newMeasuredOmega, newDeltaT, |           deltaVij_old, deltaRij_old, bias_old, _1, newMeasuredOmega, newDeltaT | ||||||
|           use2ndOrderIntegration), newMeasuredAcc); |           ), newMeasuredAcc); | ||||||
| 
 | 
 | ||||||
|   // Compute expected G wrt gyro noise (15,3)
 |   // Compute expected G wrt gyro noise (15,3)
 | ||||||
|   Matrix df_domegaNoise = numericalDerivative11<Vector, Vector3>( |   Matrix df_domegaNoise = numericalDerivative11<Vector, Vector3>( | ||||||
|       boost::bind(&updatePreintegratedMeasurementsTest, deltaPij_old, |       boost::bind(&updatePreintegratedMeasurementsTest, deltaPij_old, | ||||||
|           deltaVij_old, deltaRij_old, bias_old, newMeasuredAcc, _1, newDeltaT, |           deltaVij_old, deltaRij_old, bias_old, newMeasuredAcc, _1, newDeltaT | ||||||
|           use2ndOrderIntegration), newMeasuredOmega); |           ), newMeasuredOmega); | ||||||
|   // rotation part has to be done properly, on manifold
 |   // rotation part has to be done properly, on manifold
 | ||||||
|   df_domegaNoise.block<3, 3>(6, 0) = numericalDerivative11<Rot3, Vector3>( |   df_domegaNoise.block<3, 3>(6, 0) = numericalDerivative11<Rot3, Vector3>( | ||||||
|       boost::bind(&updatePreintegratedMeasurementsRot, deltaPij_old, |       boost::bind(&updatePreintegratedMeasurementsRot, deltaPij_old, | ||||||
|           deltaVij_old, deltaRij_old, bias_old, newMeasuredAcc, _1, newDeltaT, |           deltaVij_old, deltaRij_old, bias_old, newMeasuredAcc, _1, newDeltaT | ||||||
|           use2ndOrderIntegration), newMeasuredOmega); |           ), newMeasuredOmega); | ||||||
| 
 | 
 | ||||||
|   // Compute expected G wrt bias random walk noise (15,6)
 |   // Compute expected G wrt bias random walk noise (15,6)
 | ||||||
|   Matrix df_rwBias(15, 6); // random walk on the bias does not appear in the first 9 entries
 |   Matrix df_rwBias(15, 6); // random walk on the bias does not appear in the first 9 entries
 | ||||||
|  | @ -472,13 +464,13 @@ TEST( CombinedImuFactor, JacobianPreintegratedCovariancePropagation ) { | ||||||
|   Matrix df_dinitBias = numericalDerivative11<Vector, imuBias::ConstantBias>( |   Matrix df_dinitBias = numericalDerivative11<Vector, imuBias::ConstantBias>( | ||||||
|       boost::bind(&updatePreintegratedMeasurementsTest, deltaPij_old, |       boost::bind(&updatePreintegratedMeasurementsTest, deltaPij_old, | ||||||
|           deltaVij_old, deltaRij_old, _1, newMeasuredAcc, newMeasuredOmega, |           deltaVij_old, deltaRij_old, _1, newMeasuredAcc, newMeasuredOmega, | ||||||
|           newDeltaT, use2ndOrderIntegration), bias_old); |           newDeltaT), bias_old); | ||||||
|   // rotation part has to be done properly, on manifold
 |   // rotation part has to be done properly, on manifold
 | ||||||
|   df_dinitBias.block<3, 6>(6, 0) = numericalDerivative11<Rot3, |   df_dinitBias.block<3, 6>(6, 0) = numericalDerivative11<Rot3, | ||||||
|       imuBias::ConstantBias>( |       imuBias::ConstantBias>( | ||||||
|       boost::bind(&updatePreintegratedMeasurementsRot, deltaPij_old, |       boost::bind(&updatePreintegratedMeasurementsRot, deltaPij_old, | ||||||
|           deltaVij_old, deltaRij_old, _1, newMeasuredAcc, newMeasuredOmega, |           deltaVij_old, deltaRij_old, _1, newMeasuredAcc, newMeasuredOmega, | ||||||
|           newDeltaT, use2ndOrderIntegration), bias_old); |           newDeltaT), bias_old); | ||||||
|   df_dinitBias.block<6, 6>(9, 0) = Z_6x6; // only has to influence first 9 rows
 |   df_dinitBias.block<6, 6>(9, 0) = Z_6x6; // only has to influence first 9 rows
 | ||||||
| 
 | 
 | ||||||
|   Matrix Gexpected(15, 21); |   Matrix Gexpected(15, 21); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue