当那双明亮的、不受任何干扰的“眼睛”,被成功地安装在甩带机上时,林浩感觉自己像一个刚刚打通了游戏第一关的玩家,虽然过程艰辛,但巨大的成就感,让他瞬间充满了继续挑战下一关的勇气。
他知道,“眼睛”的问题解决了,接下来,他要面对的,是一个更复杂的、也更核心的挑战——为这台“超级跑车”,安装上一个足够聪明、足够快速的“大脑”。
这个“大脑”的核心,就是那个在自动化领域,如雷贯耳,却又让无数工程师“闻风丧胆”的东西——pId控制算法。
pId,即比例(proportional)、积分(Integral)、微分(derivative)。这是一种最经典、也最广泛应用的闭环反馈控制算法。它的原理,简单来说,就像一个经验丰富的司机在开车。
比例(p),就像司机看到了前方路况(误差),然后,根据距离的远近,决定踩下油门或刹车的力度。误差越大,踩得越狠。
积分(I),则像司机的“记忆力”。他会记住过去一段时间里,所有的累积误差。如果车子一直偏离车道中心线,哪怕偏离得很小,他也会不断地、持续地修正方向盘,直到把这个累积的误差,彻底消除。
而微分(d),则像司机的“预判能力”。他能根据误差变化的“趋势”,来提前做出反应。如果他看到前方的车辆,正在快速地减速,他就会提前松开油门,而不是等到快撞上了,才猛踩刹车。
这三个参数,听起来,简单明了。
但林浩很快就发现,想把这三个“性格迥异”的家伙,完美地,调校到一起,让它们能像一个配合默契的乐队一样,协同工作,这,简直是一门“玄学”。
他开始了他人吃卯粮中,又一段“炼狱”般的调试之旅。
他先是把自己关在宿舍,从网上,找来了大量的、关于pId算法的教程和代码。他那颗充满了逻辑性的理科生大脑,再次发挥了作用。他很快,就在Arduino的编程环境里,写出了一个最基础的pId控制程序。
然后,他将这个程序,烧录进单片机,连接上甩带机的铜辊电机驱动模块,开始了第一次“空载测试”。
他的目标很简单:让铜辊的转速,能够精准地、快速地,达到并稳定在他设定的任何一个目标值上。
然而,当他第一次,在控制程序里,输入目标转速“3000转\/分钟”时,现实,就给了他一记响亮的耳光。
他看到,电机的转速,像一个喝醉了酒的醉汉,先是猛地,冲到了三千五百转,远远地,超过了目标值(超调过大)。然后,它又迅速地,掉了下来,掉到了两千五百转。接着,又再次冲上去,再掉下来……
整个系统,在目标值附近,来来回回,像一个失控的钟摆一样,剧烈地振荡,迟迟无法稳定下来。
“p值太大了。”林浩根据自己刚学到的理论,做出了判断。比例项的反应太“激烈”了,一看到误差,就猛踩油门,结果,次次都冲过头。
于是,他减小了p值。
这一次,振荡,确实减小了。但是,新的问题,又出现了。
他发现,无论他怎么等,电机的最终转速,总是稳定在两千九百五十转左右,离他设定的三千转,永远,都差那么一点点。
“静态误差。”林浩的脑海里,又冒出了一个专业名词。这是因为p值太小,当误差变得很小时,它的“纠错”力度,已经不足以,去克服电机本身的摩擦力等固有阻力了。
“看来,得让‘积分项’出马了。”
他开始,在他的代码里,加入积分(I)的计算。他要让这个有“记忆力”的参数,去不断地累积那个微小的静态误差,然后,持续地,给系统一个“加油”的信号,直到,那个误差,被彻底消除。
然而,当他兴冲冲地,再次进行测试时,他发现,自己,捅了更大的“马蜂窝”。
积分项的加入,确实,消除了静态误差。电机的转速,最终,可以精准地,稳定在三千转了。
但是,它的“反应”,也变得,像一个反射弧超长的老大爷。
当他下达指令后,系统需要很长一段时间,才能慢悠悠地,达到目标。而且,由于积分项会累积过去所有的误差,导致系统在启动初期,产生了巨大的“积分饱和”,超调,变得比之前还要严重!
更要命的是,当他试图,去改变目标转速时,整个系统,会因为之前累积的积分,而产生巨大的“惯性”,反应迟钝,甚至,再次陷入剧烈的振荡。
林浩感觉,自己要疯了。
他发现,p、I、d这三个参数,就像三个互相看不顺眼的、脾气古怪的大爷。p大爷性如烈火,I大爷稳如老狗,而d大爷(林浩还没来得及加),则是个神经质的“预言家”。想让他们三个和平共处,简直比登天还难。
他把自己关在地下室,没日没夜地,与这三个“玄学”般的参数搏斗。
他尝试了各种从网上学来的“经验调参法”,他画着各种各样奇形怪状的、代表着系统响应的曲线,但他,就是得不到那条他梦寐以求的、快速、准确、而又稳定的“完美曲线”。
就在他快要被这三个神秘的字母,给折磨到精神崩溃时,陈默,像一个幽灵一样,出现在了他的身后。
他已经,默默地,看了林浩,调试了整整一个下午。
“还在跟pId死磕?”陈默的声音,平静地响起。
“老师!”林浩像看到了救星,“我……我感觉我快疯了。这三个参数,根本就没法调到一起!它们互相矛盾!”
“谁告诉你,一定要让它们‘调到一起’的?”陈默反问道。
“啊?”林浩愣住了。
陈默没有直接解释。他走到白板前,拿起笔,画了一个简单的控制框图。
“你现在做的,叫‘反馈控制’。”他说,“它的逻辑是,‘先看到误差,再进行补偿’。这就像一个司机,他必须先看到车子偏离了车道,才能开始打方向盘。这种方式,天生,就带有‘滞后性’。”
“对于我们这个要求极高动态响应的系统来说,光靠‘反馈’,是不够的。”
陈-默在框图的前面,又画上了一个新的模块,并写上了两个字:
“前馈”。
“前馈控制?”林浩对这个名词,有些陌生。
“对。”陈默解释道,他的眼中,闪烁着一种属于“控制理论”的、清晰的逻辑光芒,“‘前馈’的逻辑,与‘反馈’完全相反。它不是‘亡羊补牢’,而是‘未雨绸缪’。”
“我们知道,我们最终的目标,不是一个恒定值,而是一条已知的、非线性的冷却曲线,对吗?”
林浩点点头。
“既然我们已经提前知道了‘标准答案’,那我们为什么,还要等系统出现误差了,再去被动地修正呢?”陈默反问道,“我们完全可以,根据这条目标曲线,提前计算出,在每一个时刻,电机‘理论上’应该输出多大的力矩,才能完美地追踪这条曲线。”
“我们把这个‘理论上的力矩’,作为一个‘前馈信号’,直接,加到我们的控制系统里。让电机,提前,就做好准备!”
“然后,”陈默在两个模块之间,画上了一个加号,“我们再用你那个虽然有滞后、但能消除最终误差的pId‘反馈控制’,去修正因为模型不准、外部扰动等因素,而产生的、那一点点微小的偏差。”
“前馈,负责‘打主力’,完成99%的追踪任务;反馈,负责‘打辅助’,处理那最后1%的残余误差。”
“这,才是一个真正先进的、现代的控制系统。这叫,‘前馈-反馈复合控制’。”
陈默的这番话,像一把钥匙,瞬间,打开了林浩脑子里那扇生了锈的、名为《自动控制原理》的大门。
他之前所有的努力,都只是在试图,去训练一个“反应型”的司机。而陈默,现在教他的,是如何,去打造一个拥有“导航系统”和“自动驾驶”能力的、真正的“未来战车”!
这是一种,思维维度上的,彻底的“升维”!
巨大的兴奋,让林浩忘记了所有的疲惫。
在接下来的两天里,在陈默的指导下,他开始构建这个全新的、更复杂的复合控制算法。
他先是,通过一系列的实验,测量出了他那台“魔改”电机的各项关键参数,比如转动惯量、摩擦系数等,建立起了一个虽然粗糙、但可用的“电机数学模型”。
然后,他基于这个模型,编写了“前馈控制器”的代码。
最后,他再将自己之前调试了无数次的pId“反馈控制器”,作为一个“辅助”,耦合了进去。
当他将这个全新的、凝聚了现代控制理论精髓的算法,烧录进单片机,并进行第一次测试时。
奇迹,发生了。
屏幕上,那条代表着“实际转速”的红色曲线,像一个拥有了灵魂的舞者,以一种极其矫健、而又无比精准的姿态,完美地,“咬”住了那条代表着“目标曲线”的、非线性的蓝色指令。
无论目标曲线,如何加速,如何减速,如何转折。
那条红色的曲线,都如同它的影子一般,不离不弃,紧紧跟随。
误差,被控制在了惊人的千分之一以内!
林浩看着屏幕上那两条几乎完美重合的曲线,感觉自己的呼吸,都快要停止了。
他知道,他,终于,驯服了那头隐藏在代码深处的“上古神兽”。
他为他们的“超级武器”,成功地,安装上了一个最强大、最聪明的“大脑”。