Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // PID (Proportional-Integral-Derivative) Controller logic
- if (!cfg_.snap_aim) {
- float dt = std::fminf(m_dt, 0.1f); // Clamp dt to prevent exceptions/error
- float derivative_x = degs_x - m_prev_err_x;
- float derivative_y = degs_y - m_prev_err_y;
- // Check epsilon before divide
- if (dt > std::numeric_limits<float>::epsilon()) {
- float int_x = degs_x * dt;
- float int_y = degs_y * dt;
- if (int_x < cfg_.max_integral) m_integral_x += int_x;
- if (int_y < cfg_.max_integral) m_integral_y += int_y;
- derivative_x /= dt;
- derivative_y /= dt;
- }
- // Light integral decay
- m_integral_x *= .99f;
- m_integral_y *= .99f;
- constexpr float MAX_INTEGRAL = 0.01f;
- constexpr float MAX_DERIVATIVE = 0.01f;
- // Set integral to zero if on target
- if (std::fabsf(degs_x) < MAX_INTEGRAL && std::fabsf(derivative_x) < MAX_DERIVATIVE)
- {
- m_integral_x = 0.0f;
- }
- if (std::fabsf(degs_y) < MAX_INTEGRAL && std::fabsf(derivative_y) < MAX_DERIVATIVE)
- {
- m_integral_y = 0.0f;
- }
- // apply Low-Pass filter on the derivative
- if (cfg_.enable_lpf)
- {
- if (dt > std::numeric_limits<float>::epsilon()) {
- derivative_x = cfg_.lpf_alpha * m_last_derivative_x + (1.0f - cfg_.lpf_alpha) * ((degs_x - m_prev_err_x) / dt);
- m_last_derivative_x = derivative_x;
- derivative_y = cfg_.lpf_alpha * m_last_derivative_y + (1.0f - cfg_.lpf_alpha) * ((degs_y - m_prev_err_y) / dt);
- m_last_derivative_y = derivative_y;
- }
- }
- m_prev_err_x = degs_x;
- m_prev_err_y = degs_y;
- degs_x = cfg_.k_P * degs_x + cfg_.k_I * m_integral_x - cfg_.k_D * derivative_x;
- degs_y = cfg_.k_P * degs_y + cfg_.k_I * m_integral_y - cfg_.k_D * derivative_y;
- }
Advertisement
Add Comment
Please, Sign In to add comment