TEST(ExtendedKalmanFilterTest, validation)
  {
    ExtendedKalmanFilter ekf;

    // check validation itself (e.g. invalid sizes of vectors/matrices,
    // empty callbacks, etc.)
    EXPECT_THROW(ekf.validate(), IEstimator::estimator_error);	// "STM missing"
    ekf.setStateTransitionModel(0);
    EXPECT_THROW(ekf.validate(), IEstimator::estimator_error);	// "STM missing"
    ekf.setStateTransitionModel(f);
    ekf.setJacobianOfStateTransitionModel(0);	
    EXPECT_THROW(ekf.validate(), IEstimator::estimator_error);	// "STMJ missing"
    ekf.setJacobianOfStateTransitionModel(df);
    ekf.setObservationModel(0);
    EXPECT_THROW(ekf.validate(), IEstimator::estimator_error);	// "OM missing"
    ekf.setObservationModel(h);
    ekf.setJacobianOfObservationModel(0);
    EXPECT_THROW(ekf.validate(), IEstimator::estimator_error);	// "OMJ missing"
    ekf.setJacobianOfObservationModel(dh);

    EXPECT_THROW(ekf.validate(), IEstimator::estimator_error);	// "PNC missing"
    MatrixXd Q_f(2,1); Q_f << 0.1, 1;
    ekf.setProcessNoiseCovariance(Q_f);
    EXPECT_THROW(ekf.validate(), IEstimator::estimator_error);	// "Q not square"
    MatrixXd Q1(1,1); Q1 << 0.1;
    ekf.setProcessNoiseCovariance(Q1);
    EXPECT_THROW(ekf.validate(), IEstimator::estimator_error);	// "MNC missing"
    MatrixXd R_f(2,1); R_f << 10, 1;
    ekf.setMeasurementNoiseCovariance(R_f);
    EXPECT_THROW(ekf.validate(), IEstimator::estimator_error);	// "R not square"
    MatrixXd R(1,1); R << 10;
    ekf.setMeasurementNoiseCovariance(R);

    EXPECT_NO_THROW(ekf.validate());				// all required params given

    // optional params
    VectorXd x(2); x << 0, 1;
    ekf.setInitialState(x);
    EXPECT_NO_THROW(ekf.validate());
    EXPECT_NE(ekf.getState().size(), 2);

    MatrixXd Q(2,2); Q << 0.1, 0, 0, 0.1;
    ekf.setProcessNoiseCovariance(Q);
    EXPECT_NO_THROW(ekf.validate());
    ekf.setInitialState(x);
    EXPECT_NO_THROW(ekf.validate());
    EXPECT_EQ(ekf.getState().size(), 2);			// sizes now ok

    // size of R cannot be checked, must match number of formulas in h
    // -> check during compile time
  }
  // -----------------------------------------
  // tests
  // -----------------------------------------
  TEST(KalmanFilterTest, initializationAndValidation)
  {
    KalmanFilter kf;

    // check setting required params
    EXPECT_THROW(kf.validate(), IEstimator::estimator_error);	// "STM missing"
    MatrixXd A_f(2,1); A_f << 1, 0;
    kf.setStateTransitionModel(A_f);
    EXPECT_THROW(kf.validate(), IEstimator::estimator_error);	// "OM missing"
    MatrixXd H(1,2); H << 1,0;
    kf.setObservationModel(H);
    EXPECT_THROW(kf.validate(), IEstimator::estimator_error);	// "PNC missing"
    MatrixXd Q(2,2); Q << 0.1,0,0,0.1;
    kf.setProcessNoiseCovariance(Q);
    EXPECT_THROW(kf.validate(), IEstimator::estimator_error);	// "MNC missing"
    MatrixXd R(1,1); R << 10;
    kf.setMeasurementNoiseCovariance(R);

    EXPECT_THROW(kf.validate(), IEstimator::estimator_error);	// "STM invalid size"
    MatrixXd A(2,2); A << 1,0,0,1;
    kf.setStateTransitionModel(A);
    EXPECT_NO_THROW(kf.validate());			// all required params given

    MatrixXd R_f(2,1); R_f << 10,1;
    kf.setMeasurementNoiseCovariance(R_f);
    EXPECT_THROW(kf.validate(), IEstimator::estimator_error);	// "MNC invalid size"
    kf.setMeasurementNoiseCovariance(R);
    MatrixXd H_f(3,1); H_f << 1,0,2;
    kf.setObservationModel(H_f);
    EXPECT_THROW(kf.validate(), IEstimator::estimator_error);	// "OM invalid size"
    kf.setObservationModel(H);

    // check setting optional params
    MatrixXd B_f(1,1); B_f << 0;
    kf.setControlInputModel(B_f);
    EXPECT_THROW(kf.validate(), IEstimator::estimator_error);	// "CIM invalid size"
    MatrixXd B(2,1); B << 0,0;
    kf.setControlInputModel(B);
    EXPECT_NO_THROW(kf.validate());
    
    VectorXd x(2); x << 0,1;
    kf.setInitialState(x);
    EXPECT_NO_THROW(kf.validate());
  
    // check initialization of output
    Output out = kf.getLastEstimate();
    OutputValue defaultOutVal;
    EXPECT_GT(out.size(), 0);
    EXPECT_DOUBLE_EQ(out.getValue(), defaultOutVal.getValue());
  }
Esempio n. 3
0
//<F>              ->      - <F> | <R>
node_t* F_f() {
    node_t *p = getNode("<F>");

    if(tk.name == "-") { // -<F>
        p->child1 = getNode("-");
        tk = scanner(fp, lineNum);
        p->child2 = F_f();
        return p;
    } else if((tk.name == "(") || tk.tokenId == IDENT_tk || tk.tokenId == NUM_tk) { // <R>
        p->child1 = R_f();
        return p;
    } else {
        error("Got token " + tk.name + " expected (, ID, NUM, or - token\n");
    }

    return p;
}