文档详情

AGVPID调试小结

tang****xu2
实名认证
店铺
DOCX
17.09KB
约10页
文档ID:185725101
AGVPID调试小结_第1页
1/10

AGV PID调试在AGV控制算法中,PID算法是最基础也是最重要的一环 PID算法运用起来其实非常简单,几行代码就能实现,困难的地方就是参数整定了,需要不断的尝试找到最佳参数PID控制算法基本原理一.PID控制算法的基本思想PID算法是一种具有预见性的控制算法,其核心思想是:1) PID算法不但考虑控制对象的当前状态值 (现在状态),而且还考虑控制对象过去一段时间的状态值(历史状态)和最近一段时间的状态值变化(预期) ,由这3方面共同决定当前的输出控制信号;2) PID控制算法的运算结果是一个数,利用这个数来控制被控对象在多种工作 状态(比如加热器的多种功率,阀门的多种开度等)工作,一般输出形式为 PWM,基本上满足了按需输出控制信号,根据情况随时改变输出的目的PID控制算法的基本思想大致如上, 但要针对不同的场景做出相应调整 比如针对AGV 的方向控制,我们就需要着重考虑 AGV的当前状态--位置偏差值和角度偏差值(比例调节), 预期状态辅助调控(微分调节),对于历史状态则不用考虑(积分调节) 在实际调控中会发现, 一般情况下只要比例控制得当, 车体本身运行就很平稳了, 加入 微分调节是为了处理 AGV受到外力撞击时的突发情况。

这里不考虑积分调节是因为, AGV方向控制是实时动态调控的,历史误差在次情况下没有太多意义二.PID算法分析:PID算法从其字面理解是:P-比例控制、I-积分控制和D-微分控制下面根据 T3实际 调试过程注解下:1、比例控制设某控制系统:用户设定值为 SV(也就是希望通过PID控制算法使被控制对象的状态值保持在SV的附件)1>从系统投入运行开始,控制算法每隔一段时间对被控制对象的状态值进行采样由此,可得到开机以来由各个采样时间点被控制对象的状态值所形成的数据序列:X1,X2, X3, X4, .... Xk-2,Xk-1,Xk说明:X1:开机以来的第一次采样值Xk:目前的采样值(最近一次的采样值)2>从这个采样值序列中提取出三方面信息:①当前采样值Xk与用户设定值SV之间的差值:EkEk =Sv - Xk分析Ek:L >0:说明当前状态值未达标Ek T =0 :说明当前控制状态值正好满足要求-<0:说明当前状态值已经超标结论:Ek反应了控制对象当前值与设定值的偏差程度,可以根据 Ek的大小对输出信号OUT进行调整:偏差程度大 OUT增大,偏差程度小OUT减小即输出信号的强弱与当前偏差程度的大小成比例,所以根据 Ek的大小来给出控 制信号OUT的当前值的算法称为比例控制(Proportion )。

用数学模型可以表示 为:POUT= (Kp*Ek) + Out0Kp:一般称之为比例系数,可以理解为硬件上的放大器(或衰减器) ,适当选取Kp将当前误差值Ek按一定的增益放大或缩小,以提高控制算法的相应速度Out0:是一个常数,目的是为了当Ek为0时,确保输出信号不为0,以不至丁在当前值与设定值相等时控制器输出信号 OUT为0,系统处丁无控制信号的失控状态陀螺仪循迹时,上电后采集一个角度数据作为 SV (此时车身与轨道无角度偏差),此后采集的角度数据均为 Xk , Ek =Sv - Xk 但实现AGV导航仅有角度偏差数据无法形成闭 环控制,我们还需要摄像头确定 AGV的位置偏差数据使用 OPEM-MV3进行调试时,可以直接从摄像头模块获取出 AGV角度偏差值 EK_A和距离偏差值 EK_D (相对于轨迹中心), 注意在此时获取的数据本身就是偏差值为了实现闭环控制 ,数学模型如下:Pout= ( KP_A * EK_A ) + ( KP_D * EK_D ) + Out调整KP_A和KP_D实现对车身导航的比例控制2、积分控制将投入运行以来的各个采样值都与设定值相减,可得到开机以来每个采样时刻的偏差序列数据:E1, E2, E3 .....Ek-2,Ek-1,Ek说明:E1:开机的第一个采样点与设定值的偏差E1=SV-X1 ;E2=SV-X2 ;EK-2=SV-XK-2 ;EK-1=SV-XK-1 ;Ek:当前的采样值与设定值的偏差EK=SV-XK分析开机以来的误差序列:每个偏差值可能有:>0 , <0 , =0这三种可能的值,因为从开机到现在,控制算法不断输出控制信号对被控对象进行控制, 导致了过去这段时间有时候超 标(Ex<0),有些时候未达标(Ex>0),有时候正好满足要求(Ex=0);如果将这 些偏差值进行累加求代数和得到 Sk,即:Sk=E1+E2+E3+ +Ek-2+Ek-1+Ek分析Sk:=>0:过去大多数时候未达标Sk - =0 :过去控制效果较理想- <0:过去大多数时候已经超标结论:1. 通过对Sk的分析,可以对控制算法过去的控制效果进行综合评估。

体现了控制算法按照原来的方式输出的控制信号导致了现在的控制结果, 所以应该利用这个值来对当前要输出的控制信号 OUT进行修正,以确保控制对象会在将来 的一小段时间尽快达到用户设定的值2.Sk实际上是过去每个时间点的误差相加, 与数学上的定积分运算类似,因此根据Sk对输出信号进行调节的算法称积分 (integral )算法所以积分控制的 数学模型为:IOUT=(kp* ( (1/Ti) Exdt))+Out0Kp是一常数,其目的类似硬件上的放大器,用丁将 Sk放大或衰减;Out0是一常数,为了在历史积分偏差值为0时确保系统有一个输出值,避免失 控;Ti是积分时间常数,取值越大会导致输出量 OUT会越小,可理解为历史上 已经很久的误差值都影响了当前的输出信号取值越小,输出 OUT会越强烈, 可理解为积分只考虑了最近一段时间的误差实际中,如果系统已经运行“很长” 一段时间了,那些早期采样的偏差值可 以忽略他们对当前控制的影响,所以应该根据情况选择合理的 Ti值方能得到良好的控制效果公式IOUT=(kp* ( (1/Ti) Exdt))+Out0 太繁琐,实际使用中简化为以下三步几步:Ek=Sv-Pv; //Sv设定值,Pv当前值SEk+=Ek; //SEk 累计误差Iout=KI*SEk+Out0调整KI完成积分控制,但在实际调试过程中, 加上积分控制后,AGV的循线效果变差, 反复修改KI值依然如此。

考虑到陀螺仪本身就存在一定的漂移, 这会对积分控制产生影响, 所以最后未使用积分控制3、微分控制最近两次的偏差之差 Dk:Dk=Ek-Ek-1说明:Ek:当前的偏差Ek-1:基丁当前的前一个采样时刻的偏差值 (即上一次的偏差值);分析Dk: C >0:说明从上一采样时刻到当前误差有增大趋势Dk < =0 :说明从上一采样时刻到当前误差平■稳-<0:说明从上一采样时刻到当前误差有减小趋势结论:1. Dk能够说明从上次采样到当前采样的这段时间被控制对象的状态变化趋势,这种变化的趋势很可能会在一定程度上延续到下一个采样时间点, 所以可以根据这个变化趋势(Dk的值)对输出信号OUT进行调整,达到提前控制的目的2. Dk形如数学上的微分运算,反应了控制对象在一段时间内的变化趋势及变 化量,所以利用Dk对控制器输出信号进行调节的算法称为微分(differential ) 算法可以用数学模型表达为:Dout=Kp*(Td(de/dt))+Out0在实际使用中上述公式可简化为:DelEk=Ek-Ek_1; //最近两次偏差之差Dout=Kd*DelEk;〃微分输出三、PID算法形成1比例、积分、微分三种算法的优缺点分析:POUT= ( Kp*Ek) + Out0 --比例算法IOUT=kp* ( (1/Ti) Exdt)+Out0 --积分算法DOUT=Kp*(Td(de/dt))+Out0 --微分算法比例算法:只考虑控制对象当前误差,当前有误差才输出控制信号,当前没 有误差就不输出控制信号,也就是说只要偏差已经产生了比例算法才采取措施进 行调整,所以单独的比例算法不可能将控制对象的状态值控制在设定值上, 始终在设定值上下波动;但是比例控制反应灵敏,有误差马上就反应到输出。

积分算法:考虑了被控制对象的历史误差情况,过去的误差状况参与了当前 的输出控制,但是在系统还没有达到目标期间,往往会因为这些历史的误差对当 前的控制产生了干扰(即拖后腿),使用不当反而搅乱当前的输出但是在系统 进入稳定状态后,特别是当前值与设定值没有偏差时,积分算法可以根据过去的 偏差值输出一个相对稳定的控制信号, 以防止产生偏离目标,起到打预防针的效果微分算法:单纯的考虑了近期的变化率,当系统的偏差趋近丁某一个固定值时 (变化率为0),微分算法不输出信号对其偏差进行调整,所以微分算法不能单 独使用,它只关心偏差的变化速度,不考虑是否有偏差(偏差变化率为0时偏差 不一定是0).但是微分算法能获得控制对象近期的变化趋势, 它可以协助输出信号尽早的抑制控制对象的变化可以理解为将要有剧烈变化时就大幅度调整输出 信号进行抑制,避免了控制对象的大幅度变化以上三种算法综合起来产生一个当前的控制量对控制对象进行控制,它们的优缺点互补,即形成经典的PID算法2.PID算法数学模型OUT= Pout+ Iout+ Dout即:OUT=((Kp*Ek)+ Out0)+(kp* ( (1/Ti) Exdt)+Out0)+ (Kp*(Td(de/dt))+Out0)整理该式子得到:将各项的 Out0归并为OUT0。

OUT=kp( Ek+ ( (1/Ti) Exdt))+ (Td(de/dt)))+OUT0程序实现为:OUT=Kp*Ek+Ki*SEk+Kd*DelEk以上便是我对PID算法的理解附录是 PID程序源码附录一:PID.c#include "pid.h"PID pid; //存放PID算法所需要的数据 void PID_Init()(pid.Sv=openmv(); 〃初始角度值pid.Kp=(velocity.Tar_A/250) * 2.1; 〃比例系数pid.Ki=0.0005; 〃比例系数pid.Kd=0.05; 〃比例系数pid.T=100; //PID 计算周期pid.DST=0; 〃消抖时间 disappears shakes timepid.DCmax=50;pid.OUT0=0.01;}〃可调最大占空比void PID_Calc() //pid 计算(float DelEk; //最近两次偏差之差float out;pid.Kp=(velocity.Tar_B/250) * 2.15; 〃比例系数pid.Kd=(velocity.Tar_B/250)*0.05; 〃比例系数openmv();pid.Pv=0.05 * Position_Deviation + 0.95 * Angular_Offset;t3.PID_Flag=0;pid.Ek=pid.Pv; 〃得到当前的偏差值pid.Pout=pid.Kp*pid.Ek; // 比例输出pid.SEk+=pid.Ek; //历史偏差总和pid.Iout = pid.Ki*pid.SEk; // 积分输出if(pid.Iout>pid.DCmax) //计算出的理论输出数据过大( pid.Iout=pid.DCmax;}else 。

下载提示
相似文档
正为您匹配相似的精品文档