发布时间:2024-09-20 14:01
是不是非常熟悉,好像控制器天生就有能力链接我们的物理世界,轻而易举的改变物理对象。但是仔细看,说破天,这个算法也就是一堆数学公式,输入的是数字,输出的也是数字,它怎么就能改变物理量呢?
正如我们所想,几个数字不应该,也不能够直接改变物理量,真正能改变物理量的是执行器。
所以更真实的控制图应该是这样的。
我们应该感谢现在的执行器做的足够好,他们通常都有自己的驱动器,我们只需要通过输出一些简单的电平信号,驱动器就会帮助我们控制执行器。
典型的执行器就是电机,电机的驱动器,例如电调,通常都是用PWM信号就可以控制。
我们现在用的算法,最终都是写在一个单片机里的,所以严格来说我们使用的是数字PID算法,算法本身的确只能输出一些数字,但是单片机对于产生电平信号,却是非常擅长,简单的设置一下寄存器,只需要一个数字就可以产生你想要的PWM信号了。
那在这个过程中PID的作用是什么呢?为什么不能直接用误差作为输出,产生PWM呢?
最简单的思路其实就是只用误差来产生PWM,也就是利用当前的误差(比例),也就是PID算法中的P,这个很容易理解,如果当前我们误差很大,我们自然就希望执行器能输出最大值尽快缩小这个误差。
但是误差还有其他信息我们可以用,例如过去的误差(积分),如果如果过去我们的误差一直很大,是不是代表我们一直都处于离目标很远的地方,那我们在输出的时候也可以考虑这一点。
而且我们还能利用将来的误差(微分),如果误差的改变越来越快,代表我们正在加速变化,很有可能导致我们,超过期望位置,所以我们也要把将来的误差考虑进去。
「所以PID把误差的全部信息的加权组合」,是综合考虑你能掌握所有跟误差有关想信息,这样高级误差才能更加快准稳的消除误差,但是,「误差的组合依然就是个误差」,单次看他就是个数字,连续起来看他是个跟随误差变化的曲线,没有实际的物理意义。
通常你会发现,最后会把控制器输出限制成[-1,1]或者[0,1],其实这只是个工程技巧,是为了方便映射成PWM的占空比(0~100%)。
在单片机中你需要输出某个固定频率的PWM,使他的占空比从0到100变化,但根据你的设置不同,要产生这个效果,你需要的寄存器配置也许需要从1000到2000。
如果你把PID的输出限制在[-1,1],后续通过简单的映射就可以变化到[1000,2000],这就意味着你的PID调节只需要选择合适的参数让PID的输出随着误差变化在[-1,1]之间变化即可。
相反如果你将控制输出直接对应到寄存器配置,那你需要你对的PID做处理,而且要调节参数,才能使PID输出随着误差变化在[1000,2000]之间变化。
所以你看见的处理其实都是工程技巧,是为了让你能更好的理解。
如上面所说PID是输出仅仅是一个数字,没有物理意义,那它的输入呢?
让我们找来一幅非常“合理”的控制框图。通常大家接受的逻辑是,我想控制加速度,所以我要反馈加速度,通过误差让执行器改变加速度。
好像这里的期望天生就该是加速度一样。
真的是这样吗?
那我们把这套框图重新换一下。
这里的期望还应该是加速度吗?
显然这里是期望代表的物理量应该是速度,这就有点奇怪了,整个控制结构没有任何变化,怎么期望说变就变了?
那是因为你把需要控制的物理对象改变了,所以期望值的物理量也变化了。
我再啰嗦一句,很显然无人机的升力与小车的速度不是同一个物理对象,一个加速度,一个速度,而且无人机的升力与它的速度不成正比关系;
这就说明,「期望值是什么,与控制器没有关系」,而是与物理对象有关。更直接的原因是因为你使用了这个物理量做反馈值,期望值需要与反馈值做差,所以期望值才有了物理意义。所以**「期望值是什么取决于反馈值是什么。」**
假设图中的期望值都是数字3。
如果我不告诉你我的反馈是什么物理量,你能知道一个3代表什么物理意义吗?它没有任何意义,就是数字3而已。
一旦我告诉你图中反馈的是加速度,这时候你才知道,3代表的是我的期望加速度,但是这还不够,单位还没确定,这时候我再告诉你我反馈的加速单位是cm/s/s,这时候期望的才具有了真正的物理意义,就是我的期望是3cm/s/s。
所以真正让期望有物理意义的原因是因为你反馈了一个物理量,而不是因为PID算法。
真正的逻辑是:
1.我的执行器能改变加速度这个物理量,
2.我把加速度作为反馈,用误差消除误差。
3.设定期望值,这个值的物理意义需要与反馈一致。
所以,你的期望值是什么其实完全取决于你的反馈值,如果不表明反馈值,那期望值就是一个数字,或者一条曲线而已。
看上去PID不是已经够完美了吗?只要我能给出反馈,我就能控制所以的物理量不是吗?
为什么还要双闭环PID呢?那为什么说外环输入是内环期望呢?为什么位置误差经过PID就变成速度期望了呢?
下面来逐一解答这些问题。
感觉好像没什么问题,但是跟之前有些许不一样,之前我们的**「执行器能直接改变反馈值」**,但是在这个控制器里,执行器依然只能改变升力,只不过,因为升力改变,会有加速度,从而导致速度变化,最终导致位置变化。
如果你按照图中的思路设计控制器,那就说明**「你只对位置有期望」**,这意味着你对升力,速度没有期望,也就意味着加速度,速度是什么都无所谓。
所以实际效果变成什么呢?「你会以一个你无所谓的加速度,和速度,到达你的期望位置。」
这时候奇怪的事情发生了,到达你的期望位置时有加速度和速度,那这个就不是**「到达期望位置」了,这叫「经过期望位置」**。你会发现你的对象在期望位置附近“反复横跳”,超过后,又退回去,退过了,又超过去。
这时候你才想起来,原来**「你期望的是停在期望位置上」。「什么叫停在期望位置上?就是到达期望位置的同时加速度与速度都为0。」**
这个问题是如何产生的,为什么之前没有这个问题。
之前在单级PID时我们举的例子中,期望被控制的物理量,都是可以直接被执行器改变的。
但是在这个例子中,「期望被控制的物理量,不能被执行器直接改变,但是可以被间接改变,并且你知道间接改变的过程。」
之前我们想控制位置,类似于控制机器人,给出命令,它直接走到对应的位置。(控制的是速度。)
现在我们想控制位置,类似于控制一台有惯性的车,你只能踩油门加速,或者刹车进行减速,你只能通过速度控制间接控制位置。(控制的是加速度。)
但是你肯定知道,车我们也是可以控制位置的,还记得驾校里的倒车入库吗?不就是让你精准的控制位置吗?
开车的时候是怎么控制位置的呢?你想停在指定位置的时候,你先以一定的速度前往指定位置,快到的时候,通过刹车不断减速,直到速度为0,停到期望的位置。
这个过程告诉了我们什么?我们只通过控制速度就可以间接控制位置,也就是说**「我们可以通过控制某个物理量的变化快慢,从而间接控制这个物理量。」**
所以我们只需要选择**「合适的速度变化曲线」**就可以停在我们想要的位置。那我们就可以把控制器设置成下面的结构。(无人机涉及到升力间接控制速度,复杂一些,我们这里用简单的电机-小车模型)
什么是**「合适的速度变化曲线」**呢,
首先当到达期望位置的时候,速度应该为0。
其次当没有到达期望位置的时候,期望速度是可以减小位置误差的。
简单总结一下曲线要求:
「期望速度必须能减小位置误差,且位置误差为0时,期望速度为0。」
什么意思呢?如果前方为正方向,当期望位置在我们前方时,即target-current>0,那我们就希望能有个向前的正速度,去缩小这个误差,当误差为0时,我们希望速度为0。满足这样的过程的速度变化曲线,就是**「合适的速度变化曲线」**。
想想开车的时候,快到终点的时候会出现什么操作?
新手在没达位置的时候,希望有一个比较快的速度,快到了直接一脚刹车踩到底。
高手可以提前预判,匀速降低速度。
更高阶的可以变化的减速让整个速度变化如丝般顺滑。
就有了下面的曲线。
(第一个曲线是实际中是做不到的,因为速度减小需要过程,不能突变)
因为我们对期望速度的要求**「期望速度必须能减小位置误差,且位置误差为0时,期望速度为0。**「所以我们发现这些期望速度都是」**与位置误差相关的且经过0点的曲线」**。
位置误差与期望速度在这时候才建立起的关系,注意,强调一遍,是我们主动把位置误差与期望速度联系起来的,起因是我们希望控制速度达到控制位置的效果。
而这种控制能够被实现的本质是,「速度与位置存在我们已知的简单变化关系,即速度的积分是位置」,所以改变期望速度才能改变位置,才能减小误差。
所以合理的控制过程应该就可以设计成这样。
只要找个合适的函数,根据误差生成合适的期望速度曲线就可以了。
我们最常使用的是什么样的曲线呢?
是不是非常熟悉。
因为这两个曲线满足**「合适的期望速度」**的要求,同时也非常的简单。
只要是满足**「合适的期望速度」**的曲线都可以作为期望速度,显然如果在外环使用PID也是可以的,但是为什么实际中不这么用呢?因为添加积分(I)后,导致响应变慢,添加微分(D)容易引入噪声,只用P又简单又有效,何乐而不为呢?
到这里外环的输出终于理所应当的变成了内环的期望,但是这并不是因为这件事本就应该成立,而是通过你的设计,和真实存在的物理关系,才设计出来的合情合理的双闭环控制器。
我们再回忆一下这个控制器的设计过程
「1.执行器输出无法直接控制目标物理量。」
「2.发现控制器能控制物理量的变化量(微分)。」
「3.你想了个办法,可以通过控制物理量的微分,按照某种曲线变化,从而达到间接控制目标物理量。」
「4.这个曲线必须满足两点,存在目标物理量误差的时候,应该产生一个能减小这个误差的变化,且当没有误差的时候,变化量也应该为0。」
「5.选择最简单实用的曲线即可,所以外环选择KP。」
「6.这个控制能成功的本质是因为,间接控制能成功,间接控制能成功的原因是因为,执行器能改变的量,与目标物理量之间有简单的物理关系。」
因为你在设计控制器的时候,内环的目的就是实现用执行器控制直接能改变的变化量,外环的目的就是找到合适的曲线,来引导目标的微分变化,从而达到间接控制的效果。
最后,如果你想扩展到四轴的控制上面是一样的操作,只是这里的曲线变为姿态位置与角速度的关系,这一点很好理解,四轴是通过改变姿态进而达到改变位置的;即需要**「合适的期望角速度」**的曲线,内环自然就是将期望的角速度与姿态结算出来的角速度求误差进行内环的PID结算;
微信公众号上的文章,稍作了一些修改,找不到原链接了,暂且挂原创望周知
我也写过一篇很相似的文章,但是没有图片,可能这篇更加的形象;
为什么需要串级PID控制(结合智能小车,四轴飞行器来解释)
【自动驾驶】基于采样的路径规划算法——PRM(含python实现)
如何用Stata完成(shui)一篇经济学论文(十二):描述性统计、回归与结果保存
springboot实现mysql主从_基于 SpringBoot,来实现MySQL读写分离技术
java常用注解_Java注解总结(史上最全,有这一篇就够了)
基于注意力机制的图神经网络GAT的一些理解以及DGL官方代码的一些理解
使用IntelliJ Idea开发Spark Streaming流应用程序
AutoJs4.1.0实战教程---js文件打包发布成APK文件