pub struct MinimumSnapWaypointPlanner {
pub waypoints: Vec<Vector3<f32>>,
pub yaws: Vec<f32>,
pub times: Vec<f32>,
pub coefficients: Vec<Vec<Vector3<f32>>>,
pub yaw_coefficients: Vec<Vec<f32>>,
pub start_time: f32,
}Expand description
Waypoint planner that generates a minimum snap trajectory between waypoints
§Example
use peng_quad::MinimumSnapWaypointPlanner;
use nalgebra::Vector3;
let planner = MinimumSnapWaypointPlanner::new(
vec![Vector3::new(0.0, 0.0, 0.0), Vector3::new(1.0, 0.0, 0.0)],
vec![0.0, 0.0],
vec![1.0],
0.0,
);Fields§
§waypoints: Vec<Vector3<f32>>List of waypoints
yaws: Vec<f32>List of yaw angles
times: Vec<f32>List of segment times to reach each waypoint
coefficients: Vec<Vec<Vector3<f32>>>Coefficients for the x, y, and z components of the trajectory
yaw_coefficients: Vec<Vec<f32>>Coefficients for the yaw component of the trajectory
start_time: f32Start time of the trajectory
Implementations§
Source§impl MinimumSnapWaypointPlanner
Implementation of the MinimumSnapWaypointPlanner
impl MinimumSnapWaypointPlanner
Implementation of the MinimumSnapWaypointPlanner
Sourcepub fn new(
waypoints: Vec<Vector3<f32>>,
yaws: Vec<f32>,
segment_times: Vec<f32>,
start_time: f32,
) -> Result<Self, SimulationError>
pub fn new( waypoints: Vec<Vector3<f32>>, yaws: Vec<f32>, segment_times: Vec<f32>, start_time: f32, ) -> Result<Self, SimulationError>
Generate a new minimum snap waypoint planner
§Arguments
waypoints- List of waypointsyaws- List of yaw anglessegment_times- List of segment times to reach each waypointstart_time- Start time of the trajectory
§Returns
- A new minimum snap waypoint planner
§Errors
- Returns an error if the number of waypoints, yaws, and segment times do not match
§Example
use peng_quad::MinimumSnapWaypointPlanner;
use nalgebra::Vector3;
let waypoints = vec![Vector3::zeros(), Vector3::new(1.0, 0.0, 0.0)];
let yaws = vec![0.0, 0.0];
let segment_times = vec![1.0];
let start_time = 0.0;
let planner = MinimumSnapWaypointPlanner::new(waypoints, yaws, segment_times, start_time);Sourcepub fn compute_minimum_snap_trajectories(
&mut self,
) -> Result<(), SimulationError>
pub fn compute_minimum_snap_trajectories( &mut self, ) -> Result<(), SimulationError>
Compute the coefficients for the minimum snap trajectory, calculated for each segment between waypoints
§Errors
- Returns an error if the nalgebra solver fails to solve the linear system
§Example
use peng_quad::MinimumSnapWaypointPlanner;
use nalgebra::Vector3;
let waypoints = vec![Vector3::zeros(), Vector3::new(1.0, 0.0, 0.0)];
let yaws = vec![0.0, 0.0];
let segment_times = vec![1.0];
let start_time = 0.0;
let mut planner = MinimumSnapWaypointPlanner::new(waypoints, yaws, segment_times, start_time).unwrap();
planner.compute_minimum_snap_trajectories();Sourcepub fn compute_minimum_acceleration_yaw_trajectories(
&mut self,
) -> Result<(), SimulationError>
pub fn compute_minimum_acceleration_yaw_trajectories( &mut self, ) -> Result<(), SimulationError>
Compute the coefficients for yaw trajectories The yaw trajectory is a cubic polynomial and interpolated between waypoints
§Errors
- Returns an error if nalgebra fails to solve for the coefficients
§Example
use peng_quad::MinimumSnapWaypointPlanner;
use nalgebra::Vector3;
let waypoints = vec![Vector3::zeros(), Vector3::new(1.0, 0.0, 0.0)];
let yaws = vec![0.0, 0.0];
let segment_times = vec![1.0];
let start_time = 0.0;
let mut planner = MinimumSnapWaypointPlanner::new(waypoints, yaws, segment_times, start_time).unwrap();
planner.compute_minimum_snap_trajectories();
planner.compute_minimum_acceleration_yaw_trajectories();Sourcepub fn evaluate_polynomial(
&self,
t: f32,
coeffs: &[Vector3<f32>],
yaw_coeffs: &[f32],
) -> (Vector3<f32>, Vector3<f32>, f32, f32)
pub fn evaluate_polynomial( &self, t: f32, coeffs: &[Vector3<f32>], yaw_coeffs: &[f32], ) -> (Vector3<f32>, Vector3<f32>, f32, f32)
Evaluate the trajectory at a given time, returns the position, velocity, yaw, and yaw rate at the given time
§Arguments
t- The time to evaluate the trajectory atcoeffs- The coefficients for the position trajectoryyaw_coeffs- The coefficients for the yaw trajectory
§Returns
position- The position at the given time (meters)velocity- The velocity at the given time (meters / second)yaw- The yaw at the given time (radians)yaw_rate- The yaw rate at the given time (radians / second)
§Example
use nalgebra::Vector3;
use peng_quad::MinimumSnapWaypointPlanner;
let waypoints = vec![Vector3::zeros(), Vector3::new(1.0, 0.0, 0.0)];
let yaws = vec![0.0, 0.0];
let segment_times = vec![1.0];
let start_time = 0.0;
let mut planner = MinimumSnapWaypointPlanner::new(waypoints, yaws, segment_times, start_time).unwrap();
planner.compute_minimum_snap_trajectories();
planner.compute_minimum_acceleration_yaw_trajectories();
let (position, velocity, yaw, yaw_rate) = planner.evaluate_polynomial(0.5, &planner.coefficients[0], &planner.yaw_coefficients[0]);Trait Implementations§
Source§impl Planner for MinimumSnapWaypointPlanner
Implement the Planner trait for MinimumSnapWaypointPlanner
impl Planner for MinimumSnapWaypointPlanner
Implement the Planner trait for MinimumSnapWaypointPlanner
Source§fn plan(
&self,
_current_position: Vector3<f32>,
_current_velocity: Vector3<f32>,
time: f32,
) -> (Vector3<f32>, Vector3<f32>, f32)
fn plan( &self, _current_position: Vector3<f32>, _current_velocity: Vector3<f32>, time: f32, ) -> (Vector3<f32>, Vector3<f32>, f32)
Source§fn is_finished(
&self,
current_position: Vector3<f32>,
time: f32,
) -> Result<bool, SimulationError>
fn is_finished( &self, current_position: Vector3<f32>, time: f32, ) -> Result<bool, SimulationError>
Auto Trait Implementations§
impl Freeze for MinimumSnapWaypointPlanner
impl RefUnwindSafe for MinimumSnapWaypointPlanner
impl Send for MinimumSnapWaypointPlanner
impl Sync for MinimumSnapWaypointPlanner
impl Unpin for MinimumSnapWaypointPlanner
impl UnsafeUnpin for MinimumSnapWaypointPlanner
impl UnwindSafe for MinimumSnapWaypointPlanner
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
Source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
Source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
Source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].Source§impl<Src, Dst> LosslessTryInto<Dst> for Srcwhere
Dst: LosslessTryFrom<Src>,
impl<Src, Dst> LosslessTryInto<Dst> for Srcwhere
Dst: LosslessTryFrom<Src>,
Source§fn lossless_try_into(self) -> Option<Dst>
fn lossless_try_into(self) -> Option<Dst>
Source§impl<Src, Dst> LossyInto<Dst> for Srcwhere
Dst: LossyFrom<Src>,
impl<Src, Dst> LossyInto<Dst> for Srcwhere
Dst: LossyFrom<Src>,
Source§fn lossy_into(self) -> Dst
fn lossy_into(self) -> Dst
Source§impl<T> OverflowingAs for T
impl<T> OverflowingAs for T
Source§fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
Source§impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
Source§fn overflowing_cast_from(src: Src) -> (Dst, bool)
fn overflowing_cast_from(src: Src) -> (Dst, bool)
§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> SaturatingAs for T
impl<T> SaturatingAs for T
Source§fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
Source§impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
Source§fn saturating_cast_from(src: Src) -> Dst
fn saturating_cast_from(src: Src) -> Dst
Source§impl<T> StrictAs for T
impl<T> StrictAs for T
Source§fn strict_as<Dst>(self) -> Dstwhere
T: StrictCast<Dst>,
fn strict_as<Dst>(self) -> Dstwhere
T: StrictCast<Dst>,
Source§impl<Src, Dst> StrictCastFrom<Src> for Dstwhere
Src: StrictCast<Dst>,
impl<Src, Dst> StrictCastFrom<Src> for Dstwhere
Src: StrictCast<Dst>,
Source§fn strict_cast_from(src: Src) -> Dst
fn strict_cast_from(src: Src) -> Dst
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.