use core::time::Duration;
#[derive(Debug, Clone, Copy)]
pub struct PidController {
pub kp: f32,
pub ki: f32,
pub kd: f32,
last_time: pros_core::time::Instant,
last_position: f32,
i: f32,
}
impl PidController {
pub fn new(kp: f32, ki: f32, kd: f32) -> Self {
Self {
kp,
ki,
kd,
last_time: pros_core::time::Instant::now(),
last_position: 0.0,
i: 0.0,
}
}
pub fn update(&mut self, setpoint: f32, position: f32) -> f32 {
let mut delta_time = self.last_time.elapsed();
if delta_time.is_zero() {
delta_time += Duration::from_micros(1);
}
let error = setpoint - position;
self.i += error * delta_time.as_secs_f32();
let p = self.kp * error;
let i = self.ki * self.i;
let mut d = (position - self.last_position) / delta_time.as_secs_f32();
if d.is_nan() {
d = 0.0
}
let output = p + i + d;
self.last_position = position;
self.last_time = pros_core::time::Instant::now();
output
}
}