ardupilot的libraries之PID

         在源码的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实现基本一致,在细节处理上不太一样,具体各自用在什么地方还不太清楚,这里只是做个笔记,随着学习加深会进一步完善。




猜你喜欢

转载自blog.csdn.net/G_Crisis/article/details/50989611
PID