illmatic_scheduling/
pid.rs1pub struct PidController {
2 pub(crate) set_point: f32,
3 sum: f32,
4 prev: Option<f32>,
5 p_gain: f32,
6 i_gain: f32,
7 d_gain: f32,
8}
9
10impl PidController {
11 pub fn new(p_gain: f32, i_gain: f32, d_gain: f32, set_point: f32) -> Self {
12 Self {
13 set_point,
14 sum: 0.0,
15 prev: None,
16 p_gain,
17 i_gain,
18 d_gain,
19 }
20 }
21 pub fn next(&mut self, observed: f32) -> f32 {
22 let input = self.set_point - observed;
23 let diff: f32;
24 if let Some(prev) = self.prev {
25 diff = input - prev;
26 self.sum += (prev + input) / 2.0;
27 } else {
28 diff = 0.0;
29 self.sum += input;
30 }
31
32 let p = input * self.p_gain;
33 let i = self.sum * self.i_gain;
34 let d = diff * self.d_gain;
35
36 self.prev = Some(input);
37 p + i + d
38 }
39 pub fn p_gain(&self) -> f32 {
40 self.p_gain
41 }
42 pub fn change_p_gain(&mut self, p_gain: f32) {
43 self.p_gain = p_gain;
44 }
45 pub fn i_gain(&self) -> f32 {
46 self.p_gain
47 }
48 pub fn change_i_gain(&mut self, i_gain: f32) {
49 self.i_gain = i_gain;
50 }
51 pub fn d_gain(&self) -> f32 {
52 self.d_gain
53 }
54 pub fn change_d_gain(&mut self, d_gain: f32) {
55 self.d_gain = d_gain;
56 }
57 pub fn inspect_sum(&self) -> f32 {
58 self.sum
59 }
60}