use crate::{FlightState, Result, RocketSample, Vec3};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ControlInput {
pub thrust_direction: Vec3,
pub steering_acceleration_mps2: Vec3,
}
impl ControlInput {
pub fn along(thrust_direction: Vec3) -> Self {
Self {
thrust_direction,
steering_acceleration_mps2: Vec3::zeros(),
}
}
}
impl Default for ControlInput {
fn default() -> Self {
Self::along(Vec3::x())
}
}
#[derive(Debug, Clone, Copy)]
pub struct GuidanceContext<'a> {
pub state: &'a FlightState,
pub rocket: RocketSample,
pub step_duration_s: f64,
pub max_steering_accel_mps2: f64,
}
pub trait Guidance {
fn command(&mut self, context: GuidanceContext<'_>) -> Result<ControlInput>;
}
impl<F> Guidance for F
where
F: FnMut(GuidanceContext<'_>) -> Result<ControlInput>,
{
fn command(&mut self, context: GuidanceContext<'_>) -> Result<ControlInput> {
self(context)
}
}
#[derive(Debug, Clone, Copy)]
pub struct FixedDirection(pub Vec3);
impl Guidance for FixedDirection {
fn command(&mut self, _context: GuidanceContext<'_>) -> Result<ControlInput> {
Ok(ControlInput::along(self.0))
}
}