#![allow(unused)]
use pidsk_controller::{PControllerf32, PidControllerf32};
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct HorizontalPositionDualRingPid {
position_pid: PControllerf32,
speed_pid: PidControllerf32,
max_speed_mps: f32,
}
impl Default for HorizontalPositionDualRingPid {
fn default() -> Self {
Self::new()
}
}
impl HorizontalPositionDualRingPid {
pub fn new() -> Self {
Self {
position_pid: PControllerf32::new(),
speed_pid: PidControllerf32::new().with_kp(0.15).with_ki(0.02).with_kd(0.01),
max_speed_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).clamp(-self.max_speed_mps, self.max_speed_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();
}
}