use crate::motion::{
feedback_control::legacy_pid::linear_pid::PIDMovement,
odom::tracker::OdomTracker,
};
const TIMEOUT: u64 = 10000;
const AFTERDELAY: u64 = 10;
pub struct PointShoot {
pub odom: OdomTracker,
pub pid: PIDMovement,
}
impl PointShoot {
pub fn new(odom: OdomTracker, pid: PIDMovement) -> Self { Self { odom, pid } }
pub async fn face_point(&self, x: f64, y: f64) {
let delta_x = x - self.odom.global_pose.lock().await.x;
let delta_y = y - self.odom.global_pose.lock().await.y;
let angle = delta_y.atan2(delta_x).to_degrees();
self.pid
.rotate_imu(angle, &self.odom.trackermech.imu.clone(), TIMEOUT, AFTERDELAY)
.await;
}
pub async fn goto_point(&self, x: f64, y: f64) {
let delta_x = x - self.odom.global_pose.lock().await.x;
let delta_y = y - self.odom.global_pose.lock().await.y;
let angle = delta_y.atan2(delta_x).to_degrees();
let hyp = (delta_x.powi(2) + delta_y.powi(2)).sqrt();
self.pid
.rotate_imu(angle, &self.odom.trackermech.imu.clone(), TIMEOUT, AFTERDELAY)
.await;
self.pid.travel(hyp, TIMEOUT, AFTERDELAY).await;
}
pub async fn goto_pose(&self, x: f64, y: f64, heading: f64) {
let delta_x = x - self.odom.global_pose.lock().await.x;
let delta_y = y - self.odom.global_pose.lock().await.y;
let angle = delta_y.atan2(delta_x).to_degrees();
let hyp = (delta_x.powi(2) + delta_y.powi(2)).sqrt();
self.pid
.rotate_imu(angle, &self.odom.trackermech.imu.clone(), TIMEOUT, AFTERDELAY)
.await;
self.pid.travel(hyp, TIMEOUT, AFTERDELAY).await;
self.pid.rotate(heading, TIMEOUT, AFTERDELAY).await;
}
pub async fn travel(&self, distance: f64) {
self.pid.travel(distance, TIMEOUT, AFTERDELAY).await;
}
}