5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 8556|回复: 42
打印 上一主题 下一主题

闲谈 PID

  [复制链接]
跳转到指定楼层
楼主
发表于 2019-6-16 17:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从N年前接触飞控,就知道PID。但是,始终也没有搞懂PID。即使翻阅了无数网页,也没有结果。可能是我本人太笨。我总以为,如果真的是理解了,知道什么是PID,那么便可以用自己的话,最简单的说出来。否则,就是一知半解。如果真的理解,就可以举出来成千上万的例子,特别简单的例子。否则,就不是真的理解。

但是在互联网上,在实体书店里面,所有的资料,都是你抄袭我来,我抄袭你,举出的例子,说话的口径,就这么几类。跳出这几类,就没有其他的说法了。而最要命的是,这些类里面,对于某些问题说的都非常模糊。回避了要点。

因此,N年过去了,蠢笨的我依旧不懂得PID。

让我先来说其中的一个问题,什么是P。说起P来,无人不知,无外乎:比例控制么。

但是,为撒比例控制会有静差?而且无法消除?这个问题就撂倒99.9的人。如果不理解这一点,就称不上知道什么是P。

再说第二个问题I。
如果我根据音箱的响度来调节音量旋钮,那么这里面有没有I参与?我觉得,如果真能在这2个问题上说清楚,说明白了,才算是懂了PI。

评分

参与人数 2威望 +4 模币 +20 收起 理由
cola2cool + 2 + 10 很给力!
唐山悟空 + 2 + 10 非常好的技术贴,鼓励一下

查看全部评分

欢迎继续阅读楼主其他信息

沙发
 楼主| 发表于 2019-6-16 18:31 | 只看该作者
那么接下来,显然,P已经玩不转了。那么怎么办?无所作为?一直任由P失灵的现状一直存在?那当然不行,我们不要那样,我们要改变,我们希望我们的控制目标达成。于是,就产生了I控制。

不要以为I(积分控制)多么NB,恰恰相反,它也非常机械,非常LOW。不信,让我说给你听。
这个时候,误差恒定,输出恒定,那么我们必须要想办法让输出继续增加,然而,这个时候误差恒定了,如何打破恒定呢?对了,随着时间的增加,我们把误差累加,然后再继续进行P控制。这个时候由于误差累加了,那么P当然也增加了,于是温度继续朝着目标前进。一直到什么时候结束?一直到温度达到了目标。(这是我猜的,其实怕没有那么智能)我现在只知道,随着时间误差如果一直在那里,I就会一直累积误差,然后让P机构一直可以运行。根据P机构的原理,如果到最后没有误差,误差为0了,那么自然P机构就不再输出了。这个时候,目标就达到了。因此I只是作为P的一种辅助的弥补手段而存在的。

那么P的进行过程是四平八稳的,它不能根据误差变化的速度,控制量给出的速度产生变化,这就是另外一个缺陷,因此引入了D。我们监控误差变化的速度,如果误差变化速度快,我们就让控制量变更大,这样来让控制量给出的更大,控制效果(也就是速度)提上来。

因此,所谓的ID控制,一个是监测时间累积误差,一个是监测误差变化的速度。都是为了弥补P的缺陷而存在。

3
 楼主| 发表于 2019-6-16 18:34 | 只看该作者
因此,在实现上,以上三者也是非常的容易用计算机来实现。对于P,那么直接就是把误差乘以比例系数(比例系数是多少,需要用经验和实验来确定)。
对于I,简单的累加误差,然后加权到原来P控制里。
对于D,把2个误差相减,然后加权到原来的P控制里。

因此对于PID控制,最后的控制量不单纯是P的结果,而是三者根据权重相加的结果。

4
 楼主| 发表于 2019-6-16 18:35 | 只看该作者
以上的说法,都是我自己的想法,有的是猜测,自然有疏漏或者谬误,因此大家如果觉得有什么不对,尽情的可以喷。
5
发表于 2019-6-16 18:45 | 只看该作者
本人来试着回答下:
根据系统开环传函当中包含的积分项个数来对系统分类:没有积分项叫0型系统,一个积分项为1型系统,两个积分项为2型系统。
输入单位解决信号x(t)=1,拉氏变换X(s)=1/s,Ess(误差)=lim s/(H+G×H)*X(s),当G开环传函不包含积分项(0型系统)时,Ess=1/(1+k),因此无法消除。
要消除稳态误差,需要系统高于1型系统。

第二个问题看你编程的思路,对模拟电路不懂,。
6
 楼主| 发表于 2019-6-16 18:47 | 只看该作者
本帖最后由 tcjsjxx 于 2019-6-16 22:32 编辑

其实我有时候真的是觉得,这些搞理论,搞专业的人,真的是随心所欲,尤其在滥用名词方面都是一把好手。什么积分,什么微分都敢用到这样一种简单的控制机制里面。设想,如果刚开始有人就这样简单的给我讲出来,我绝对不至于在这么简单的问题上耗费N年的时间了。

那么同理,其他看起来NB哄哄的东西,其本质一定是非常EASY,因为任何东西的诞生,都是从简单开始的。没有那种一开始就各种稀奇怪癖的名词任意滥叠加成一个个恐怖的怪物。

要知道,滥用一个名词,对于初学者而言,他们都觉得要开始学习一个新的学科!比如积分控制,一个初学者一看,就吓到了,我的妈呀,我对于微积分一头雾水啊,当年就缴械了,这还怎么弄下去啊。即使意志坚定点,开始学微积分,然后精力陷阱和时间陷阱模式就开启了,这个人的注意力被转移到微积分后,耗费大量时间和精力后,直到精疲力尽都未必能搞透微积分。而当他搞定了微积分以后,精力已经被消耗了95%,而这个时候,他自己认为自己距离目标很接近了(他以自己付出量来感知和目标之间的距离,付出越多,收获越多么),但是其实,他才刚刚开始!这种精力,时间消耗模式导致很严重的后果,很多搞研究的人,被活活耗死在这个过程中,就像在一坨鼻涕里的小虫,向极力摆脱,却怎么也出不来。

而到最后,你可以看到,微积分在PID里面,其实就是简单的加减。如果你硬要觉得把加减说成微积分才有仪式感,B格才够高,那么就当我没说。

至于飞控里面的离散余弦矩阵变换,欧拉角,坐标变换,我觉得跟PID一个德行,都被所谓的“砖家”玩坏了。这些概念的内涵,必定非常EASY!因此,我提倡在专业化的科学里面,提倡去名词化。(尤其对于科普)

一个个简单而实用的理念,就这样被一个个,一堆堆恐怖的名词打扮成纸糊的怪兽,然后远离普通人。让多少人望而却步的后果,就是大家永远徘徊在深层次的知识之外,永远是一个玩票的,永远有劲没处使,永远无所作为。

所以,我希望大家都开始反抗,都开始通俗化高深的东西。如果我们这一代不行,起码可以给我们的后代子孙打下一个好的基础。巴西足球为撒强?就是因为全民普及!如果我们的科技知识全民普及,那么科技创新就有了雄厚的基础,科技是第一生产力就绝对不是一句空话,我们现代的教育体制都要改写。卧槽,思路跑哪里去了,打住打住。
7
发表于 2019-6-16 18:51 | 只看该作者
tcjsjxx 发表于 2019-6-16 18:47
其实我有时候真的是觉得,这些搞理论,搞专业的人,真的是随心所欲,尤其在滥用名词方面都是一把好手。什么 ...

这段内容不敢苟同!
8
 楼主| 发表于 2019-6-16 18:53 | 只看该作者
ZAKEL 发表于 2019-6-16 18:45
本人来试着回答下:
根据系统开环传函当中包含的积分项个数来对系统分类:没有积分项叫0型系统,一个积分 ...

直接跪了,不懂开环函数啊。
9
 楼主| 发表于 2019-6-16 18:55 | 只看该作者
每次都这样,当我有一个不懂的时候,你们总是用5个,甚至10个我不懂的概念来试图搞垮我~~~~~~~~~
10
发表于 2019-6-16 18:57 | 只看该作者
tcjsjxx 发表于 2019-6-16 18:55
每次都这样,当我有一个不懂的时候,你们总是用5个,甚至10个我不懂的概念来试图搞垮我~~~~~ ...

如果要彻底搞懂,请看看《经典控制理论》,看完后保证会搞懂飞控(简单的)程序。
11
 楼主| 发表于 2019-6-16 19:01 | 只看该作者
本帖最后由 tcjsjxx 于 2019-6-16 19:03 编辑
ZAKEL 发表于 2019-6-16 18:57
如果要彻底搞懂,请看看《经典控制理论》,看完后保证会搞懂飞控(简单的)程序。

再一次跪倒,真的么?我连MWC的气压定高的控制逻辑都无法搞懂啊。都好几年了,对APM的定高逻辑也是一头雾水,网上都是讲代码的,没有一个试图给一个菜鸟讲讲粗浅的控制逻辑啊。
12
发表于 2019-6-16 19:03 | 只看该作者
tcjsjxx 发表于 2019-6-16 19:01
再一次跪倒,真的么?

我认为是真的
13
 楼主| 发表于 2019-6-16 19:04 | 只看该作者
就在不久前,我在某个群里问大家,航模遥控器对码,是怎么一回事?它们的ID是怎么样的,传输的数据是怎么样的,到现在还是一头雾水啊。卧槽,难道我真的LOW毙了?
14
发表于 2019-6-16 20:44 | 只看该作者
PID作为经典自控理论,不是为了飞控而设计出来的,所以不要戴什么滥用名词的帽子。
学自动化专业本科的都学过PID控制,高等数学又是本科的基础,你真要彻底搞懂的话就只能再学一遍本科4年的东西,没有捷径。
15
 楼主| 发表于 2019-6-16 21:12 | 只看该作者
litong_874 发表于 2019-6-16 20:44
PID作为经典自控理论,不是为了飞控而设计出来的,所以不要戴什么滥用名词的帽子。
学自动化专业本科的都 ...

本科4年的东西
16
发表于 2019-6-16 21:43 | 只看该作者
17
发表于 2019-6-16 21:46 | 只看该作者
支持,收藏
来自安卓客户端来自安卓客户端
18
 楼主| 发表于 2019-6-16 21:55 | 只看该作者
本帖最后由 tcjsjxx 于 2019-6-16 22:05 编辑

我了个大槽,我居然没有引入什么生僻的概念,没有引入过多公式(1个),然后就把PID给解释了!

以下是网上的找到的实现代码https://blog.csdn.net/guanjianhe/article/details/76438219
有兴趣,可以研究下,跟我讲的原理符合的很好。哦也!

根据以下实现代码,那么各位平时设置的飞控的PID参数实际是什么?实际并不是PID,而是PID的权重系数!


typedef struct PID
{
    int  SetPoint;     //设定目标 Desired Value
    long SumError;                //误差累计
    double  Proportion;         //比例常数 Proportional Cons
    double  Integral;           //积分常数 Integral Const
    double  Derivative;         //微分常数 Derivative Const
    int LastError;               //Error[-1]
    int PrevError;               //Error[-2]
} PID;

/*******************************************************************************
* 函数名称 : IncPIDCalc
* 函数描述 : 增量式 PID 控制计算
* 函数输入 : int 当前位置
* 函数输出 : 无
* 函数返回 : 增量式PID结果
*******************************************************************************/
int IncPIDCalc(int NextPoint)
{
    int iError, iIncpid;
    //当前误差
    iError = sptr->SetPoint - NextPoint;
    //增量计算
    iIncpid = sptr->Proportion * iError               //E[k]项
              - sptr->Integral   * sptr->LastError     //E[k-1]项
              + sptr->Derivative * sptr->PrevError;   //E[k-2]项
    //存储误差,用于下次计算
    sptr->PrevError = sptr->LastError;
    sptr->LastError = iError;
    //返回增量值
    return(iIncpid);
}
/*******************************************************************************
* 函数名称 : LocPIDCalc
* 函数描述 : 位置式 PID 控制计算
* 函数输入 : int 当前位置
* 函数输出 : 无
* 函数返回 : 位置式PID结果
*******************************************************************************/
int LocPIDCalc(int NextPoint)
{
    int  iError,dError;
    iError = sptr->SetPoint - NextPoint;       //偏差
    sptr->SumError += iError;       //积分
    dError = iError - sptr->LastError;     //微分
    sptr->LastError = iError;
    return(sptr->Proportion * iError            //比例项
           + sptr->Integral * sptr->SumError   //积分项
           + sptr->Derivative * dError);        //微分项
}

19
 楼主| 发表于 2019-6-16 22:01 | 只看该作者
本帖最后由 tcjsjxx 于 2019-6-17 11:11 编辑

简单来说,以上实现代码说的就是:

PID输出=P比例系数×(误差)+I系数×(误差积分值)+D系数×(误差微分值)

其中:误差积分值=本次误差+上次误差
           误差微分值=本次误差-上次误差
P比例系数 I比例系数  D比例系数其实并不单纯是个比例系数(由经验和实验来确定取值),而还有一个权重的作用。

所谓权重,就是各个部分应该在总量里占据的份量(发挥影响的大小),权重越大,发挥影响力越大;反之,权重越小,发挥影响力越小。

完毕。


20
发表于 2019-6-18 11:06 | 只看该作者
这个pid的含义确实是比较抽象,所以我都是手上找齐
来自安卓客户端来自安卓客户端
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

快速回复 返回顶部 返回列表