在循迹小车上调节PID参数的一种思路

您所在的位置:网站首页 循迹小车直角转弯程序思路 在循迹小车上调节PID参数的一种思路

在循迹小车上调节PID参数的一种思路

2024-07-14 06:41| 来源: 网络整理| 查看: 265

一、背景

江苏省大学生机器人大赛“密室夺宝”项目。

1.比赛规则

a.警方需要找到宝藏并上交给国家,如果宝藏先被歹徒拿到,则警方需要在剩余的比赛时间内(一局比赛为三分钟时间)抓捕到歹徒。 b.歹徒需要在警方到达宝藏处之前将宝藏带走并在剩余比赛时间内不被警方抓捕。

2.比赛地图

比赛地图

二、任务分析

小车通过6个灰度传感器实现循迹,从左至右的灯编号依次为2~6号。即如果此时至右2号灯在黑线上,则小车会以最大的调整速度来进行左转,直到2号灯离开黑线。小车展示

6个灯相较于只用两个灯,虽然PID循迹的稳定度会增加,但是也带了了一些其他的问题,比如下面的一个: 第一种情况 另一种情况

虽然两个偏离的情况并不相同,但是他们的返回值确实一样的!两者返回值均为01100. 此外,还有一些其他的问题,譬如六个灯总共会有64种返回值,但是如果把每种情况单独进行返回显然是不利于后期调试的。并且每次都需要进行64次判断,甚至可能会对系统的实时性产生影响。基于此,我们设计了如下的算法。该算法采用13种典型的返回值,其他情况均调用最近一次的有效误差。

int getA(int speed) //正面,输入参数为左右轮平均速度,计算误差并返回小车偏离方向。返回值为0:正常;为-1:偏左;为1:偏右。 { analogRead_To_test(); if( speed < speed_LOW_left + 10 ) { if(value4 < value4_yuzhi && value5 < value5_yuzhi && value3 > value3_yuzhi && value6 > value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi) {//黑线在45 error = 0; return 0; } //偏右 else if(value4 < value4_yuzhi && value5 > value5_yuzhi && value3 > value3_yuzhi && value6 > value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi) {//黑线在4 error = 1;//0.68 return 1; } else if(value4 < value4_yuzhi && value5 > value5_yuzhi && value3 < value3_yuzhi && value6 > value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi) {//黑线在34 error = 1.5;//0.77 return 1; } else if(value4 > value4_yuzhi && value5 > value5_yuzhi && value3 < value3_yuzhi && value6 > value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi) {//黑线在3 error = 1.9;//0.81 return 1; } else if(value4 > value4_yuzhi && value5 > value5_yuzhi && value3 < value3_yuzhi && value6 > value6_yuzhi && value2 < value2_yuzhi && value7 > value7_yuzhi) {//黑线在23 error = 2.2;//0.85 return 1; } else if(value4 > value4_yuzhi && value5 > value5_yuzhi && value3 > value3_yuzhi && value6 > value6_yuzhi && value2 < value2_yuzhi && value7 > value7_yuzhi) {//黑线在2 error = 2.4;//o.90 return 1; } else if(value4 < value4_yuzhi && value5 > value5_yuzhi && value3 < value3_yuzhi && value6 > value6_yuzhi && value2 < value2_yuzhi && value7 > value7_yuzhi) {//黑线在234 error = 1.5; return 1; } //偏左 else if(value4 > value4_yuzhi && value5 < value5_yuzhi && value3 > value3_yuzhi && value6 > value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi) {//黑线在5 error = -1;//0.46 return -1; } else if(value4 > value4_yuzhi && value5 < value5_yuzhi && value3 > value3_yuzhi && value6 < value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi) {//黑线在56 error = -1.5;//0.47 return -1; } else if(value4 > value4_yuzhi && value5 > value5_yuzhi && value3 > value3_yuzhi && value6 < value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi) {//黑线在6 error = -1.9;//0.51 return -1; } else if(value4 > value4_yuzhi && value5 > value5_yuzhi && value3 > value3_yuzhi && value6 < value6_yuzhi && value2 > value2_yuzhi && value7 < value7_yuzhi) {//黑线在67 error = -2.2;//0.53 return -1; } else if(value4 > value4_yuzhi && value5 > value5_yuzhi && value3 > value3_yuzhi && value6 > value6_yuzhi && value2 > value2_yuzhi && value7 < value7_yuzhi) {//黑线在7 error = -2.4; return -1; } else if(value4 > value4_yuzhi && value5 < value5_yuzhi && value3 > value3_yuzhi && value6 < value6_yuzhi && value2 > value2_yuzhi && value7 < value7_yuzhi) {//黑线在567 error = -1.5; return -1; } //其他 else if(value4 < value4_yuzhi && value5 < value5_yuzhi && value3 > value3_yuzhi && value6 < value6_yuzhi && value2 > value2_yuzhi && value7 < value7_yuzhi) {//黑线在4567 return 2; } else if(value4 < value4_yuzhi && value5 < value5_yuzhi && value3 < value3_yuzhi && value6 > value6_yuzhi && value2 < value2_yuzhi && value7 > value7_yuzhi) {//黑线在2345 return 2; } else { return 2; } } //其他速度不列举,除13种典型值之外调用上一次有效误差的函数不列出。 //也不包括PID算法。 }

首先给出在实验中我们发现的一套较好的三个参数:

const float Kp_MID=11; const float Ki_MID=0.12; const float Kd_MID=50;

这套参数的寻找花了我们三个星期,寻找过程十分痛苦,因此为了找到这三个参数的实际意义,加快以后PID的调试工作,接下来对这三个参数进行详细分析。之前查阅文献了解到,三者的比例大概在100:1:10。但如上,Kp与Ki之间符合了资料上的比例,但是Kd却出现了很大的偏差。为了探究快速找到Kd的方法,对小车运行轨迹建立数学模型。

四、探究Kd的数量级 1、列出所需数据

已知比赛地图的黑线宽度为25mm,一个循迹灯的宽度大概是4mm,在测试中,当半个循迹灯压在黑线上的时候,读数便已经有了跃变,因此可以把循迹灯的有效宽度设置为2mm。由实验得到的error返回值,只考虑Kp的影响,我们计算出了各种情况下左右轮速之比,以偏左为例:

在黑线上的灯号右轮速度pwm左轮速度pwm左右轮速之比基于4、5号灯时的左右轮速之比4、5(车身为正)90901:11:1584.595.51:1.130.94:1.065、6791011:1.280.88:1.12673.5106.51:1.450.82:1.186、7681121:1.650.76:1.25762.5117.51:1.880.69:1.31

列出所有计算需要的数据:黑线宽度为25mm,有效灰度灯宽度为2mm,灰度灯宽度为4mm,灰度板长度为160mm,有效灰度灯距离5 : 5.5 : 6 : 6.5 : 7 之比为7.5 : 16.5 : 25.5 : 36 : 46.5,左右轮距离为160mm,小车在4、5号灯直行的速度为500mm/s。

2、计算过程

不妨假设起始时7号灯在左侧黑线,车身为正,如下图所示: 只有7号灯在黑线上 根据上面的数据,此时小车应当以左轮117.5,右轮62.5的pwm值向右作圆周运动,直到7号灯出黑线。故7号灯在黑线上的轨迹应当是一段弧。 理论运动轨迹 这里认为运动时在车宽的方向的速度线性递增,由左右轮距为160mm,得出从右至左的质点速度的pwm值为如下表达式,其中为灯与右轮的距离: 公式 代入7号灯距离得77.2,得该圆周运动的线速度为直行时的77.2/90=86%,即速度为429mm/s。经计算得如下图的数据(计算过程略): 经计算的结果 由图得,7号灯在起始方向为竖直时,可以将最大为28度的偏移角度转正,且调整时间(走完黑线上的圆弧所用的总时间)为239ms。 同理可得,6、7号灯可以将最大为24度的偏移角度转正,且调整时间为285ms; 6号灯可以将最大为20度的偏移角度转正,且调整时间为304ms; 5、6号灯可以将最大为16度的偏移角度转正,且调整时间为367ms; 5号灯可以将最大为11.5度的偏移角度转正,且调整时间为501ms。

3、补充

在这里需要指出的是,5号灯与5、6号灯进行调整时调整时间非常之大,与实际情况并不相符。这是可以理解的。因为在在进行微小误差调整时,还会有Ki进行加速,而在上述建模中只考虑了Kp,故计算出来的调整时间会偏大,因此,我们不妨假设所有情况下的调整时间均为300ms,这将在确定Kd的数量级时减少大量的计算。

4、估算Kd的数量级

在实际测试的过程中,小车在只有7号灯在黑线上的起始位置的情况下,调整距离通常是2格,一格的长度近似为300mm,则小车两格共调整了1200ms。此外,经过统计,1200ms的调整时间内,小车总共经历了启动、调整(7->5)、过调(5->3)、回正(3->4)、过调(4->5.5)、回正(5.5->5)、过调(5->4.5)、回正(4.5->4)的振荡过程,之后振荡消失,小车处于稳定态。可能这套PID并不是一套最佳的参数,因为我们在算法设计时给它的要求是任何偏差都需要在一格以内调整完毕。但由于在实际行走的过程中,我们会在转弯后起步起步之前以及转弯前都给小车进行半格的减速,以增加循迹的稳定性,这套PID足以胜任,我们就没有再对参数进行改动。 从振荡过程我们可以看到,第一次调整(7->5)总共经历了7->6.5,6.5->6,6->5.5,5.5->5的过程,也就是Kd总共生效了四次。在建模中没有考虑Kd,故按照建模的初始条件与计算结果,在从七号灯到五号灯的过程中,车身角度应该至多偏移了28+24+20+16+12=110度。考虑到除起始位置为正,其他情况的起始位置车身均有偏移。适当减少偏移角度,最终偏移角度以28+20+12+4+1=65度为宜。计算出总共调整时间为285+304+367+501=1457ms,实际情况应该比理论值短,取1200ms,则想要在1200ms的运动时间,最终理论偏移角度为65度,Kd生效4次的情况下尽可能地减小最终实际偏移角度,下面开始估算: 由于单位调整时间在实验中设置为40ms,也即1200ms的调整时间中Kd生效的时间为160ms。这意味着Kd需要在160ms内实现转65的大角,因此可以预见到,Kd将会是一个非常大的数值,甚至超过了Kp,因为Kp转同样的角度耗时1200ms。因此: Kd

5、误差分析

为什么理论值是80而非实验中的50呢?我分析认为可能有以下几个原因:

1、从实验得出的50用了三次达到稳态,而我们的建模条件是一次达到稳态; 2、建模过程采用了平均的方法。譬如七号灯转角28度为最大,但调节时间最短,5号灯调节角度最小且时间最大,因此宏观上的理论Kd不能保证单次调节是最完美的,并且由于Kd太大反而会增加系统的振荡,实际值需要比理论值适当地小一点。 3、对计算结果进行近似时出现了误差,可以不用估算法,用真正的上一次出现角作为下一次调节的入线角度等等。但该做法会增加极大的计算量,在工程中不容易实现。

因此,上述论述从理论上否决了Kp:Ki:Kd=100:1:10这个参考比例。也从中看出,一套系统设计完成之后,PID的参数没有绝对意义上的参考,具体的比例必须按照实际情况自己加以分析。

五、结论

PID调试是一个十分繁琐的工作,调试过程中我们遇到了各种问题,包括电机板控制不稳定、循迹板返回值出现问题等等,但最终都被克服,并在比赛之中取得亚军。这也算是对得起这一个月的努力与近半年的知识积累吧。在调试过程中,我们经历了从无到不断接近理论值的过程。但是在比赛期间,我并没有静下心来去对三个参数的理论值进行估算,而是仅仅通过实验过程得到。这是我应该要反思的地方。此外,由于建模能够大致符合所有基于登的PID循迹,因此在这里可以给出此情况下的通比KP:Ki:Kd=1:0.01:5。 获奖证书

六、补充

由于这是我的一个课程的期末论文,只是稍微修改了一下就发了上来,如果有问题还请多多包涵!

代码与实际视频等过几天有空我找找上传。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3