智能车控制算法 —— PID (学习笔记)

PID

  • 概念
  • PID的控制方法
    • -1.增量式PID
    • -2.位置式PID
  • 利用整定参数来选择PID控制规律

概念

智能车控制算法 —— PID (学习笔记)_第1张图片

PID控制:一种调节器控制规律为比例、积分、微分的控制。其中:P:比例(proportion)、I:积分(integral)、D:导数(derivative)
智能车控制算法 —— PID (学习笔记)_第2张图片

式子中Kp为比例系数,Ti为积分时间参数,Td为微分时间常数。
各个参数的意义作用:

Kp:比例系数。一般增大比例系数,将加快系统的响应。

Ti:积分时间常数。一般地,积分控制通常与比例控制或比例微分控制联合使用,构成 PI或 PID控制.增大积分时间常数 (积分变弱)有利于小超调,减小振荡,使系统更稳定,但同时要延长系统消除静差的时间.积分时间常数太小会降低系统的稳定性,增大系统的振荡次数.

Td:微分时间常数。一般微分控制和比例控制和比例积分控制联合使用,组成PD或PID控制,微分控制可改善系统的动态特性。

PID的控制方法

常用的有两种:

-1.增量式PID

所谓的增量,就是本次控制量和上次控制量的差值。增量式PID是一种对控制量的增量进行PID控制的一种控制算法。

公式:
在这里插入图片描述

(说明:Kp->P,Ki->I,Kd->D,e数组->error数组,
e[n]->本次差值,e[n-1]->上次差值,e[n-2]->上上次差值)

举个例子,增量式PID可以应用在电机上
假设当前电机PID的pwm值为5000(精度为10000,即此时的占空比为50%)。对应的速度为100r/s。
程序发出一个命令,要求pwm输出为0,即要求停车。(可能有人有疑问为什么不直接程序给pwm为0,这也是一种方法,可是由于惯性的存在,小车会在一段时间后才停下。)
这时,我们可以采用PID控制的方法来实现。
我们在程序中定义几个变量:

int speed_now=100;     //此刻的速度
int speed_want=0;      //期望输出的速度
int pwm_duty=0;        //本次pwm输出值
float P=100,I=20,D=2;  //P I D 数值
float error_pre_pre=0;  //上上次差值
float error_pre=0.0;    //上次差值
float error=0.0;         //本次差值

根据公式,我们编写程序:

void PID()
{
     
    /*
     增量式PID
      P=Kp*(error-error_pre);
      D=Kd*(error-2*error_pre+error_pre_pre);
      I=Ki*error;
      Pwm+=P+I+D;
  */
   error=speed_want-speed_now; //speed_now可以通过编码器采值等等方式得到
   pwm_duty+=(int)(P*(error-error_pre)+I*error+D*(error-2*error_pre+error_pre_pre));
   //注意上面的加号,加号是增量式PID的体现。我们对增量(即右边的式子)进行PID控制。
   error_pre_pre=error_pre;
   error_pre=error;
}

当函数运行第一次的时候,输出的pwm为:
在这里插入图片描述

电机给了一个反转的力,小车前进受到了阻力,于是可以很快的停下来了。

增量式PID的优缺点:
优:
①算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果;
②计算机每次只输出控制增量,即对应执行机构位置的变化量,故机器发生故障时影响范围小、不会严重影响生产过程;
③手动—自动切换时冲击小。当控制从手动向自动切换时,可以作到无扰动切换。
缺:需要对控制量进行记忆。

-2.位置式PID

与增量式不同,位置式PID不需要对控制量进行记忆,直接对偏差值进行计算得出期望的pwm。
公式:
在这里插入图片描述

(说明:Kp->P,Ki->I,Kd->D,ek->本次误差、ek-1->上次误差)

举个例子,位置式PID可以应用在舵机上。因为舵机本次的pwm输出值与上次pwm输出值关系不太,舵机需要的是快速转到某个角度。
假设舵机pwm输出1000时舵盘转轴为90°,pwm输出0时舵盘转轴为0°,pwm输出2000时舵盘转轴为180°。
现在舵机pwm输出为1500,我们要让舵盘转到最中间。
在这里我们采用PD控制,即I值为0(I值为偏差的积分,即对偏差求和。我们当时试验小车的舵机控制时发现I值可以省略,PD控制足矣。当然,具体需不需要I项要在实际中进行分析验证)。
代码:

pwm_duty=(int)(P*error+D*(error-error_pre);   //红色部分表示这是位置式PID控制

———————————————— 版权声明:本文为CSDN博主「浪在冰城」的原创文章(有修改)
原文链接:https://blog.csdn.net/Valieli/article/details/53453489

利用整定参数来选择PID控制规律

1. 如果不让积分参与控制,则可以把积分时间TI设定为无限大。但积分项还是不可能为零,这是因为有还初期的Minitial 的存在
2. 如果不让微分参与控制,则可以把微分时间TD设为零
3. 如果不让比例参与控制,但需要积分或积分、微分参与控制,则可以把增益设为零。在增益为零的情况下,CPU在计算积分项和微分项的时候,会把增益置为1.0

你可能感兴趣的:(学习,算法)