PID:我应该何时计算积分项?
最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助。作者Brett Beauregard的原文网址:http://brettbeauregard.com/blog/2011/07/pid-when-should-i-compute-the-integral-term/
最近有一个建议张贴到初学者的PID系列。争议的焦点是,如果您解决拉普拉斯域中的问题,它指定了执行积分项的不同方式。评论人士建议,与其看某一点的误差总和,不如看最后一个点的总和。
因此,当前的代码是这样的:
/*Compute all the working error variables*/
double input = *myInput;
double error = *mySetpoint - input;
ITerm+= (ki * error);
if(ITerm > outMax) ITerm= outMax;
else if(ITerm < outMin) ITerm= outMin;
double dInput = (input - lastInput); /*Compute PID Output*/
double output = kp * error + ITerm- kd * dInput;
建议是这样的:
/*Compute all the working error variables*/
double input = *myInput;
double error = *mySetpoint - input; double dInput = (input - lastInput); /*Compute PID Output*/
double output = kp * error + ITerm- kd * dInput; ITerm+= (ki * error);
if(ITerm > outMax) ITerm= outMax;
else if(ITerm < outMin) ITerm= outMin;
我从未见过这样做,但我想我应该试一试。我设计的测试是一个简单的设定值阶跃,然后是一个斜坡下降。

当控制器设置为默认的采样时间时,差异是无法察觉的。为了突出这两种方法之间的差异,我决定将PID采样时间从默认值100mS提高到5秒。

这里我们可以看到一个明显的赢家。现有的PID代码的性能比建议的要好,这可能是因为积分项对进程更改的响应要早5秒。但是为了确保我没有遗漏任何东西,我决定再做一次测试。我没有改变设定值,而是在系统中引入了负载变化。

同样,现有的 PID 代码性能更好,处理负载变化更快。
那么判决呢?虽然这是一个有趣的锻炼,但我认为结果很清楚。我会保持原来的代码。
欢迎关注:

PID:我应该何时计算积分项?的更多相关文章
- Opencv中integral计算积分图
Paul Viola和Michael Jones在2001年首次将积分图应用在图像特征提取上,在他们的论文"Rapid Object Detection using a Boosted Ca ...
- PID教程
PID教程 介绍 本教程将向您展示了比例每一个比例项 (P)的特点,积分项(I)和微分项 (D) 控制,以及怎样使用它们来获得所需的响应.在本教程中,我们会考虑下面单位反馈系统: Plant[被控对象 ...
- PID算法笔记2
总所周知,PID算法是个很经典的东西.而做自平衡小车,飞行器PID是一个必须翻过的坎.因此本节我们来好好讲解一下PID,根据我在学习中的体会,力求通俗易懂.并举出PID的形象例子来帮助理解PID.一. ...
- PID算法(c 语言)(转)
PID算法(c 语言)(来自老外) #include <stdio.h> #include<math.h> //定义PID 的结构体 struct _pid { int pv; ...
- PID 通俗解释
PID 控制原理3 个故事:看完您就明白了.1.: PID 的故事小明接到这样一个任务:有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就 ...
- PID控制器开发笔记之四:梯形积分PID控制器的实现
从微积分的基本原理看,积分的实现是在无限细分的情况下进行的矩形加和计算.但是在离散状态下,时间间隔已经足够大,矩形积分在某些时候显得精度要低了一些,于是梯形积分被提出来以提升积分精度. 1.梯形积分基 ...
- PID算法(c 语言)(来自老外)
#include <stdio.h> #include<math.h> //定义PID 的结构体 struct _pid { int pv; // integer that c ...
- PID控制器的应用:控制网络爬虫抓取速度
一.初识PID控制器 冬天乡下人喜欢烤火取暖,常见的情形就是四人围着麻将桌,桌底放一盆碳火.有人觉得火不够大,那加点木炭吧,还不够,再加点.片刻之后,又觉得火太大,脚都快被烤熟了,那就取出一些木碳…… ...
- PID控制算法
PID控制算法 四轴如何起飞的原理 四轴飞行器的螺旋桨与空气发生相对运动,产生了向上的升力,当升力大于四轴的重力时四轴就可以起飞了. 四轴飞行器飞行过程中如何保持水平: 我们先假设一种理想状况:四个电 ...
随机推荐
- 第五次博客作业——Alpha2项目的测试
格式描述: 这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 你的代码我的发 这个作业的目标 选取非自己所在团队的3个项目进行测试,并写出 ...
- Luogu P2114/ACAG 0x01-5 起床困难综合征
Luogu P2114/ACAG 0x01-5 起床困难综合征 本题的关键之处在于,题目中给定的三种位运算--AND,OR,XOR,在二进制下皆是不进位的.这说明每一位都是独立的,启发我们可以按位考虑 ...
- js 函数的this指向
一. 1.es5: 函数里的this指向分两种,一种正常函数调用指向被调用的对象,比如: test=()=>{ console.log(this) }; test();//是当前window调用 ...
- 利用avicap32.dll实现的实时视频传输
直接上代码吧! 在窗体上调用的类: using System; using System.Collections.Generic; using System.ComponentModel; using ...
- git下载带有子项目的项目
我用的win 系统 bash命令 git clone --recursive xxxx.git
- SparkSQL读写外部数据源-json文件的读写
object JsonFileTest { def main(args: Array[String]): Unit = { val spark = SparkSession .builder() .m ...
- Import declarations are not supported by current JavaScript version
原因为:不支持当前的js版本,在perference中进行设置javascript的版本即可 注意:在perference中进行更改,而不是defeaut perference,快捷键操作为:comm ...
- [Web] Adaptive loading
There is pretty good talk about performacne https://www.youtube.com/watch?v=puUPpVrIRkc It targets t ...
- B/S结构与C/S结构测试区别
B/S结构与C/S结构 B/S结构是浏览器/服务器结构,应用软件的业务逻辑完全在服务器端实现,客户端只需要通过浏览器完成浏览.查询.输入等简单操作. C/S结构是客户端/浏览器结构,客户端具有一定的数 ...
- WinDbg常用命令系列---!heap
!heap 简介 !heap扩展显示堆使用信息.控制堆管理器中的断点.检测泄漏的堆块.搜索堆块或显示页堆信息.此扩展支持段堆和NT堆.使用!heap没有参数列出所有堆及其类型的堆. 使用形式 !hea ...