use msgpack_rpc::Value;
#[derive(Debug, Clone, Copy)]
pub struct PIDGains {
pub kp: f32,
pub ki: f32,
pub kd: f32,
}
impl PIDGains {
pub fn new(kp: f32, ki: f32, kd: f32) -> Self {
Self { kp, ki, kd }
}
pub(crate) fn _to_msgpack(&self) -> Value {
let gains = vec![Value::F32(self.kp), Value::F32(self.ki), Value::F32(self.kd)];
Value::Array(gains)
}
}
#[derive(Debug, Clone, Copy)]
pub struct AngularControllerGains {
pub roll_gains: PIDGains,
pub pitch_gains: PIDGains,
pub yaw_gains: PIDGains,
}
impl AngularControllerGains {
pub fn new(roll_gains: PIDGains, pitch_gains: PIDGains, yaw_gains: PIDGains) -> Self {
Self {
roll_gains,
pitch_gains,
yaw_gains,
}
}
pub(crate) fn as_msgpack(&self, vehicle_name: &'static str) -> Vec<Value> {
let kps = Value::Array(vec![
Value::F32(self.roll_gains.kp),
Value::F32(self.pitch_gains.kp),
Value::F32(self.yaw_gains.kp),
]);
let kis = Value::Array(vec![
Value::F32(self.yaw_gains.ki),
Value::F32(self.roll_gains.ki),
Value::F32(self.pitch_gains.ki),
]);
let kds = Value::Array(vec![
Value::F32(self.roll_gains.kd),
Value::F32(self.pitch_gains.kd),
Value::F32(self.yaw_gains.kd),
]);
vec![kps, kis, kds, Value::String(vehicle_name.into())]
}
}
#[derive(Debug, Clone, Copy)]
pub struct LinearControllerGains {
pub x_gains: PIDGains,
pub y_gains: PIDGains,
pub z_gains: PIDGains,
}
impl LinearControllerGains {
pub fn new(x_gains: PIDGains, y_gains: PIDGains, z_gains: PIDGains) -> Self {
Self {
x_gains,
y_gains,
z_gains,
}
}
pub(crate) fn as_msgpack(&self, vehicle_name: &'static str) -> Vec<Value> {
let kps = Value::Array(vec![
Value::F32(self.x_gains.kp),
Value::F32(self.y_gains.kp),
Value::F32(self.z_gains.kp),
]);
let kis = Value::Array(vec![
Value::F32(self.x_gains.ki),
Value::F32(self.y_gains.ki),
Value::F32(self.z_gains.ki),
]);
let kds = Value::Array(vec![
Value::F32(self.x_gains.kd),
Value::F32(self.y_gains.kd),
Value::F32(self.z_gains.kd),
]);
vec![kps, kis, kds, Value::String(vehicle_name.into())]
}
}