13 : avg_count_(avg_count), valid_(
false), velocity_(0), dt_(dt), sum_velocity_(0) {}
15 void Update(
double position,
bool valid) {
16 if (valid && valid_) {
17 double v = (position - prev_position_) / dt_;
20 while (velocities_.size() > avg_count_) {
21 sum_velocity_ -= velocities_.front();
25 while (!velocities_.empty()) {
30 prev_position_ = position;
34 double GetVelocity() {
35 if (velocities_.empty()) {
38 return sum_velocity_ / (double)velocities_.size();
42 unsigned int avg_count_;
43 std::queue<double> velocities_;
47 double prev_position_{0.};
64 VelocityEstimator(
double initial_position,
double initial_velocity,
double position_variance,
65 double velocity_variance,
double measurement_variance)
68 SetInitialPosition(initial_position);
69 SetInitialVelocity(initial_velocity);
70 SetPositionVariance(position_variance);
71 SetVelocityVariance(velocity_variance);
72 SetMeasurementVariance(measurement_variance);
75 void SetInitialPosition(
double initial_position) { x_(0) = initial_position; }
77 void SetInitialVelocity(
double initial_velocity) { x_(1) = initial_velocity; }
79 void SetPositionVariance(
double position_variance) { Q_(0, 0) = position_variance; }
81 void SetVelocityVariance(
double velocity_variance) { Q_(1, 1) = velocity_variance; }
83 void SetMeasurementVariance(
double measurement_variance) { R_(0, 0) = measurement_variance; }
85 void Predict(
double dt) {
92 P_ = F_ * P_ * F_.transpose() + Q_;
95 void Update(
double measured_position) {
96 Eigen::Vector<double, 1> y;
97 y(0) = measured_position - H_ * x_;
99 Eigen::Matrix<double, 1, 1> S = H_ * P_ * H_.transpose() + R_;
100 Eigen::Matrix<double, 2, 1> K = P_ * H_.transpose() * S.inverse();
103 P_ = (Eigen::Matrix2d::Identity() - K * H_) * P_;
106 double GetVelocity() {
return x_(1); }
113 Eigen::Matrix<double, 1, 2> H_;
114 Eigen::Matrix<double, 1, 1> R_;