pub struct Quadrotor {
pub position: Vector3<f32>,
pub velocity: Vector3<f32>,
pub acceleration: Vector3<f32>,
pub orientation: UnitQuaternion<f32>,
pub angular_velocity: Vector3<f32>,
pub mass: f32,
pub gravity: f32,
pub time_step: f32,
pub drag_coefficient: f32,
pub inertia_matrix: Matrix3<f32>,
pub inertia_matrix_inv: Matrix3<f32>,
}Expand description
Represents a quadrotor with its physical properties and state
§Example
use nalgebra::Vector3;
use peng_quad::Quadrotor;
let (time_step, mass, gravity, drag_coefficient) = (0.01, 1.3, 9.81, 0.01);
let inertia_matrix = [0.0347563, 0.0, 0.0, 0.0, 0.0458929, 0.0, 0.0, 0.0, 0.0977];
let quadrotor = Quadrotor::new(time_step, mass, gravity, drag_coefficient, inertia_matrix);Fields§
§position: Vector3<f32>Current position of the quadrotor in 3D space
velocity: Vector3<f32>Current velocity of the quadrotor
acceleration: Vector3<f32>Current acceleration of the quadrotor
orientation: UnitQuaternion<f32>Current orientation of the quadrotor
angular_velocity: Vector3<f32>Current angular velocity of the quadrotor
mass: f32Mass of the quadrotor in kg
gravity: f32Gravitational acceleration in m/s^2
time_step: f32Simulation time step in seconds
drag_coefficient: f32Drag coefficient
inertia_matrix: Matrix3<f32>Inertia matrix of the quadrotor
inertia_matrix_inv: Matrix3<f32>Inverse of the inertia matrix
Implementations§
Source§impl Quadrotor
Implementation of the Quadrotor struct
impl Quadrotor
Implementation of the Quadrotor struct
Sourcepub fn new(
time_step: f32,
mass: f32,
gravity: f32,
drag_coefficient: f32,
inertia_matrix: [f32; 9],
) -> Result<Self, SimulationError>
pub fn new( time_step: f32, mass: f32, gravity: f32, drag_coefficient: f32, inertia_matrix: [f32; 9], ) -> Result<Self, SimulationError>
Creates a new Quadrotor with default parameters
§Arguments
time_step- The simulation time step in secondsmass- The mass of the quadrotor in kggravity- The gravitational acceleration in m/s^2drag_coefficient- The drag coefficientinertia_matrix- The inertia matrix of the quadrotor
§Returns
- A new Quadrotor instance
§Errors
- Returns a SimulationError if the inertia matrix cannot be inverted
§Example
use nalgebra::Vector3;
use peng_quad::Quadrotor;
let (time_step, mass, gravity, drag_coefficient) = (0.01, 1.3, 9.81, 0.01);
let inertia_matrix = [0.0347563, 0.0, 0.0, 0.0, 0.0458929, 0.0, 0.0, 0.0, 0.0977];
let quadrotor = Quadrotor::new(time_step, mass, gravity, drag_coefficient, inertia_matrix);Sourcepub fn update_dynamics_with_controls_euler(
&mut self,
control_thrust: f32,
control_torque: &Vector3<f32>,
)
pub fn update_dynamics_with_controls_euler( &mut self, control_thrust: f32, control_torque: &Vector3<f32>, )
Updates the quadrotor’s dynamics with control inputs
§Arguments
control_thrust- The total thrust force applied to the quadrotorcontrol_torque- The 3D torque vector applied to the quadrotor
§Example
use nalgebra::Vector3;
use peng_quad::Quadrotor;
let (time_step, mass, gravity, drag_coefficient) = (0.01, 1.3, 9.81, 0.01);
let inertia_matrix = [0.0347563, 0.0, 0.0, 0.0, 0.0458929, 0.0, 0.0, 0.0, 0.0977];
let mut quadrotor = Quadrotor::new(time_step, mass, gravity, drag_coefficient, inertia_matrix).unwrap();
let control_thrust = mass * gravity;
let control_torque = Vector3::new(0.0, 0.0, 0.0);
quadrotor.update_dynamics_with_controls_euler(control_thrust, &control_torque);Sourcepub fn update_dynamics_with_controls_rk4(
&mut self,
control_thrust: f32,
control_torque: &Vector3<f32>,
)
pub fn update_dynamics_with_controls_rk4( &mut self, control_thrust: f32, control_torque: &Vector3<f32>, )
Updates the quadrotor’s dynamics with control inputs using the Runge-Kutta 4th order method
§Arguments
control_thrust- The total thrust force applied to the quadrotorcontrol_torque- The 3D torque vector applied to the quadrotor
§Example
use nalgebra::Vector3;
use peng_quad::Quadrotor;
let (time_step, mass, gravity, drag_coefficient) = (0.01, 1.3, 9.81, 0.01);
let inertia_matrix = [0.0347563, 0.0, 0.0, 0.0, 0.0458929, 0.0, 0.0, 0.0, 0.0977];
let mut quadrotor = Quadrotor::new(time_step, mass, gravity, drag_coefficient, inertia_matrix).unwrap();
let control_thrust = mass * gravity;
let control_torque = Vector3::new(0.0, 0.0, 0.0);
quadrotor.update_dynamics_with_controls_rk4(control_thrust, &control_torque);Sourcepub fn get_state(&self) -> [f32; 13]
pub fn get_state(&self) -> [f32; 13]
Returns the state derivative of the quadrotor
§Arguments
state- The state of the quadrotor
§Example
use nalgebra::Vector3;
use peng_quad::Quadrotor;
use nalgebra::UnitQuaternion;
let (time_step, mass, gravity, drag_coefficient) = (0.01, 1.3, 9.81, 0.01);
let inertia_matrix = [0.0347563, 0.0, 0.0, 0.0, 0.0458929, 0.0, 0.0, 0.0, 0.0977];
let quadrotor = Quadrotor::new(time_step, mass, gravity, drag_coefficient, inertia_matrix).unwrap();
let state = quadrotor.get_state();Sourcepub fn set_state(&mut self, state: &[f32; 13])
pub fn set_state(&mut self, state: &[f32; 13])
Sets the state of the quadrotor
§Arguments
state- The state of the quadrotor
§Example
use nalgebra::Vector3;
use peng_quad::Quadrotor;
use nalgebra::UnitQuaternion;
let (time_step, mass, gravity, drag_coefficient) = (0.01, 1.3, 9.81, 0.01);
let inertia_matrix = [0.0347563, 0.0, 0.0, 0.0, 0.0458929, 0.0, 0.0, 0.0, 0.0977];
let mut quadrotor = Quadrotor::new(time_step, mass, gravity, drag_coefficient, inertia_matrix).unwrap();
let state = [
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
];
quadrotor.set_state(&state);Sourcepub fn state_derivative(
&mut self,
state: &[f32],
control_thrust: f32,
control_torque: &Vector3<f32>,
) -> [f32; 13]
pub fn state_derivative( &mut self, state: &[f32], control_thrust: f32, control_torque: &Vector3<f32>, ) -> [f32; 13]
Calculates the derivative of the state of the quadrotor
§Arguments
state- The current state of the quadrotorcontrol_thrust- The thrust applied to the quadrotorcontrol_torque- The torque applied to the quadrotor
§Returns
The derivative of the state
§Example
use nalgebra::Vector3;
use peng_quad::Quadrotor;
use nalgebra::UnitQuaternion;
let (time_step, mass, gravity, drag_coefficient) = (0.01, 1.3, 9.81, 0.01);
let inertia_matrix = [0.0347563, 0.0, 0.0, 0.0, 0.0458929, 0.0, 0.0, 0.0, 0.0977];
let mut quadrotor = Quadrotor::new(time_step, mass, gravity, drag_coefficient, inertia_matrix).unwrap();
let state = [
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
];
let control_thrust = 0.0;
let control_torque = Vector3::new(0.0, 0.0, 0.0);
let derivative = quadrotor.state_derivative(&state, control_thrust, &control_torque);Sourcepub fn read_imu(&self) -> Result<(Vector3<f32>, Vector3<f32>), SimulationError>
pub fn read_imu(&self) -> Result<(Vector3<f32>, Vector3<f32>), SimulationError>
Simulates IMU readings
§Returns
- A tuple containing the true acceleration and angular velocity of the quadrotor
§Errors
- Returns a SimulationError if the IMU readings cannot be calculated
§Example
use nalgebra::Vector3;
use peng_quad::Quadrotor;
let (time_step, mass, gravity, drag_coefficient) = (0.01, 1.3, 9.81, 0.01);
let inertia_matrix = [0.0347563, 0.0, 0.0, 0.0, 0.0458929, 0.0, 0.0, 0.0, 0.0977];
let quadrotor = Quadrotor::new(time_step, mass, gravity, drag_coefficient, inertia_matrix).unwrap();
let (true_acceleration, true_angular_velocity) = quadrotor.read_imu().unwrap();Auto Trait Implementations§
impl Freeze for Quadrotor
impl RefUnwindSafe for Quadrotor
impl Send for Quadrotor
impl Sync for Quadrotor
impl Unpin for Quadrotor
impl UnsafeUnpin for Quadrotor
impl UnwindSafe for Quadrotor
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.