control_rate.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #ifndef __CONTROL_RATE_H
  2. #define __CONTROL_RATE_H
  3. #include "flt_butter.h"
  4. #include "stdbool.h"
  5. #include <stdint.h>
  6. struct pid_value_rpy
  7. {
  8. float angle_p;
  9. float gyro_p;
  10. float gyro_i;
  11. float gyro_d;
  12. unsigned char gyro_imax;
  13. };
  14. extern struct pid_value_rpy pid_v_roll;
  15. extern struct pid_value_rpy pid_v_pitch;
  16. extern struct pid_value_rpy pid_v_yaw;
  17. struct pid_value_ap
  18. {
  19. float dist_p;
  20. float speed_p;
  21. float acc_p;
  22. float acc_i;
  23. float acc_d;
  24. float brake_gyro;
  25. };
  26. extern struct pid_value_ap pid_v_alt;
  27. extern struct pid_value_ap pid_v_pos;
  28. struct pid_method_rpy
  29. {
  30. float angle_c; // 当前角度值
  31. float angle_t; // 目标角度值
  32. float angle_e; // 角度差
  33. float angle_p_item; // angle----P值
  34. float angle_i_item; // angle----I值
  35. unsigned int angle_i_time_last; // angle----上次积分的时间戳
  36. float angle_pid_out; // 当前PID的输出
  37. float gyro_c; // 当前角速度值
  38. float gyro_c_last; //
  39. float gyro_t; // 目标角速度值
  40. float gyro_t_last; // 上一次的目标角速度值
  41. float gyro_e; // 角速度差
  42. float gyro_e_last;
  43. bool gyro_filter_ready; // 滤波参数清零
  44. LpfButter2 gyro_dirv_filter;
  45. float gyro_p_item; // gyro----P值
  46. float gyro_i_item; // gyro----I值
  47. float gyro_d_item; // gyro----D值
  48. float gyro_d_item_last; // gyro----上一次D值
  49. float gyro_d_filter; // D值得滤波系数
  50. float pid_out; // 当前PID的输出
  51. float rotate_angle; // 需要旋转的角度
  52. int8_t enable_cw_rotate; // 使能顺时针旋转
  53. int8_t enable_ccw_rotate; // 使能逆时针旋转
  54. bool enable_tyaw;
  55. };
  56. extern struct pid_method_rpy pid_m_roll;
  57. extern struct pid_method_rpy pid_m_pitch;
  58. extern struct pid_method_rpy pid_m_yaw;
  59. struct pid_method_ap
  60. {
  61. int loc_c; // 当前位置
  62. int loc_t; // 目标位置
  63. int loc_e; // 位置差
  64. float loc_p_item; // loction----P值
  65. float vel_c; // 当前速度值
  66. float vel_t; // 目标速度值
  67. float vel_t_last; // 上一次的目标速度值
  68. float vel_e; // 速度差
  69. float vel_e_last; // 上一次的速度差
  70. bool vel_filter_ready; // 滤波参数清零
  71. float vel_p_item; // vel----P值
  72. float vel_i_item; // vel----I值
  73. unsigned int vel_i_time_last; // vel----上次积分的时间戳
  74. float vel_d_item; // vel----D值
  75. float vel_d_item_last; // vel----D值上一次的值
  76. float vel_dv_item; // vel----D值
  77. float vel_dv_item_last; // vel----D值上一次的值
  78. float accel_ff_item; // 目标速度微分出来的加速度前馈
  79. LpfButter2 accel_ff_butter_filt;
  80. float acc_c; // 当前加速度值
  81. float acc_c_last; // 上一次加速度值
  82. float acc_t; // 目标加速度值
  83. float acc_e; // 加速度差
  84. float acc_e_last; // 上一次的加速度的差
  85. bool acc_filter_reset; // 滤波参数清零
  86. float acc_p_item; // acc----P值
  87. float acc_i_item; // acc----I值
  88. unsigned int acc_i_time_last; // acc----上次积分的时间戳
  89. float acc_d_item; // acc----D值
  90. bool thr_hold;
  91. float pid_out_last; // 上次的PID输出
  92. float pid_out; // 当前PID的输出
  93. };
  94. extern struct pid_method_ap pid_m_alt;
  95. extern struct pid_method_ap pid_m_posx;
  96. extern struct pid_method_ap pid_m_posy;
  97. extern float attitude_head;
  98. float rate_pid_ctl_rp(struct pid_method_rpy *method,
  99. struct pid_value_rpy *value, float dt);
  100. float rate_pid_ctl_yaw(struct pid_method_rpy *method,
  101. struct pid_value_rpy *value, float dt);
  102. float rate_pid_ctl_thr(void);
  103. void clear_rate_i_item(struct pid_method_rpy *method);
  104. void init_attitude_head(void);
  105. #endif