pub struct PIDController {
pub kpid_pos: [Vector3<f32>; 3],
pub kpid_att: [Vector3<f32>; 3],
pub integral_pos_error: Vector3<f32>,
pub integral_att_error: Vector3<f32>,
pub max_integral_pos: Vector3<f32>,
pub max_integral_att: Vector3<f32>,
pub mass: f32,
pub gravity: f32,
}Expand description
PID controller for quadrotor position and attitude control
The kpid_pos and kpid_att gains are following the format of proportional, derivative and integral gains
§Example
use nalgebra::Vector3;
use peng_quad::PIDController;
let kpid_pos = [
[1.0, 1.0, 1.0],
[0.1, 0.1, 0.1],
[0.01, 0.01, 0.01],
];
let kpid_att = [
[1.0, 1.0, 1.0],
[0.1, 0.1, 0.1],
[0.01, 0.01, 0.01],
];
let max_integral_pos = [1.0, 1.0, 1.0];
let max_integral_att = [1.0, 1.0, 1.0];
let mass = 1.0;
let gravity = 9.81;
let pid_controller = PIDController::new(kpid_pos, kpid_att, max_integral_pos, max_integral_att, mass, gravity);Fields§
§kpid_pos: [Vector3<f32>; 3]PID gain for position control including proportional, derivative, and integral gains
kpid_att: [Vector3<f32>; 3]PID gain for attitude control including proportional, derivative, and integral gains
integral_pos_error: Vector3<f32>Accumulated integral error for position
integral_att_error: Vector3<f32>Accumulated integral error for attitude
max_integral_pos: Vector3<f32>Maximum allowed integral error for position
max_integral_att: Vector3<f32>Maximum allowed integral error for attitude
mass: f32Mass of the quadrotor
gravity: f32Gravity constant
Implementations§
Source§impl PIDController
Implementation of PIDController
impl PIDController
Implementation of PIDController
Sourcepub fn new(
_kpid_pos: [[f32; 3]; 3],
_kpid_att: [[f32; 3]; 3],
_max_integral_pos: [f32; 3],
_max_integral_att: [f32; 3],
_mass: f32,
_gravity: f32,
) -> Self
pub fn new( _kpid_pos: [[f32; 3]; 3], _kpid_att: [[f32; 3]; 3], _max_integral_pos: [f32; 3], _max_integral_att: [f32; 3], _mass: f32, _gravity: f32, ) -> Self
Creates a new PIDController with default gains gains are in the order of proportional, derivative, and integral
§Arguments
_kpid_pos- PID gains for position control_kpid_att- PID gains for attitude control_max_integral_pos- Maximum allowed integral error for position_max_integral_att- Maximum allowed integral error for attitude
§Returns
- A new PIDController instance
§Example
use nalgebra::Vector3;
use peng_quad::PIDController;
let kpid_pos = [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]];
let kpid_att = [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]];
let max_integral_pos = [1.0, 1.0, 1.0];
let max_integral_att = [1.0, 1.0, 1.0];
let mass = 1.0;
let gravity = 9.81;
let pid = PIDController::new(kpid_pos, kpid_att, max_integral_pos, max_integral_att, mass, gravity);Sourcepub fn compute_attitude_control(
&mut self,
desired_orientation: &UnitQuaternion<f32>,
current_orientation: &UnitQuaternion<f32>,
current_angular_velocity: &Vector3<f32>,
dt: f32,
) -> Vector3<f32>
pub fn compute_attitude_control( &mut self, desired_orientation: &UnitQuaternion<f32>, current_orientation: &UnitQuaternion<f32>, current_angular_velocity: &Vector3<f32>, dt: f32, ) -> Vector3<f32>
Computes attitude control torques
§Arguments
desired_orientation- The desired orientation quaternioncurrent_orientation- The current orientation quaternioncurrent_angular_velocity- The current angular velocitydt- Time step
§Returns
- The computed attitude control torques
§Example
use nalgebra::{UnitQuaternion, Vector3};
use peng_quad::PIDController;
let kpid_pos = [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]];
let kpid_att = [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]];
let max_integral_pos = [1.0, 1.0, 1.0];
let max_integral_att = [1.0, 1.0, 1.0];
let mass = 1.0;
let gravity = 9.81;
let mut pid = PIDController::new(kpid_pos, kpid_att, max_integral_pos, max_integral_att, mass, gravity);
let desired_orientation = UnitQuaternion::identity();
let current_orientation = UnitQuaternion::identity();
let current_angular_velocity = Vector3::zeros();
let dt = 0.01;
let control_torques = pid.compute_attitude_control(&desired_orientation, ¤t_orientation, ¤t_angular_velocity, dt);Sourcepub fn compute_position_control(
&mut self,
desired_position: &Vector3<f32>,
desired_velocity: &Vector3<f32>,
desired_yaw: f32,
current_position: &Vector3<f32>,
current_velocity: &Vector3<f32>,
dt: f32,
) -> (f32, UnitQuaternion<f32>)
pub fn compute_position_control( &mut self, desired_position: &Vector3<f32>, desired_velocity: &Vector3<f32>, desired_yaw: f32, current_position: &Vector3<f32>, current_velocity: &Vector3<f32>, dt: f32, ) -> (f32, UnitQuaternion<f32>)
Computes position control thrust and desired orientation
§Arguments
desired_position- The desired positiondesired_velocity- The desired velocitydesired_yaw- The desired yaw anglecurrent_position- The current positioncurrent_velocity- The current velocitydt- Time stepmass- Mass of the quadrotorgravity- Gravitational acceleration
§Returns
- A tuple containing the computed thrust and desired orientation quaternion
§Example
use nalgebra::{UnitQuaternion, Vector3};
use peng_quad::PIDController;
let kpid_pos = [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]];
let kpid_att = [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]];
let max_integral_pos = [1.0, 1.0, 1.0];
let max_integral_att = [1.0, 1.0, 1.0];
let mass = 1.0;
let gravity = 9.81;
let mut pid = PIDController::new(kpid_pos, kpid_att, max_integral_pos, max_integral_att, mass, gravity);
let desired_position = Vector3::new(0.0, 0.0, 1.0);
let desired_velocity = Vector3::zeros();
let desired_yaw = 0.0;
let current_position = Vector3::zeros();
let current_velocity = Vector3::zeros();
let dt = 0.01;
let (thrust, desired_orientation) = pid.compute_position_control(&desired_position, &desired_velocity, desired_yaw, ¤t_position, ¤t_velocity, dt);Auto Trait Implementations§
impl Freeze for PIDController
impl RefUnwindSafe for PIDController
impl Send for PIDController
impl Sync for PIDController
impl Unpin for PIDController
impl UnsafeUnpin for PIDController
impl UnwindSafe for PIDController
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.