unrotate now defined for vector
							parent
							
								
									4dbe5e68d2
								
							
						
					
					
						commit
						4c177c0ce2
					
				|  | @ -352,6 +352,12 @@ namespace gtsam { | |||
|     Point3 unrotate(const Point3& p, OptionalJacobian<3,3> H1 = boost::none, | ||||
|         OptionalJacobian<3,3> H2=boost::none) const; | ||||
| 
 | ||||
|     /// unrotate for Vector3
 | ||||
|     Vector3 unrotate(const Vector3& v, OptionalJacobian<3, 3> H1 = boost::none, | ||||
|         OptionalJacobian<3, 3> H2 = boost::none) const { | ||||
|       return unrotate(Point3(v), H1, H2).vector(); | ||||
|     } | ||||
| 
 | ||||
|     /// @}
 | ||||
|     /// @name Group Action on Unit3
 | ||||
|     /// @{
 | ||||
|  |  | |||
|  | @ -154,52 +154,33 @@ Vector9 PreintegrationBase::biasCorrectedDelta( | |||
|   return delta; | ||||
| } | ||||
| 
 | ||||
| //------------------------------------------------------------------------------
 | ||||
| static Vector3 rotate(const Matrix3& R, const Vector3& p, | ||||
|     OptionalJacobian<3, 3> H1 = boost::none, OptionalJacobian<3, 3> H2 = boost::none) { | ||||
|   if (H1) *H1 = R * skewSymmetric(-p.x(), -p.y(), -p.z()); | ||||
|   if (H2) *H2 = R; | ||||
|   return R * p; | ||||
| } | ||||
| 
 | ||||
| //------------------------------------------------------------------------------
 | ||||
| static Vector3 unrotate(const Matrix3& R, const Vector3& p, | ||||
|     OptionalJacobian<3, 3> H1 = boost::none, OptionalJacobian<3, 3> H2 = boost::none) { | ||||
|   const Matrix3 Rt = R.transpose(); | ||||
|   Vector3 q = Rt * p; | ||||
|   const double wx = q.x(), wy = q.y(), wz = q.z(); | ||||
|   if (H1) *H1 << 0.0, -wz, +wy, +wz, 0.0, -wx, -wy, +wx, 0.0; | ||||
|   if (H2) *H2 = Rt; | ||||
|   return q; | ||||
| } | ||||
| 
 | ||||
| //------------------------------------------------------------------------------
 | ||||
| Vector9 PreintegrationBase::integrateCoriolis(const NavState& state_i, | ||||
|     OptionalJacobian<9, 9> H) const { | ||||
|   Vector9 result = Vector9::Zero(); | ||||
|   if (H) H->setZero(); | ||||
|   if (p().omegaCoriolis) { | ||||
|     const Pose3& pose_i = state_i.pose(); | ||||
|     const Rot3& rot_i = state_i.attitude(); | ||||
|     const Point3& t_i = state_i.position(); | ||||
|     const Vector3& vel_i = state_i.velocity(); | ||||
|     const Matrix3 Ri = pose_i.rotation().matrix(); | ||||
|     const Vector3& t_i = state_i.position().vector(); | ||||
|     const double dt = deltaTij(), dt2 = dt * dt; | ||||
| 
 | ||||
|     const Vector3& omegaCoriolis = *p().omegaCoriolis; | ||||
|     Matrix3 D_dP_Ri; | ||||
|     NavState::dR(result) -= unrotate(Ri, omegaCoriolis * dt, H ? &D_dP_Ri : 0); | ||||
|     NavState::dP(result) -= omegaCoriolis.cross(vel_i) * dt2; // NOTE(luca): we got rid of the 2 wrt INS paper
 | ||||
|     NavState::dV(result) -= 2.0 * omegaCoriolis.cross(vel_i) * dt; | ||||
|     NavState::dR(result) -= rot_i.unrotate(omegaCoriolis * dt, H ? &D_dP_Ri : 0); | ||||
|     NavState::dP(result) -= (dt2 * omegaCoriolis.cross(vel_i)); // NOTE(luca): we got rid of the 2 wrt INS paper
 | ||||
|     NavState::dV(result) -= ((2.0 * dt) * omegaCoriolis.cross(vel_i)); | ||||
|     if (p().use2ndOrderCoriolis) { | ||||
|       Vector3 temp = omegaCoriolis.cross(omegaCoriolis.cross(t_i)); | ||||
|       Vector3 temp = omegaCoriolis.cross(omegaCoriolis.cross(t_i.vector())); | ||||
|       NavState::dP(result) -= 0.5 * temp * dt2; | ||||
|       NavState::dV(result) -= temp * dt; | ||||
|     } | ||||
|     if (H) { | ||||
|       // Matrix3 Ri = rot_i.matrix();
 | ||||
|       const Matrix3 omegaCoriolisHat = skewSymmetric(omegaCoriolis); | ||||
|       H->block<3,3>(0,0) -= D_dP_Ri; | ||||
|       H->block<3,3>(3,6) -= omegaCoriolisHat * dt2; | ||||
|       H->block<3,3>(6,6) -= 2.0 * omegaCoriolisHat * dt; | ||||
|       H->block<3,3>(6,6) -= (2.0 * dt) * omegaCoriolisHat; | ||||
|       if (p().use2ndOrderCoriolis) { | ||||
|         const Matrix3 omegaCoriolisHat2 = omegaCoriolisHat * omegaCoriolisHat; | ||||
|         H->block<3,3>(3,3) -= 0.5 * omegaCoriolisHat2 * dt2; | ||||
|  | @ -215,17 +196,16 @@ Vector9 PreintegrationBase::recombinedPrediction(const NavState& state_i, | |||
|     const Vector9& biasCorrectedDelta, OptionalJacobian<9, 9> H1, | ||||
|     OptionalJacobian<9, 9> H2) const { | ||||
| 
 | ||||
|   const Pose3& pose_i = state_i.pose(); | ||||
|   const Rot3& rot_i = state_i.attitude(); | ||||
|   const Vector3& vel_i = state_i.velocity(); | ||||
|   const Matrix3 Ri = pose_i.rotation().matrix(); | ||||
|   const double dt = deltaTij(), dt2 = dt * dt; | ||||
| 
 | ||||
|   // Rotation, position, and velocity:
 | ||||
|   Vector9 delta; | ||||
|   Matrix3 D_dP_Ri, D_dP_bc, D_dV_Ri, D_dV_bc; | ||||
|   NavState::dR(delta) = NavState::dR(biasCorrectedDelta); | ||||
|   NavState::dP(delta) = rotate(Ri, NavState::dP(biasCorrectedDelta), D_dP_Ri, D_dP_bc) + vel_i * dt + 0.5 * p().gravity * dt2; | ||||
|   NavState::dV(delta) = rotate(Ri, NavState::dV(biasCorrectedDelta), D_dV_Ri, D_dV_bc) + p().gravity * dt; | ||||
|   NavState::dP(delta) = rot_i.rotate(NavState::dP(biasCorrectedDelta), D_dP_Ri, D_dP_bc) + vel_i * dt + 0.5 * p().gravity * dt2; | ||||
|   NavState::dV(delta) = rot_i.rotate(NavState::dV(biasCorrectedDelta), D_dV_Ri, D_dV_bc) + p().gravity * dt; | ||||
| 
 | ||||
|   Matrix9 Hcoriolis; | ||||
|   if (p().omegaCoriolis) { | ||||
|  | @ -240,6 +220,7 @@ Vector9 PreintegrationBase::recombinedPrediction(const NavState& state_i, | |||
|   } | ||||
|   if (H2) { | ||||
|     H2->setZero(); | ||||
|     Matrix3 Ri = rot_i.matrix(); | ||||
|     H2->block<3,3>(0,0) = I_3x3; | ||||
|     H2->block<3,3>(3,3) = Ri; | ||||
|     H2->block<3,3>(6,6) = Ri; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue