add PoseVelocityBias struct to be returned by Predict function
							parent
							
								
									4ee5674b2e
								
							
						
					
					
						commit
						b6ab7a4dfa
					
				| 
						 | 
				
			
			@ -29,6 +29,21 @@
 | 
			
		|||
 | 
			
		||||
namespace gtsam {
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Struct to hold all state variables of CombinedImuFactor
 | 
			
		||||
   * returned by predict function
 | 
			
		||||
   */
 | 
			
		||||
  struct PoseVelocityBias {
 | 
			
		||||
    Pose3 pose;
 | 
			
		||||
    Vector3 velocity;
 | 
			
		||||
    imuBias::ConstantBias bias;
 | 
			
		||||
 | 
			
		||||
    PoseVelocityBias(const Pose3& _pose, const Vector3& _velocity,
 | 
			
		||||
        const imuBias::ConstantBias _bias) :
 | 
			
		||||
        pose(_pose), velocity(_velocity), bias(_bias) {
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * 
 | 
			
		||||
   * @addtogroup SLAM
 | 
			
		||||
| 
						 | 
				
			
			@ -107,7 +122,8 @@ namespace gtsam {
 | 
			
		|||
      biasHat_(imuBias::ConstantBias()), measurementCovariance_(21,21), deltaPij_(Vector3::Zero()), deltaVij_(Vector3::Zero()), deltaTij_(0.0),
 | 
			
		||||
      delPdelBiasAcc(Matrix3::Zero()), delPdelBiasOmega(Matrix3::Zero()),
 | 
			
		||||
      delVdelBiasAcc(Matrix3::Zero()), delVdelBiasOmega(Matrix3::Zero()),
 | 
			
		||||
      delRdelBiasOmega(Matrix3::Zero()), PreintMeasCov(Matrix::Zero(15,15))
 | 
			
		||||
      delRdelBiasOmega(Matrix3::Zero()), PreintMeasCov(Matrix::Zero(15,15)),
 | 
			
		||||
      use2ndOrderIntegration_(false) ///< Controls the order of integration
 | 
			
		||||
      {
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -642,8 +658,8 @@ namespace gtsam {
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
    /** predicted states from IMU */
 | 
			
		||||
    static void Predict(const Pose3& pose_i, const Vector3& vel_i, Pose3& pose_j, Vector3& vel_j,
 | 
			
		||||
        const imuBias::ConstantBias& bias_i, imuBias::ConstantBias& bias_j,
 | 
			
		||||
    static PoseVelocityBias Predict(const Pose3& pose_i, const Vector3& vel_i,
 | 
			
		||||
        const imuBias::ConstantBias& bias_i,
 | 
			
		||||
        const CombinedPreintegratedMeasurements& preintegratedMeasurements,
 | 
			
		||||
        const Vector3& gravity, const Vector3& omegaCoriolis, boost::optional<const Pose3&> body_P_sensor = boost::none,
 | 
			
		||||
        const bool use2ndOrderCoriolis = false)
 | 
			
		||||
| 
						 | 
				
			
			@ -658,18 +674,18 @@ namespace gtsam {
 | 
			
		|||
 | 
			
		||||
      // Predict state at time j
 | 
			
		||||
      /* ---------------------------------------------------------------------------------------------------- */
 | 
			
		||||
       Vector3 pos_j =  pos_i + Rot_i.matrix() * (preintegratedMeasurements.deltaPij_
 | 
			
		||||
      + preintegratedMeasurements.delPdelBiasAcc * biasAccIncr
 | 
			
		||||
      + preintegratedMeasurements.delPdelBiasOmega * biasOmegaIncr)
 | 
			
		||||
      + vel_i * deltaTij
 | 
			
		||||
      - skewSymmetric(omegaCoriolis) * vel_i * deltaTij*deltaTij  // Coriolis term - we got rid of the 2 wrt ins paper
 | 
			
		||||
      + 0.5 * gravity * deltaTij*deltaTij;
 | 
			
		||||
      Vector3 pos_j =  pos_i + Rot_i.matrix() * (preintegratedMeasurements.deltaPij_
 | 
			
		||||
          + preintegratedMeasurements.delPdelBiasAcc * biasAccIncr
 | 
			
		||||
          + preintegratedMeasurements.delPdelBiasOmega * biasOmegaIncr)
 | 
			
		||||
          + vel_i * deltaTij
 | 
			
		||||
          - skewSymmetric(omegaCoriolis) * vel_i * deltaTij*deltaTij  // Coriolis term - we got rid of the 2 wrt ins paper
 | 
			
		||||
          + 0.5 * gravity * deltaTij*deltaTij;
 | 
			
		||||
 | 
			
		||||
    vel_j = Vector3(vel_i + Rot_i.matrix() * (preintegratedMeasurements.deltaVij_
 | 
			
		||||
      + preintegratedMeasurements.delVdelBiasAcc * biasAccIncr
 | 
			
		||||
      + preintegratedMeasurements.delVdelBiasOmega * biasOmegaIncr)
 | 
			
		||||
      - 2 * skewSymmetric(omegaCoriolis) * vel_i * deltaTij  // Coriolis term
 | 
			
		||||
      + gravity * deltaTij);
 | 
			
		||||
      Vector3 vel_j = Vector3(vel_i + Rot_i.matrix() * (preintegratedMeasurements.deltaVij_
 | 
			
		||||
          + preintegratedMeasurements.delVdelBiasAcc * biasAccIncr
 | 
			
		||||
          + preintegratedMeasurements.delVdelBiasOmega * biasOmegaIncr)
 | 
			
		||||
          - 2 * skewSymmetric(omegaCoriolis) * vel_i * deltaTij  // Coriolis term
 | 
			
		||||
          + gravity * deltaTij);
 | 
			
		||||
 | 
			
		||||
      if(use2ndOrderCoriolis){
 | 
			
		||||
        pos_j += - 0.5 * skewSymmetric(omegaCoriolis) * skewSymmetric(omegaCoriolis) * pos_i * deltaTij*deltaTij;  // 2nd order coriolis term for position
 | 
			
		||||
| 
						 | 
				
			
			@ -685,64 +701,9 @@ namespace gtsam {
 | 
			
		|||
          Rot3::Expmap( theta_biascorrected_corioliscorrected );
 | 
			
		||||
      const Rot3 Rot_j = Rot_i.compose( deltaRij_biascorrected_corioliscorrected  );
 | 
			
		||||
 | 
			
		||||
      pose_j = Pose3( Rot_j, Point3(pos_j) );
 | 
			
		||||
      Pose3 pose_j = Pose3( Rot_j, Point3(pos_j) );
 | 
			
		||||
 | 
			
		||||
      bias_j = bias_i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    static Pose3 predictPose(const Pose3& pose_i, const LieVector& vel_i,
 | 
			
		||||
            const imuBias::ConstantBias& bias_i,
 | 
			
		||||
            const CombinedPreintegratedMeasurements& preintegratedMeasurements,
 | 
			
		||||
            const Vector3& gravity, const Vector3& omegaCoriolis, boost::optional<const Pose3&> body_P_sensor = boost::none,
 | 
			
		||||
            const bool use2ndOrderCoriolis = false) {
 | 
			
		||||
      Pose3 pose_j = Pose3();
 | 
			
		||||
      LieVector vel_j = LieVector();
 | 
			
		||||
      imuBias::ConstantBias bias_j = imuBias::ConstantBias();
 | 
			
		||||
 | 
			
		||||
      predict(pose_i, vel_i, pose_j, vel_j,
 | 
			
		||||
              bias_i, bias_j,
 | 
			
		||||
              preintegratedMeasurements,
 | 
			
		||||
              gravity, omegaCoriolis, body_P_sensor,
 | 
			
		||||
              use2ndOrderCoriolis);
 | 
			
		||||
 | 
			
		||||
      return pose_j;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static LieVector predictVelocity(const Pose3& pose_i, const LieVector& vel_i,
 | 
			
		||||
            const imuBias::ConstantBias& bias_i,
 | 
			
		||||
            const CombinedPreintegratedMeasurements& preintegratedMeasurements,
 | 
			
		||||
            const Vector3& gravity, const Vector3& omegaCoriolis, boost::optional<const Pose3&> body_P_sensor = boost::none,
 | 
			
		||||
            const bool use2ndOrderCoriolis = false) {
 | 
			
		||||
      Pose3 pose_j = Pose3();
 | 
			
		||||
      LieVector vel_j = LieVector();
 | 
			
		||||
      imuBias::ConstantBias bias_j = imuBias::ConstantBias();
 | 
			
		||||
 | 
			
		||||
      predict(pose_i, vel_i, pose_j, vel_j,
 | 
			
		||||
              bias_i, bias_j,
 | 
			
		||||
              preintegratedMeasurements,
 | 
			
		||||
              gravity, omegaCoriolis, body_P_sensor,
 | 
			
		||||
              use2ndOrderCoriolis);
 | 
			
		||||
 | 
			
		||||
      return vel_j;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static imuBias::ConstantBias predictImuBias(const Pose3& pose_i, const LieVector& vel_i,
 | 
			
		||||
            const imuBias::ConstantBias& bias_i,
 | 
			
		||||
            const CombinedPreintegratedMeasurements& preintegratedMeasurements,
 | 
			
		||||
            const Vector3& gravity, const Vector3& omegaCoriolis, boost::optional<const Pose3&> body_P_sensor = boost::none,
 | 
			
		||||
            const bool use2ndOrderCoriolis = false) {
 | 
			
		||||
      Pose3 pose_j = Pose3();
 | 
			
		||||
      LieVector vel_j = LieVector();
 | 
			
		||||
      imuBias::ConstantBias bias_j = imuBias::ConstantBias();
 | 
			
		||||
 | 
			
		||||
      predict(pose_i, vel_i, pose_j, vel_j,
 | 
			
		||||
              bias_i, bias_j,
 | 
			
		||||
              preintegratedMeasurements,
 | 
			
		||||
              gravity, omegaCoriolis, body_P_sensor,
 | 
			
		||||
              use2ndOrderCoriolis);
 | 
			
		||||
 | 
			
		||||
      return bias_j;
 | 
			
		||||
      return PoseVelocityBias(pose_j, vel_j, bias_i);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue