pub mod mt;
pub mod ms;
pub mod mcv;
pub mod sin;
pub mod smoothstep;
pub mod cycloid;
pub use cycloid::Cycloid;
pub use mcv::ModifiedConstantVelocity;
pub use ms::ModifiedSine;
pub use mt::ModifiedTrapezoid;
use serde::Serialize;
pub use smoothstep::SmoothPolynomial;
pub use sin::Sin;
use num_traits::{Float, FloatConst};
#[derive(Debug, Clone, Serialize)]
pub struct TrajectoryProfile<T> {
pub s: T,
pub v: T,
pub a: T
}
impl<T: Float> TrajectoryProfile<T> {
pub fn rest(s: T) -> Self {
Self { s, v: T::zero(), a: T::zero() }
}
}
pub trait Trajectory<T: Float> {
fn profile(&self, distance: T, x: T) -> TrajectoryProfile<T>;
fn generate(&self, distance: T, samples: usize) -> Vec<TrajectoryProfile<T>> {
let last = T::from(samples.saturating_sub(1).max(1)).unwrap();
(0..samples)
.map(|i| self.profile(distance, T::from(i).unwrap() / last))
.collect()
}
}
#[derive(Clone, Copy, Debug, PartialEq, Serialize)]
pub enum TrajectoryKind {
Sin,
Cycloid,
ModifiedTrapezoid,
ModifiedSine,
ModifiedConstantVelocity {
constant_velocity_percent: f64,
},
SmoothPolynomial {
smoothness: usize,
},
}
impl<T: Float + FloatConst> Trajectory<T> for TrajectoryKind {
fn profile(&self, distance: T, x: T) -> TrajectoryProfile<T> {
match *self {
Self::Sin => Sin.profile(distance, x),
Self::Cycloid => Cycloid.profile(distance, x),
Self::ModifiedTrapezoid => ModifiedTrapezoid.profile(distance, x),
Self::ModifiedSine => ModifiedSine.profile(distance, x),
Self::ModifiedConstantVelocity { constant_velocity_percent } => {
ModifiedConstantVelocity { constant_velocity_percent }.profile(distance, x)
}
Self::SmoothPolynomial { smoothness } => SmoothPolynomial { smoothness }.profile(distance, x),
}
}
}
impl From<Sin> for TrajectoryKind {
fn from(_: Sin) -> Self {
Self::Sin
}
}
impl From<Cycloid> for TrajectoryKind {
fn from(_: Cycloid) -> Self {
Self::Cycloid
}
}
impl From<ModifiedTrapezoid> for TrajectoryKind {
fn from(_: ModifiedTrapezoid) -> Self {
Self::ModifiedTrapezoid
}
}
impl From<ModifiedSine> for TrajectoryKind {
fn from(_: ModifiedSine) -> Self {
Self::ModifiedSine
}
}
impl From<ModifiedConstantVelocity> for TrajectoryKind {
fn from(p: ModifiedConstantVelocity) -> Self {
Self::ModifiedConstantVelocity { constant_velocity_percent: p.constant_velocity_percent }
}
}
impl From<SmoothPolynomial> for TrajectoryKind {
fn from(p: SmoothPolynomial) -> Self {
Self::SmoothPolynomial { smoothness: p.smoothness }
}
}
pub trait ReferenceTrajectory<T: Float> {
type Reference;
fn reference(&self, distance: T, duration: T, start: T) -> Self::Reference;
}