22 direction_ = direction;
23 settle_speed_ = settle_speed;
24 tolerance_ = tolerance;
28 if (request != 0.0f) {
29 spin_direction_ = std::copysign(1.0f, request);
37 const bool crossed = error * last_error_ <= 0.0f &&
38 std::abs(error - last_error_) <
Pi_f;
40 if (std::abs(error) > tolerance_ && !crossed)
41 return spin_direction_ * settle_speed_;
45 pid_.
update(0.0f, error, dt);
46 return direction_ * pid_.
state();
48 void reset() { returning_ =
false; spin_direction_ = last_error_ = 0; pid_.
clean(); }
51 fp32 direction_{1}, settle_speed_{1}, tolerance_{.005f};
52 fp32 spin_direction_{}, last_error_{};
53 bool returning_{
false};