PID的学习与理解(一)
PID的学习与理解
- 前言
- 什么是PID?
- PID的公式与讲解。
- PID的伪代码操作
- 公式变换
- 如何调节PID呢?
- 总结
前言
最近在做SRT,方向是足式机器人,,例会上老师要求我们学习PID这一有趣的东西,对于新手的我来说只知道个PDD GDP 。于是乎,在广泛的搜索资料和摸索中,也是勉勉强强了解了一下什么是PID。
什么是PID?
什么是PID呢?相信在网络上已经有很多的PID的解释了,解释大多有趣好动,在这里我也简单的说一下。
PID是一种在实验控制中广泛运用的一种控制器,它通过p(比例)I(积分)D(微分),将偏差的比例积分微分通过线性组合构成控制量,用该控制量对受控对象进行控制,这就是PID算法。
举个有趣的例子:
在家中洗澡的时候,往往是用手来调节水的温度,所以每当冬天洗澡,我就会缩成一团 。用手调节温度往往是不好的,有的时候调小了,有的时候调大了,对人的身体健康都是有害的,这个调节过程我们就可以将他近似地想成是一个PID肉体控制器~。
P:P总是获得水温的差度。由于每次改变的是误差,所以我们可以把它想象成一个加热器,我们如果想要把水温升到某一温度时,我们需要加热,温差过大就开足马力加热,太小则稍微加热,建立一个一次函数的关系,就可以实现最基本的“比例”控制了,Kp大,调节作用会越激进,Kp变小可以让调节作用更保守。但是每次加热不可能稳稳的加热到需要的温度,总是在其上下徘徊。因为我们每次增加的数值往往并不能够与目标值相差为零,一旦不为零,就会造成超出或不够,自然是上下徘徊。
D:所以我们又引入D这一个变量,使用它时我们可以让被控制的物理量的“变化速度”趋于0,即类似于“阻尼”的作用(类似于斜率)可以让其温度震荡变小,直至震荡为零,稳稳地到达设定的水温。但是有的时候由于外界作用,加热和散热功率相等,导致如果我们加热到100度,则只能加热到80度上不去了。为了消除这个误差,使我们的水温变回去。
I:所以我们又引入I这个概念,它可以用来消除“静态误差”。所以我们设置一个积分量。只要偏差存在,就不断地对偏差进行积分(累加),并反应在调节力度上。
PID的公式与讲解。
PID说是PID但是有时候只有PI/PD,并无完全使用P.I.D.
PID
P:(比例模块)
其就等于一个变量KP,他来乘以我们的error(偏差值),构成kp*error(t)
举个简简单单的例子:当我们想把水温跳到从0到10时,我们设定每次增加其偏差值的一半也就是kp=0.5,于是乎
- 第一次:0+0.5*10=5
- 第二次:5+5*0.5=7.5
- 第三次:7.5+2.5*0.5=8.75
- 第四次:…
这样一来就能够慢慢的加到我们所需要的那个10了。
I:(积分模块)
积分则是误差在一定时间内的和,积分作用是其误差变化的“面积”。面积即为积分作用的结果,其不断累积的误差,最终乘以积分系数K i就得到了积分部分的输出,也就是说其值就是error偏差变化的曲线与x,y轴的面积,它可以消除稳态误差,帮助我们达到我们所需要的值。
从另一个角度看,我们可以将这个面积细分成许许多多个小矩形,随着时间的延长,所加的矩形面积也越小,从而如果出现了稳态误差,小矩形面积不为零,则可以进行加操作直到没有。
D:(微分模块)
微分则是误差变化曲线某处的导数,或者说是某一点的斜率当偏差变化过快,微分环节会输出较大的负数,作为抑制输出继续上升,从而抑制过冲。所以我们可以把它叫成“阻尼”模块,它可以在突然变化太大时调整曲线,从而慢慢地变成平稳的直线(偏差为0).
PID的伪代码操作
接下来我们要进行伪代码的操作
我们在c的环境下实现一下。
P:
PI:
PID:
至于PD,把PID拆开就好啦~~
主要是懒emmmmm
公式变换
PID标准公式在上面已经展现出来了,下一步为了运用我们要将它进行变换:
之后我们要将它进行离散化
为什么要将他离散化,直接这样用不香么?
因为:
在计算机中实现,我们要将它离散化。为什么要离散化?
因为计算机处理的是离散信号,我们研究的理论最后需要计算机处理,所以要离散化。
由于PID的算法可以通过计算,用计算机进行实现,从而形成数字式的PID控制器。当采样周期T足够短时,我们可以用求和代替积分,用差商代替微分,是连续系统的PID算法离散化
所以为了之后在matlab等仿真软件上模拟,我们需要将他离散化。
也就是:
对于:
P模块没有改变.
I模块变成了一个一个的矩形面积相加求和(面积).
D模块则是前一个与后一个的插值(导数)
此后我们可以从离散化的公式中,我们可以知道比例控制是每次的误差值,而积分控制是每次误差的和;微分控制是这一次误差与上一次误差的差值。
如何调节PID呢?
PID写出来并不难,难就难在与如何对他的调整,这对使它实际运用中有重要意义。重要的是:目前我也不会调这个东西emmmmmm 。
第一步:将Kp、Ki和Kd设置为0。这样可以有助于我们开始调整。
第二步:增加Kp直到误差相当小,这样可以保证我们大部分调整正确(P是pid中最重要的,将他调好可以有利于我们的下一步工作)。
第三步:增加Kd,直到任何超过你可能拥有的覆盖面积(因为他上面的公式中就是求面积)。
第四步:增加Ki,直到任何仍然存在的错误被消除。由于ki是基于斜率的,所以我们应该从小值开始调整。
第五步:使用调整常量的规则,可以根据经验来更改一些常量,以使其工作到最佳性能。
还有一个到处都可以看见的口诀:
调试口诀
参数整定找最佳,从小到大顺序查,先是比例后积分,最后再把微分加,
曲线振荡很频繁,比例度盘要放大,曲线漂浮绕大湾,比例度盘往小扳,
曲线偏离回复慢,积分时间往下降,曲线波动周期长,积分时间再加长,
曲线振荡频率快,先把微分降下来,动差大来波动慢,微分时间应加长,
理想曲线两个波,前高后低4比1。
总结
P-比例误差,这个误差在真实值和预期值之间。
error = (target value) – (sensor reading)
I – 先前误差的运行和(面积),用于在误差很小的时候进行精细的调整。
integral = integral + error*dT
D – 误差的变化(导数),用来预测下一个误差可能是什么。
derivative = ( (current error) – (previous error) ) / dT
将三个组件放在一起,就可以开始调整Kp、Ki和Kd的精确值了。
ps:再有时间在更新下我学的吧,初学者也不太会,就只能现学现卖啦!
新手求喷emmm(ε=ε=ε=┏(゜ロ゜;)┛)。
PID的学习与理解(一)相关推荐
- 【平衡车】PID控制原理到底如何理解?建议收藏!
文章目录 前言 PID算法 PID算法的形成 P算法,即比例控制算法: I算法,即积分控制算法 D算法,即微分控制算法 PID总体的数学模型: 基于单片机的PID控制算法: 单片机中的PID算法的表达 ...
- 《C++应用程序性能优化::第五章动态内存管理》学习和理解
<C++应用程序性能优化::第五章动态内存管理>学习和理解 说明:<C++应用程序性能优化> 作者:冯宏华等 2007年版. 2010.8.29 cs_wuyg@126.com ...
- 【赠书】新手速递!深度学习视频理解!
视频理解是当前计算机视觉研究领域中备受学术界和工业界关注的方向,随着视频行业的高速发展,如何利用 AI 技术更好地对视频内容进行理解变得越来越重要.今天要给大家介绍的书是<深度学习视频理解 ...
- 9月21日云栖精选夜读 | 如何优雅地从四个方面加深对深度学习的理解
在今年的 ICML 上,深度学习理论成为最大的主题之一.会议第一天,Sanjeev Arora 就展开了关于深度学习理论理解的教程,并从四个方面分析了关于该领域的研究:非凸优化.超参数和泛化.深度的意 ...
- 《C++应用程序性能优化::第二章C++语言特性的性能分析》学习和理解
<C++应用程序性能优化::第二章C++语言特性的性能分析>学习和理解 说明:<C++应用程序性能优化> 作者:冯宏华等 2007年版.最近出了新版,看了目录,在前面增加了一章 ...
- 如何优雅地从四个方面加深对深度学习的理解
在今年的 ICML 上,深度学习理论成为最大的主题之一.会议第一天,Sanjeev Arora 就展开了关于深度学习理论理解的教程,并从四个方面分析了关于该领域的研究:非凸优化.超参数和泛化.深度的意 ...
- [机器学习]正则化项L1和L2的学习与理解
正则化项L1和L2的学习与理解 一,正则化(Regularization) 稀疏模型与特征选择的关系 二, 为什么L1产生稀疏模型而L2可以防止过拟合 1, L1和L2正则化的直观理解 正则化和特征选 ...
- 递归求全排列的学习与理解
递归求全排列 全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列. 例题: 输出自然数 1 到n所有 ...
- Faster RCNN原理篇(一)——Bounding-Box Regression边界框回归的学习和理解
Bounding-Box Regression边界框回归的学习和理解 引言 1. (Why?)为何要做边框回归? 2. (What?)什么是边框回归? 3. (How?)如何实现边框回归? 4. 边框 ...
最新文章
- linux中使用CST时间
- QPS过万,redis大量连接超时怎么解决?
- 计算机 时代,计算机时代,你准备好了吗
- HDLBits 系列(14) Latch and Dff and Edge detect
- 存在网路的情况下重命名SDE中数据图层错误(The orphan junction feature class cannot be renamed)...
- java 读 xml_Java读写XML代码示例
- LQR轨迹跟踪算法Python/Matlab算法实现2
- CAN笔记(6) CAN协议(一)
- 你的php网页乱码了吗
- LeetCode-2: Add Two Numbers
- 2022新版WIFI营销微信小程序源码+三级分销
- 熵简技术谈 | 金融情绪分析真的有用吗?一起来看金融情绪分析的研究进展及应用实践
- 手机变为电脑的摄像头,使像素高清起来-使用DroidCam
- E盾网络验证介绍以及教程分享
- python 情感分析实例_使用python+机器学习方法进行情感分析(详细步骤)
- (六)【模电】(基本放大电路)静态工作点的稳定
- mysql secure file_mysql load data secure-file-priv问题
- JavaFx教程-03JavaFX Application的生命周期
- 学习django教程一
- 真彩色图像数据量 计算_计算机基础:图形、图像相关知识笔记