rby1-sdk
Loading...
Searching...
No Matches
velocity_estimator.h
1#pragma once
2
3#include <queue>
4
5#include "Eigen/Dense"
6#include "rby1-sdk/export.h"
7
8namespace rb {
9
10class RBY1_SDK_API VelocityFilterEstimator {
11 public:
12 explicit VelocityFilterEstimator(double dt, int avg_count = 5)
13 : avg_count_(avg_count), valid_(false), velocity_(0), dt_(dt), sum_velocity_(0) {}
14
15 void Update(double position, bool valid) {
16 if (valid && valid_) {
17 double v = (position - prev_position_) / dt_;
18 velocities_.push(v);
19 sum_velocity_ += v;
20 while (velocities_.size() > avg_count_) {
21 sum_velocity_ -= velocities_.front();
22 velocities_.pop();
23 }
24 } else {
25 while (!velocities_.empty()) {
26 velocities_.pop();
27 }
28 sum_velocity_ = 0;
29 }
30 prev_position_ = position;
31 valid_ = valid;
32 }
33
34 double GetVelocity() {
35 if (velocities_.empty()) {
36 return 0.;
37 }
38 return sum_velocity_ / (double)velocities_.size();
39 }
40
41 private:
42 unsigned int avg_count_;
43 std::queue<double> velocities_;
44 double sum_velocity_;
45
46 bool valid_;
47 double prev_position_{0.};
48
49 double velocity_;
50 double dt_;
51};
52
54 public:
56 x_.setZero();
57 P_.setIdentity();
58 F_.setZero();
59 Q_.setZero();
60 H_ << 1, 0;
61 R_.setZero();
62 }
63
64 VelocityEstimator(double initial_position, double initial_velocity, double position_variance,
65 double velocity_variance, double measurement_variance)
67
68 SetInitialPosition(initial_position);
69 SetInitialVelocity(initial_velocity);
70 SetPositionVariance(position_variance);
71 SetVelocityVariance(velocity_variance);
72 SetMeasurementVariance(measurement_variance);
73 }
74
75 void SetInitialPosition(double initial_position) { x_(0) = initial_position; }
76
77 void SetInitialVelocity(double initial_velocity) { x_(1) = initial_velocity; }
78
79 void SetPositionVariance(double position_variance) { Q_(0, 0) = position_variance; }
80
81 void SetVelocityVariance(double velocity_variance) { Q_(1, 1) = velocity_variance; }
82
83 void SetMeasurementVariance(double measurement_variance) { R_(0, 0) = measurement_variance; }
84
85 void Predict(double dt) {
86 F_(0, 0) = 1;
87 F_(0, 1) = dt;
88 F_(1, 0) = 0;
89 F_(1, 1) = 1;
90
91 x_ = F_ * x_;
92 P_ = F_ * P_ * F_.transpose() + Q_;
93 }
94
95 void Update(double measured_position) {
96 Eigen::Vector<double, 1> y;
97 y(0) = measured_position - H_ * x_;
98
99 Eigen::Matrix<double, 1, 1> S = H_ * P_ * H_.transpose() + R_;
100 Eigen::Matrix<double, 2, 1> K = P_ * H_.transpose() * S.inverse();
101
102 x_ = x_ + K * y;
103 P_ = (Eigen::Matrix2d::Identity() - K * H_) * P_;
104 }
105
106 double GetVelocity() { return x_(1); }
107
108 private:
109 Eigen::Vector2d x_;
110 Eigen::Matrix2d P_;
111 Eigen::Matrix2d F_;
112 Eigen::Matrix2d Q_;
113 Eigen::Matrix<double, 1, 2> H_;
114 Eigen::Matrix<double, 1, 1> R_;
115};
116
117}; // namespace rb
Definition velocity_estimator.h:53
Definition velocity_estimator.h:10