CalcUpdate Calculates the update for an individual sensor definition. 
  171  {
  172    
  173    GpsVelMeasurementType* meas = static_cast<GpsVelMeasurementType*>(measurement.get());
  175 
  176    
  178    Eigen::Vector3d v_meas = meas->velocity_;
  179 
  180    
  181    GpsVelSensorStateType prior_sensor_state(prior_sensor_data->state_);
  182 
  183    
  184    
  185    Eigen::MatrixXd R_meas_dyn;
  187    {
  188      meas->get_meas_noise(&R_meas_dyn);
  189    }
  190    else
  191    {
  192      R_meas_dyn = this->
R_.asDiagonal();
 
  193    }
  194    Eigen::MatrixXd R_meas(R_meas_dyn);
  195 
  197    const int size_of_sensor_state = prior_sensor_state.cov_size_;
  198    const int size_of_full_error_state = size_of_core_state + size_of_sensor_state;
  199    const Eigen::MatrixXd P = prior_cov;
  200    assert(P.size() == size_of_full_error_state * size_of_full_error_state);
  201 
  202    
  203    const Eigen::Matrix3d I_3 = Eigen::Matrix3d::Identity();
  204    const Eigen::Matrix3d O_3 = Eigen::Matrix3d::Zero();
  205 
  206    const Eigen::Vector3d omega_i = prior_core_state.w_m_;  
  207 
  208    const Eigen::Vector3d P_wi = prior_core_state.p_wi_;
  209    const Eigen::Vector3d V_wi = prior_core_state.v_wi_;
  210    const Eigen::Vector3d b_w = prior_core_state.b_w_;
  211    const Eigen::Matrix3d R_wi = prior_core_state.q_wi_.toRotationMatrix();
  212    const Eigen::Vector3d P_ig = prior_sensor_state.p_ig_;
  213 
  214    const Eigen::Vector3d P_gw_w = prior_sensor_state.p_gw_w_;
  215    const Eigen::Matrix3d R_gw_w = prior_sensor_state.q_gw_w_.toRotationMatrix();
  216 
  217    
  218    const Eigen::Matrix3d Hp_pwi = R_gw_w;
  219    const Eigen::Matrix3d Hp_vwi = O_3;
  220    const Eigen::Matrix3d Hp_rwi = -R_gw_w * R_wi * 
Utils::Skew(P_ig);
 
  221    const Eigen::Matrix3d Hp_bw = O_3;
  222    const Eigen::Matrix3d Hp_ba = O_3;
  223 
  224    const Eigen::Matrix3d Hp_pig = R_gw_w * R_wi;
  225    const Eigen::Matrix3d Hp_pgw_w = O_3;
  226    const Eigen::Matrix3d Hp_rgw_w = O_3;
  227 
  228    const int num_states = static_cast<int>(Hp_pwi.cols() + Hp_vwi.cols() + Hp_rwi.cols() + Hp_bw.cols() +
  229                                            Hp_ba.cols() + Hp_pig.cols() + Hp_pgw_w.cols() + Hp_rgw_w.cols());
  230 
  231    
  232    Eigen::MatrixXd H_p(3, num_states);
  233    H_p << Hp_pwi, Hp_vwi, Hp_rwi, Hp_bw, Hp_ba, Hp_pig, Hp_pgw_w, Hp_rgw_w;
  234 
  235    
  236    Eigen::MatrixXd H_v(3, num_states);
  237    Eigen::Vector3d v_est;
  238 
  240    {
  241      
  242      const Eigen::Vector3d mu = V_wi + R_wi * 
Utils::Skew(omega_i - b_w) * P_ig;
 
  243      const Eigen::Vector3d d_mu = mu / mu.norm();
  245 
  246      const Eigen::Matrix3d Hv_pwi = O_3;
  247      const Eigen::Matrix3d Hv_vwi = R_wi * alpha * d_mu.transpose();
  248      const Eigen::Matrix3d Hv_rwi =
  251 
  252      const Eigen::Matrix3d Hv_bw = O_3;
  253      const Eigen::Matrix3d Hv_ba = O_3;
  254 
  255      const Eigen::Matrix3d Hv_pig = R_wi * alpha * d_mu.transpose() * R_wi * 
Utils::Skew(omega_i - b_w);
 
  256      const Eigen::Matrix3d Hv_pgw_w = O_3;
  257      const Eigen::Matrix3d Hv_rgw_w = O_3;
  258 
  259      H_v << Hv_pwi, Hv_vwi, Hv_rwi, Hv_bw, Hv_ba, Hv_pig, Hv_pgw_w, Hv_rgw_w;
  260      v_est = R_wi * alpha * (mu).norm();
  261    }
  262    else
  263    {
  264      const Eigen::Matrix3d Hv_pwi = O_3;
  265      const Eigen::Matrix3d Hv_vwi = I_3;
  267      const Eigen::Matrix3d Hv_bw = O_3;
  268      const Eigen::Matrix3d Hv_ba = O_3;
  269 
  270      const Eigen::Matrix3d Hv_pig = R_wi * 
Utils::Skew(omega_i - b_w);
 
  271      const Eigen::Matrix3d Hv_pgw_w = O_3;
  272      const Eigen::Matrix3d Hv_rgw_w = O_3;
  273 
  274      H_v << Hv_pwi, Hv_vwi, Hv_rwi, Hv_bw, Hv_ba, Hv_pig, Hv_pgw_w, Hv_rgw_w;
  275      v_est = V_wi + R_wi * 
Utils::Skew(omega_i - b_w) * P_ig;
 
  276    }
  277 
  278    
  279    Eigen::MatrixXd H(H_p.rows() + H_v.rows(), H_v.cols());
  280    H << H_p, H_v;
  281 
  282    
  283    
  284    const Eigen::Vector3d p_est = P_gw_w + R_gw_w * (P_wi + R_wi * P_ig);
  285    const Eigen::Vector3d res_p = p_meas - p_est;
  286 
  287    
  288    const Eigen::Vector3d res_v = v_meas - v_est;
  289 
  290    
  291    residual_ = Eigen::MatrixXd(res_p.rows() + res_v.rows(), 1);
 
  293 
  294    
  296    const Eigen::MatrixXd correction = ekf.CalculateCorrection(&
chi2_);
 
  297    assert(correction.size() == size_of_full_error_state * 1);
  298 
  299    
  301    {
  303      return false;
  304    }
  305 
  306    Eigen::MatrixXd P_updated = ekf.CalculateCovUpdate();
  307    assert(P_updated.size() == size_of_full_error_state * size_of_full_error_state);
  309 
  310    
  313 
  314    
  315    const Eigen::MatrixXd sensor_correction = correction.block(size_of_core_state, 0, size_of_sensor_state, 1);
  316    const GpsVelSensorStateType corrected_sensor_state = 
ApplyCorrection(prior_sensor_state, sensor_correction);
 
  317 
  318    
  319    
  320    CoreType core_data;
  322    core_data.state_ = corrected_core_state;
  323 
  324    
  325    std::shared_ptr<GpsVelSensorData> sensor_data(std::make_shared<GpsVelSensorData>());
  326    sensor_data->set_cov(P_updated);
  327    sensor_data->state_ = corrected_sensor_state;
  328 
  329    BufferDataType state_entry(std::make_shared<CoreType>(core_data), sensor_data);
  330 
  332    {
  333      
  334    }
  335    else
  336    {
  337      
  338    }
  339 
  340    *new_state_data = state_entry;
  341 
  342    return true;
  343  }
bool passed_
Determine if the test is performed or not.
Definition ekf.h:84
 
bool do_test_
Upper critival value.
Definition ekf.h:83
 
void PrintReport(const std::string &name)
PrintReport Print a formated report e.g. if the test did not pass.
 
static constexpr int size_error_
Definition core_state_type.h:38
 
static CoreStateType ApplyCorrection(CoreStateType state_prior, Eigen::Matrix< double, CoreStateType::size_error_, 1 > correction)
ApplyCorrection.
Definition core_state_type.h:46
 
Eigen::Matrix< double, 3, 1 > get_enu(mars::GpsCoordinates coordinates)
get_enu get current GPS reference coordinates
 
GpsVelSensorStateType ApplyCorrection(const GpsVelSensorStateType &prior_sensor_state, const Eigen::MatrixXd &correction)
Definition gps_w_vel_sensor_class.h:345
 
bool use_dynamic_meas_noise_
True if dynamic noise values from measurements should be used.
Definition sensor_abs_class.h:29
 
Eigen::VectorXd R_
Measurement noise "squared".
Definition update_sensor_abs_class.h:32
 
Eigen::MatrixXd residual_
Definition update_sensor_abs_class.h:31
 
static Eigen::MatrixXd EnforceMatrixSymmetry(const Eigen::Ref< const Eigen::MatrixXd > &mat_in)
EnforceMatrixSymmetry.
 
static Eigen::Matrix3d Skew(const Eigen::Vector3d &v)
skew generate the skew symmetric matrix of v
 
Eigen::Matrix< double, CoreStateType::size_error_, 1 > CoreStateVector
Definition core_state_type.h:135