@@ -49,18 +49,18 @@ A generic Kalman filter.
49
49
50
50
` main.cpp `
51
51
``` cpp
52
- using kalman = fcarouge::kalman<float >;
52
+ using kalman = fcarouge::kalman<double >;
53
53
54
- kalman k;
54
+ kalman k;
55
55
56
- k.state = kalman::state_x { 60 };
57
- k.estimate_uncertainty = kalman::estimate_uncertainty_p{ 225 };
58
- k.transition_observation = [ ] ( ) { return kalman::observation_h { 1 }; };
59
- k.noise_observation = [ ] ( ) {
60
- return kalman::measurement_uncertainty_r{ 25 };
61
- };
56
+ k.state_x = kalman::state { 60 };
57
+ k.estimate_uncertainty_p = kalman::estimate_uncertainty{ 15 * 15 };
58
+ k.transition_observation_h = [ ] ( ) { return kalman::observation { 1 }; };
59
+ k.noise_observation_r = [ ] ( ) {
60
+ return kalman::measurement_uncertainty{ 5 * 5 };
61
+ };
62
62
63
- k.update(48.54);
63
+ k.update(48.54 );
64
64
```
65
65
66
66
### Multi-Dimensional
@@ -69,31 +69,48 @@ Two states, one control, using Eigen3 support.
69
69
70
70
` main.cpp `
71
71
``` cpp
72
- using kalman = fcarouge::eigen::kalman<double, 2, 1, 1>;
73
-
74
- kalman k;
75
-
76
- k.state = kalman::state_x{ 0, 0 };
77
- k.estimate_uncertainty =
78
- kalman::estimate_uncertainty_p{ { 500, 0 }, { 0, 500 } };
79
- k.transition_state = []() {
80
- return kalman::state_transition_f{ { 1, 0.25 }, { 0, 1 } };
81
- };
82
- k.noise_process = []() {
83
- return kalman::process_noise_uncertainty_q{ { 0.000009765625, 0.000078125 },
84
- { 0.000078125, 0.000625 } };
72
+ using kalman =
73
+ fcarouge::eigen::kalman<double , 2 , 1 , 1 , std::chrono::milliseconds>;
74
+
75
+ const double gravitational_acceleration{ -9.8 }; // m.s^-2
76
+ const std::chrono::milliseconds delta_time{ 250 };
77
+ kalman k;
78
+
79
+ k.state_x = kalman::state{ 0, 0 };
80
+ k.estimate_uncertainty_p =
81
+ kalman::estimate_uncertainty{ { 500, 0 }, { 0, 500 } };
82
+ k.transition_state_f = [ ] (const std::chrono::milliseconds &delta_time) {
83
+ const auto dt{ std::chrono::duration<double >(delta_time).count() };
84
+ return kalman::state_transition{ { 1, dt }, { 0, 1 } };
85
+ };
86
+ k.noise_process_q = [](const std::chrono::milliseconds &delta_time) {
87
+ const auto dt{ std::chrono::duration<double >(delta_time).count() };
88
+ return kalman::process_noise_uncertainty{
89
+ { 0.1 * 0.1 * dt * dt * dt * dt / 4, 0.1 * 0.1 * dt * dt * dt / 2 },
90
+ { 0.1 * 0.1 * dt * dt * dt / 2, 0.1 * 0.1 * dt * dt }
85
91
};
86
- k.transition_observation = []() { return kalman::observation_h{ { 1, 0 } }; };
87
- k.noise_observation = []() {
88
- return kalman::measurement_uncertainty_r{ 400 };
89
- };
90
- k.transition_control = []() { return kalman::control_g{ 0.0313, 0.25 }; };
92
+ };
93
+ k.transition_control_g = [](const std::chrono::milliseconds &delta_time) {
94
+ const auto dt{ std::chrono::duration<double >(delta_time).count() };
95
+ return kalman::control{ 0.0313, dt };
96
+ };
97
+ k.transition_observation_h = []() { return kalman::observation{ { 1, 0 } }; };
98
+ k.noise_observation_r = [ ] ( ) {
99
+ return kalman::measurement_uncertainty{ 400 };
100
+ };
101
+
102
+ k.predict(kalman::input{ gravitational_acceleration }, delta_time);
103
+ k.update(kalman::output{ -32.40 });
104
+ k.predict(kalman::input{ 39.72 }, delta_time);
105
+ k.update(kalman::output{ -11.1 });
106
+ ```
91
107
92
- k.predict(kalman::input_u{ -9.8 });
93
- k.update(kalman::output_z{ -32.4 });
108
+ # Resources
94
109
110
+ Awesome resources to learn about Kalman filters:
95
111
96
- ```
112
+ - [KalmanFilter.NET](https://www.kalmanfilter.net) by Alex Becker.
113
+ - [Kalman and Bayesian Filters in Python](https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python) by Roger Labbe.
97
114
98
115
# License
99
116
0 commit comments