PID部分的学习

上文介绍了ADRC的理论,并试着按照自己的理解用Matab编程实现韩老师论文中的算法,但是对调节参数和一些地方还不太懂,因此我打算从头开始理解,从PID的好坏开始学习理解,看Kp,Ki,Kd参数对系统的影响。
此文中参照了这个文件,SUNPLUS的PID调节控制做点击速度控制,其中封面图片如下:

还有,一个blibli上的视频课程,名字叫做:用Matlab调节PID;
还有看了一个博主写的基于matlab程序对PID控制算法的理解,链接为:https://blog.csdn.net/sinat_23338865/article/details/53837634

一、PID的介绍及其表示式


传统PID采用的是误差调控的方式,其中采用的是比例,积分,微分加权和的方式,这样控制可以反应过去的误差,现在的误差,未来的‘误差对影响,通过调节Kp,Ki,Kd三个参数,就可以调节加权和,满足当前系统的控制,从而满足期望控制要求。

其中在连续的一般用于计算机仿真中进行测试或者帮助学习理解,在生活中常用的有两种形式,一种是增量式PID,一种是位置式PID。下面进行介绍,

a.位置式PID


在位置式的PID中,比较容易理解,比例部分就是当前的误差部分,积分部分相当于把以前的误差全部累加,然后微分环节在T足够小的时候,两个相邻的误差除以采样时间T可以近似看作微分环节。这样通过调节Kp,Ki,Kd,就可以实现加权和控制。
但是存在一个缺点,积分控制是之前的一直在累加,因此计算量过大,在日常中并不常用,因此采用增量式PID。

b.增量式PID


通过2-2式子和2-4式子相减做差得到,PID增量式算法:

这样我们只用调节A,B,C就可以满足控制的要求,而PID输出U = deltaU + U(k - 1),这样就可以完成PID控制器了。

**

二、实践理解

a.通过simulink搭建理解

其中输入的信号有可以调节的规则信号和噪声,通过滤波器,之后通过PID控制,控制对象假设为:
G(s) = 1/(s^2 + 3s + 1)
通过调节PID参数来看控制效果,结果如下:
Kp = 24;Ki = 10.4; Kd = 12,图像为:


当Kp = 40; Ki = 2; Kd = 15的时候,图像为:


可以通过调节参数,来看看控制情况,不过一般不清楚最优效果是什么,一般多试,然后记录以后选择相对最优的参数作为控制PID参数。

b.通过Matlab编程——连续型

这里是看了b站的一个视频,看最上面提到的引用。然后通过先调节Kp,再调节Kd,最后调节Kd,最后得出三个参数调节以后的影响。
这里选择的被控制对象还是上面提到的那个,下面是代码部分:

clear
clcnum = 1;
den = [1 3 1];
Gp = tf(num,den);
H = 1;M = feedback(Gp,H);
step(M);
hold onKp = 24;
Ki = 10.4;
Kd = 10;Gc = pid(Kp,Ki,Kd);
N = feedback(Gp*Gc,H);
step(N);
grid on;

参数调节按照这样的方式,先让Kd,Ki都为0,调节Kp。然后选择超调量在20%左右以后的Kp值保持不变了,接下来调节Kd,让超调消失,但是接下来又出现了问题,达不到期望值,因此调节Ki,让目标达到期望值,且不产生太大超调,这是实现图像和结论。
调节Kp时候的图像:


其中曲线是这样的,随着Kp的增大,曲线越贴近y轴,但是超调会不断的增大,而且始终存在稳态误差,稳定的值一直到不了期望值 y = 1 处。
结论:随着Kp的增大,上升时间ts明显减少,可以很快的达到期望值,但是超调量delta%在过了期望值以后会逐渐增大,从而导致调节时间ts也增加,波动变化较大,会存在稳态误差。

调节Kd后的图像:

随着Kd的增大,曲线越来越靠近y轴,并且超调量逐渐减小,但是稳定值也不能到期望值,但是非常的接近了,而且可以减小超调。
结论:在Kp保持不变的条件下,随着Kd的增大,超调量逐渐减小,调节时间也逐渐变短,斜率在上升阶段特别陡,可以很快的接近期望值附近,但是有一个大的弊端:上升时间大大增长,而且在不超调情况下,难以达到期望值(精度不够)。因此在基本控制中基本PD控制就可以满足要求,如果高精度控制需要加上I控制,那样可以满足精度。

调节Ki以后得到的图像:

随着Ki的增大,可以增大达到期望值的速度,满足精度的要求,但是随着Ki的增大,会出现超调,调节时间也会增大,但是稳态误差消除了。
结论:通过保持Kp,Kd参数不变的条件下,调节Ki参数。随着Ki的增加,会发现当前值离期望值越来越近,上升时间会减少,但是当Ki过大以后,会出现超调现象,且调节时间会增加。很大的好处是可以满足精度要求。

分析后结论:
总结:
1.Kp最大好处是可以很快接近期望值附近,会有超调和稳态误差。
2.Kd最大好处是可以以较快时间接近期望值附近,可以消除超调,但是无法准确达到期望值。(快)
3.Ki最大好处是可以接近期望值,提高精度,但是会发生超调。(准)
整体实现稳定效果。

c.通过Matlab编程——离散型(增量式)
这里是通过一篇博客的学习,看最上面的引用,然后自己改了一些输入和理解,写的离散PID增量式PID,其中控制对象需要进行Z变换,然后Z变换以后要写成递推式,然后通过时序关系得出系统输出。
代码如下:

% Someone write discrete PID code
% This is increment_ways algorithm program
% Signal:step, sinusoidal, sample time is 1ms,interger limit is [-5,5];clear
close all;
Sample_Time = 0.001;                  %Sample time
sys = tf(50,[0.125,7,0]);             %sys is transter function
disc_sys = c2d(sys,Sample_Time,'z');  %discrete system
[num,den] = tfdata(disc_sys,'v');     %Get numerator array and denonimator arrayu_1 = 0.0;                            %u last
u_2 = 0.0;                            %u previous
y_1 = 0.0;                            %y last
y_2 = 0.0;                            %y previous
Three_Component = [0.0,0.0,0.0]';                   %X vector
delta_u = 0.0;                        %u incrementError_1 = 0;                          %Error last
Error_2 = 0;                          %Error previousfor k = 1:1000time(k) = k*Sample_Time;          %Time sequence,dt more little,acurency will be better.S = 2;                            %Choose input signal.switch Scase 1Kp = 5;Ki = 0.035;Kd = 1.6;if k <= 300Input(k) = 0;elseInput(k) = 1;endcase 2Kp = 10;Ki = 0.1;Kd = 15;Input(k) = 0.5*sin(2*pi*k*Sample_Time);  case 3% Step signal + noise.Kp = 10;Ki = 0.2;Kd = 14;if k <= 300Input(k) = 0 + 0.05*rand;elseInput(k) = 1 + 0.05*rand;endcase 4 % Slope signal add noiseKp = 1;Ki = 0;Kd = 0;Input(k) = 1.1*(k) + 100*rand;case 5Kp = 188;Ki = 2.5;Kd = 1.9;Input(k) = 0.9*k.^2;case 6Kp = 100;Ki = 0.7;Kd = 5.6;Input(k) = 0.5*cos(2*pi*k*Sample_Time) + 2*sin(9*pi*k*Sample_Time) + 1.5*cos(7*pi*k*Sample_Time);  enddelta_u(k) = Kp*Three_Component(1) + Kd*Three_Component(2) + Ki*Three_Component(3);  %This is the increment error's three sub_vector.u(k) = u_1 + delta_u(k);                   %This is PID's output.U1 is last PID out.if u(k) >= 5                               %This is PID output limit.u(k) = 5;endif u(k) <= -5u(k) = -5;end%Linear model%Note: z*u(z)  <------>  u(k + T)Out(k) = -den(2)*y_1 - den(3)*y_2 + num(2)*u_1 + num(3)*u_2;   %This is contoller output.Error(k) = Input(k) - Out(k);                                  %This is Error_Now.u_2 = u_1;                %Update PID_Out.It likes sliding windows.                                     u_1 = u(k);               y_2 = y_1;                %Update TF_Outy_1 = Out(k);Three_Component(1) = Error(k) - Error_1;                %Kp partThree_Component(2) = Error(k) - 2*Error_1 + Error_2;    %Kd partThree_Component(3) = Error(k);                          %Ki part Error_2 = Error_1;                        %Previous Error UpdateError_1 = Error(k);                       %Last Error Update.endsubplot(2,1,1);plot(time,Input,'b',time,Out,'r');ylabel('Input,Out');subplot(2,1,2);plot(time,Error,'r');xlabel('time(s)');ylabel('error');

结果如下:
S = 1时候为阶跃信号:

S = 2,为正弦信号

S = 3,为阶跃信号 + 扰动

剩下的斜坡信号和加速度信号,系统追不上,处于发散状态,因此需要自动控制原理上进行分析,选择可以收敛的进行分析,这个需要按照项目需要来满足要求。

接下来开始学习LADRC的相关知识。

LADRC的学习——PID的学习相关推荐

  1. PID的学习与理解(一)

    PID的学习与理解 前言 什么是PID? PID的公式与讲解. PID的伪代码操作 公式变换 如何调节PID呢? 总结 前言 最近在做SRT,方向是足式机器人,,例会上老师要求我们学习PID这一有趣的 ...

  2. 【MATLAB强化学习工具箱】学习笔记--actor网络和critic网络的结果放在哪里?

    原算例见 [MATLAB强化学习工具箱]学习笔记--在Simulink环境中训练智能体Create Simulink Environment and Train Agent_bear_miao的博客- ...

  3. 学习动力之“学习金字塔 (爱德加•戴尔)”理论

    一.什么是学习金字塔? 学习金字塔是美国缅因州的国家训练实验室研究成果,它用数字形式形象显示了:采用不同的学习方式,学习者在两周以后还能记住内容(平均学习保持率)的多少.它是一种现代学习方式的理论.最 ...

  4. edit怎么读英语_名师说学习:英语学习有方法

    如何学好英语,是困扰每一个英语学习者的问题.从多年英语教师的角度,巨人英语的老师和大家分享自己的看法. 汪维老师 /Profile/ 巨人学校金牌教师 从事英语教育工作16年 精通新概念.剑桥.中高考 ...

  5. 关于编程的浅学习与深学习

    导读:Tanky Woo的程序人生在博客中发表了<关于编程的浅学习与深学习>,文章是关于编程学习的一个提议.归纳.总结. 以下是文章全部内容: 关于编程的学习,大家肯定都知道,也是大家都说 ...

  6. 韩国文档的编码方式_像韩国学生学习英语一样学习编码

    韩国文档的编码方式 by Stephen Mayeux 斯蒂芬·马约(Stephen Mayeux) 像韩国学生学习英语一样学习编码 (Learn to code like a Korean stud ...

  7. ICML2018见闻 | 迁移学习、多任务学习领域的进展

    作者 | Isaac Godfried 译者 | 王天宇 编辑 | Jane 出品 | AI科技大本营 [导读]如今 ICML(International Conference on Machine ...

  8. 高效学习方法论的学习笔记

    Author:鲁力(地山) 0.前言与致谢 如何提高学习效率?这一问题长期以来都是网上讨论的热点话题,就这一问题网上很多大咖以书籍.博客.知乎回答.视频等不同形式都发表过自己的观点见解和方法论.笔者在 ...

  9. B站上线!DeepMind加UCL强强联手推出深度学习与强化学习进阶课程(附视频)

      新智元报道   编辑:元子 [新智元导读]DeepMind和伦敦大学学院(University College London,UCL)合作,推出了一个系列的深度学习与强化学习精品进阶课程.该课程内 ...

最新文章

  1. Maya初学者完整的3D动画大师班视频教程
  2. golang strings Replace 字符串替换
  3. sqlite to mysql_SqliteToMysql官方版
  4. scala学习-11-package object
  5. hive中导入csv,本地CSV导入hive表
  6. python格式输出占四列左对齐_python – 打印字符串左对齐,固定宽度和后缀
  7. 1019 General Palindromic Number
  8. 决定成败的人生细节(转)
  9. Delphi GDI对象之绘制文本
  10. ServiceStack.Redis之IRedisClient(转载)
  11. Android基于代理的插件化思路分析
  12. 联通微服务怎么还款_重磅!中国联通推出微信签约代扣新功能
  13. 高等数学-用等价无穷小求极限题集
  14. libcef-详细步骤-将cef浏览器嵌入到Win32中作为子窗口运行
  15. 电子科技大学软件工程860考研专业课真题考频总结
  16. wow.js插件,让滚动动画更简单,让生活更美好
  17. MDK 使用 ST-Link 下载出现 target dll has been cancelled 的错误的解决方法
  18. 风控Python绘图技法代码示例
  19. python 蒙特卡罗法求π值
  20. Word多级标题设置,一级标题是汉字数字,其他级别是阿拉伯数字

热门文章

  1. 双层卷积神经网络--tf
  2. Tensorflow使用教训:被tf.image.resize浪费的60天
  3. 2015阿里秋招当中一个算法题(经典)
  4. ORACLE 建库过程总结
  5. 开发LED屏幕页面遇到的问题
  6. 读jQuery源码释疑笔记3
  7. 互联网寒冬,程序员该怎样突破重围?
  8. about command : wget
  9. 绿盟科技亮相中国石油石化企业信息技术交流大会
  10. 团队第一阶段站立会议05