Saidwho12

PID Aimer

Aug 9th, 2025
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1.  // PID (Proportional-Integral-Derivative) Controller logic
  2.             if (!cfg_.snap_aim) {
  3.                 float dt = std::fminf(m_dt, 0.1f); // Clamp dt to prevent exceptions/error
  4.  
  5.                 float derivative_x = degs_x - m_prev_err_x;
  6.                 float derivative_y = degs_y - m_prev_err_y;
  7.  
  8.                 // Check epsilon before divide
  9.                 if (dt > std::numeric_limits<float>::epsilon()) {
  10.                     float int_x = degs_x * dt;
  11.                     float int_y = degs_y * dt;
  12.                     if (int_x < cfg_.max_integral) m_integral_x += int_x;
  13.                     if (int_y < cfg_.max_integral) m_integral_y += int_y;
  14.                     derivative_x /= dt;
  15.                     derivative_y /= dt;
  16.                 }
  17.  
  18.                 // Light integral decay
  19.                 m_integral_x *= .99f;
  20.                 m_integral_y *= .99f;
  21.  
  22.                 constexpr float MAX_INTEGRAL =  0.01f;
  23.                 constexpr float MAX_DERIVATIVE = 0.01f;
  24.  
  25.                 // Set integral to zero if on target
  26.                 if (std::fabsf(degs_x) < MAX_INTEGRAL && std::fabsf(derivative_x) < MAX_DERIVATIVE)
  27.                 {
  28.                     m_integral_x = 0.0f;
  29.                 }
  30.  
  31.                 if (std::fabsf(degs_y) < MAX_INTEGRAL && std::fabsf(derivative_y) < MAX_DERIVATIVE)
  32.                 {
  33.                     m_integral_y = 0.0f;
  34.                 }
  35.  
  36.                 // apply Low-Pass filter on the derivative
  37.                 if (cfg_.enable_lpf)
  38.                 {
  39.                     if (dt > std::numeric_limits<float>::epsilon()) {
  40.                         derivative_x = cfg_.lpf_alpha * m_last_derivative_x + (1.0f - cfg_.lpf_alpha) * ((degs_x - m_prev_err_x) / dt);
  41.                         m_last_derivative_x = derivative_x;
  42.                         derivative_y = cfg_.lpf_alpha * m_last_derivative_y + (1.0f - cfg_.lpf_alpha) * ((degs_y - m_prev_err_y) / dt);
  43.                         m_last_derivative_y = derivative_y;
  44.                     }
  45.                 }
  46.  
  47.                 m_prev_err_x = degs_x;
  48.                 m_prev_err_y = degs_y;
  49.                 degs_x = cfg_.k_P * degs_x + cfg_.k_I * m_integral_x - cfg_.k_D * derivative_x;
  50.                 degs_y = cfg_.k_P * degs_y + cfg_.k_I * m_integral_y - cfg_.k_D * derivative_y;
  51.             }
Advertisement
Add Comment
Please, Sign In to add comment