在源码的libraries中,有两个关于PID的源文件文件夹,一个叫AC_PID,另一个是PID。AC_PID中又细分为AC_HELI_PID、AC_P和AC_PID, 这里我们只讨论AC_PID。PID文件夹中只有一个PID类,下面分别列出这两个类中的属性和方法,并大致描述其功能和实现细节,源码请自己下载阅读。
AC_PID
构造函数(略)
float get_pid(float error, float dt); //计算PID控制器的输出,其实是分别调用了下面的get_p、get_i、get_d函数
float get_pi(float error, float dt); //计算PI控制器输出
float get_p(float error) const; //计算p输出
float get_i(float error, float dt); //计算i输出,其中有积分限幅,由_imax决定
float get_d(float error, float dt); //计算d输出,首先判断上一次的微分值是否有效,避免上一次值不确定导致大的输出,并且有20HZ的低通滤波器
/// Reset the PID integrator
///
void reset_I(); //将积分值置0,上一次微分值置为NAN
/// Load gain properties
///
void load_gains();
/// Save gain properties
///
void save_gains();
/// Sets filter Alpha for D-term LPF
void set_d_lpf_alpha(int16_t cutoff_frequency, float time_step); //计算滤波器系数
PID
构造函数(略)
float get_pid(float error, float scaler = 1.0); //计算PID控制器的输出,与上面用到的方法类似,不同点1.如果两次计算的时间大于1秒,则重置积分值,避免大的波动;2有一个scaler可以对输出值进行整体的比例运算,而不用调整PID三个参数,默认为1.
// get_pid() constrained to +/- 4500
int16_t get_pid_4500(float error, float scaler = 1.0); //限制PID的输出在+/-4500之间
/// Reset the PID integrator
///
void reset_I();
/// Load gain properties
///
void load_gains();
/// Save gain properties
///
void save_gains();
可以看出,两个PID实现基本一致,在细节处理上不太一样,具体各自用在什么地方还不太清楚,这里只是做个笔记,随着学习加深会进一步完善。