27 using TagTraits = units::traits::unit_traits<INPUT>;
28 using BaseUnits =
typename TagTraits::base_unit_type;
29 using TimeRatio =
typename BaseUnits::second_ratio;
30 using TimeCorrectionUnit =
31 units::unit<std::ratio<1>,
32 units::base_unit<std::ratio<0>, std::ratio<0>, std::ratio<-TimeRatio::num, TimeRatio::den>, std::ratio<0>>>;
34 using Position = units::compound_unit<INPUT, TimeCorrectionUnit>;
35 using Velocity = units::compound_unit<units::inverse<units::second>, Position>;
36 using Acceleration = units::compound_unit<units::inverse<units::second>, Velocity>;
37 using Jerk = units::compound_unit<units::inverse<units::second>, Acceleration>;
39 using Velocity_t = units::unit_t<Velocity>;
40 using Acceleration_t = units::unit_t<Acceleration>;
41 using Jerk_t = units::unit_t<Jerk>;
43 using ProportionalGain = units::compound_unit<OUTPUT, units::inverse<INPUT>>;
44 using IntegralGain = units::compound_unit<ProportionalGain, units::inverse<units::second>>;
45 using DerivativeGain = units::compound_unit<ProportionalGain, units::second>;
47 using ProportionalGain_t = units::unit_t<ProportionalGain>;
48 using IntegralGain_t = units::unit_t<IntegralGain>;
49 using DerivativeGain_t = units::unit_t<DerivativeGain>;
51 using Input_t = units::unit_t<INPUT>;
52 using Output_t = units::unit_t<OUTPUT>;
54 using kV_t = units::unit_t<units::compound_unit<OUTPUT, units::inverse<Velocity>>>;
55 using kA_t = units::unit_t<units::compound_unit<OUTPUT, units::inverse<Acceleration>>>;
57 ProportionalGain_t P{0};
59 DerivativeGain_t D{0};
61 Velocity_t maxVelocity{0};
62 Acceleration_t maxAcceleration{0};
66 Input_t errorThreshold{0};
71 std::optional<kV_t> kV = std::nullopt;
72 std::optional<kA_t> kA = std::nullopt;
74 units::turn_t GTarget = 0_deg;
75 GravityFFType GType = GravityFFType::LINEAR;
79 operator DimensionlessPIDF_t()
const
80 requires(!std::is_same_v<PIDF, DimensionlessPIDF_t>)
82 return DimensionlessPIDF_t{
83 .P =
typename DimensionlessPIDF_t::ProportionalGain_t{P.value()},
84 .I =
typename DimensionlessPIDF_t::IntegralGain_t{I.value()},
85 .D =
typename DimensionlessPIDF_t::DerivativeGain_t{D.value()},
86 .maxVelocity =
typename DimensionlessPIDF_t::Velocity_t{maxVelocity.value()},
87 .maxAcceleration =
typename DimensionlessPIDF_t::Acceleration_t{maxAcceleration.value()},
88 .maxJerk =
typename DimensionlessPIDF_t::Jerk_t{maxJerk.value()},
89 .error =
typename DimensionlessPIDF_t::Input_t{error.value()},
90 .errorThreshold =
typename DimensionlessPIDF_t::Input_t{errorThreshold.value()},
91 .kS =
typename DimensionlessPIDF_t::Output_t{kS.value()},
92 .kG =
typename DimensionlessPIDF_t::Output_t{kG.value()},
93 .kV = kV.has_value() ? std::make_optional(
typename DimensionlessPIDF_t::kV_t{kV->value()}) : std::nullopt,
94 .kA = kA.has_value() ? std::make_optional(
typename DimensionlessPIDF_t::kA_t{kA->value()}) : std::nullopt,