forked from udacity/CarND-Extended-Kalman-Filter-Project
-
Notifications
You must be signed in to change notification settings - Fork 1
/
FusionEKF.cpp
141 lines (113 loc) · 3.98 KB
/
FusionEKF.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include "FusionEKF.h"
#include "tools.h"
#include "Eigen/Dense"
#include <iostream>
using namespace std;
using Eigen::MatrixXd;
using Eigen::VectorXd;
using std::vector;
/*
* Constructor.
*/
FusionEKF::FusionEKF() {
is_initialized_ = false;
previous_timestamp_ = 0;
// initializing matrices
R_laser_ = MatrixXd(2, 2);
R_radar_ = MatrixXd(3, 3);
H_laser_ = MatrixXd(2, 4);
Hj_ = MatrixXd(3, 4);
//measurement covariance matrix - laser
R_laser_ << 0.0225, 0,
0, 0.0225;
//measurement covariance matrix - radar
R_radar_ << 0.09, 0, 0,
0, 0.0009, 0,
0, 0, 0.09;
// initialize Kalman filter
ekf_ = KalmanFilter();
// state covariance matrix P
ekf_.P_ = MatrixXd(4, 4);
ekf_.P_ << 1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1000, 0,
0, 0, 0, 1000;
// laser measurement matrix
H_laser_ = MatrixXd(2, 4);
H_laser_ << 1, 0, 0, 0,
0, 1, 0, 0;
// set up noise and state transition matrices
ekf_.Q_ = MatrixXd(4, 4);
ekf_.F_ = MatrixXd(4, 4);
}
/**
* Destructor.
*/
FusionEKF::~FusionEKF() {
}
void FusionEKF::ProcessMeasurement(const MeasurementPackage &measurement_pack) {
/*****************************************************************************
* Initialization
****************************************************************************/
if (!is_initialized_) {
// Initialize the state ekf_.x_ with the first measurement.
ekf_.x_ = VectorXd(4);
if (measurement_pack.sensor_type_ == MeasurementPackage::RADAR) {
// measurement covariance matrix for radar
float ro = measurement_pack.raw_measurements_(0);
float phi = measurement_pack.raw_measurements_(1);
float ro_dot = measurement_pack.raw_measurements_(2);
ekf_.x_ << ro * cos(phi), ro * sin(phi), ro_dot * cos(phi), ro_dot * sin(phi);
ekf_.R_ = R_radar_;
} else {
// measurement covariance matrix for laser
ekf_.x_ << measurement_pack.raw_measurements_[0], measurement_pack.raw_measurements_[1], 0, 0;
ekf_.R_ = R_laser_;
}
previous_timestamp_ = measurement_pack.timestamp_;
// done initializing, no need to predict or update
is_initialized_ = true;
return;
}
/*****************************************************************************
* Prediction
****************************************************************************/
// Update the state transition matrix F according to the new elapsed time.
float timeDelta = (measurement_pack.timestamp_ - previous_timestamp_)
/ 1000000.0; //dt - expressed in seconds
previous_timestamp_ = measurement_pack.timestamp_;
ekf_.F_ << 1, 0, timeDelta, 0,
0, 1, 0, timeDelta,
0, 0, 1, 0,
0, 0, 0, 1;
// Update the process noise covariance matrix.
float timeDelta2 = pow(timeDelta, 2);
float timeDelta3 = pow(timeDelta, 3);
float timeDelta4 = pow(timeDelta, 4);
// Use noise_ax = 9 and noise_ay = 9 for your Q matrix.
float noise_ax = 9;
float noise_ay = 9;
ekf_.Q_ << timeDelta4 * noise_ax / 4, 0, timeDelta3 * noise_ax / 2, 0, 0,
timeDelta4 * noise_ay / 4, 0, timeDelta3 * noise_ay / 2,
timeDelta3 * noise_ax / 2, 0, timeDelta2 * noise_ax, 0,
0, timeDelta3 * noise_ay / 2, 0, timeDelta2 * noise_ay;
ekf_.Predict();
/*****************************************************************************
* Update
****************************************************************************/
if (measurement_pack.sensor_type_ == MeasurementPackage::RADAR) {
// Radar updates
// measurement covariance matrix and Jacobian
ekf_.R_ = R_radar_;
ekf_.H_ = Tools().CalculateJacobian(ekf_.x_);
// update location
ekf_.UpdateEKF(measurement_pack.raw_measurements_);
} else {
// Laser updates
// measurement covariance matrix and H matrix
ekf_.R_ = R_laser_;
ekf_.H_ = H_laser_;
// update location
ekf_.Update(measurement_pack.raw_measurements_);
}
}