#![allow(unused)]
use pidsk_controller::{PidControllerf32, PidGainsf32};
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct XyPositionDualRingPid {
position_pid: PidControllerf32,
speed_pid: PidControllerf32,
max_speed_setpoint_mps: f32,
}
impl Default for XyPositionDualRingPid {
fn default() -> Self {
Self::new()
}
}
impl XyPositionDualRingPid {
pub const fn new() -> Self {
Self {
position_pid: PidControllerf32::new(1.0),
speed_pid: PidControllerf32::with_gains(PidGainsf32 { kp: 0.15, ki: 0.02, kd: 0.01, kk: 0.0, ks: 0.0 }),
max_speed_setpoint_mps: 100.0,
}
}
pub fn set_setpoint(&mut self, position_setpoint: f32) {
self.position_pid.set_setpoint(position_setpoint);
}
pub fn update(&mut self, current_position: f32, current_velocity: f32, delta_t: f32) -> f32 {
let speed_setpoint = self
.position_pid
.update(current_position, delta_t)
.clamp(-self.max_speed_setpoint_mps, self.max_speed_setpoint_mps);
self.speed_pid.set_setpoint(speed_setpoint);
self.speed_pid.update(current_velocity, delta_t)
}
pub fn reset(&mut self) {
self.position_pid.reset();
self.speed_pid.reset();
}
}