方向pid:
这个方向pid我是用的李坚学长的,还是挺好用的,后期要对特殊的赛道单独给参赛以追求更高的速度。前期可以全部赛道统一给一个参数。
李坚学长写过一篇文章,里面介绍了怎样调节pid的各个参数。、
这里附上他的原话:
- 二次动态位置式调参经验:
调参真的很重要!调参真的很重要!调参真的很重要!
此处说的参数均和我的编程习惯对应,先看上面二次动态位置式的代码。
二次动态位置式一共用到的参数有三个:kp ki kd (此处的动态这是针对位置式中kp的动态)。需要说明的时候这里的ki不同于普通的积分项ki,这里就把它理解为一个普通的参数a即可,这样做只是为了用结构体的时候不用整那么多变量。Kp相当于动态kp(real)中的常数项,ki则是分母项,kd与位置式kd一样。就我的经验来说调参顺序是kp ki kd。
此时我们需要注意,速度不应该很快大概在1m/s左右即可,此时先整定kp项,一般来说习惯是从大往小减,减到车直道不抖,弯道差点能过,也就是撞外侧路肩。然后减小ki(我们调kp的时候把ki往大给,以忽略二次项的影响),减到弯道刚好能过,此时算基本整定好。我们必须认识到常数项才是主要作用项,二次项只是起辅助作用。此时,我们可以提速,可以发现提速之后,车反应是比较迟钝的,经常来不及转弯就直接冲出去了,这时kd就起作用了,我们把kd从小往大加,会明显的发现车反应会变快,这就是微分项的预测作用。一般来说,慢速时整定的比例项,会随着速度的增加适当得减小一点,减kp,加ki,且速度越快基本上kd也要越大。
这里我再补充几点:
1.我们要注意我们输入到方向pid运算的误差的范围,这个输入误差会影响我们参数的大小。
我们在赛道上面左右移动车辆就可以采集到小车在赛道上面误差的变化范围,主要就是获得小车在偏左和偏右位置的偏差。
偏右的偏差: 偏左的偏差:
如果你的车摄像头没有问题,并且安装是正的话,左右两侧的偏差应该是对称的。如果你观察的结果不是对称的,你就要检查你的摄像头是否没有问题(一般是换一个摄像头看看问题有没有解决);摄像头安装是不是没有问题(要居中对称);搜线算法是不是有bug;偏差计算函数是不是有问题。
out = (int16)(error*kp + error*error*error/ki + kd*(error - last_error));
我们舵机是进行了限幅的,我们现在的限幅是左右70;如果在赛道上面偏左和偏右的位置的偏差是正负20,我们只考虑kp作用的时候,kp最大能给到70/20 == 3.5;这是没考虑到ki和kd作用的情况下。如果引入其他两项,我们kp可以调节的范围会更小,所以我们希望输入到方向pid的偏差小一点,比如我们将20除以2作为偏差输入到方向pid中来,现在kp能调节的范围最大是7,引入其它项的时候会小一点;(当然这么做只是为了让参数更好看一点,因为如果kp能调的范围是0~1的时候,每次调的都是0.01或者0.1,那么就不太方便了)。
我们先整定kp的参数:
此时先整定kp项,一般来说习惯是从大往小减,减到车直道不抖,弯道差点能过,也就是撞外侧路肩。
整定kp时,ki要给定一个比较大的值,因为ki是处于分母位置;kd给0;
然后我们整定ki:
然后减小ki(我们调kp的时候把ki往大给,以忽略二次项的影响),减到弯道刚好能过,此时算基本整定好。我们必须认识到常数项才是主要作用项,二次项只是起辅助作用。
最后我们整定kd:
此时,我们可以提速,可以发现提速之后,车反应是比较迟钝的,经常来不及转弯就直接冲出去了,这时kd就起作用了,我们把kd从0往大加,会明显的发现车反应会变快,这就是微分项的预测作用。
kp,ki,kd三个参数的整定李坚学长已经讲的很明白了。
我提醒一下大家就是要从数学的角度分析这三个参数的作用;
error*kp说明kp是对于偏差做了一个比例的缩放,所以它的作用效果最直观;error*error*error/ki说明ki在弯道的时候作用效果比较明显;kd*(error - last_error)项只有在误差发生变化的时候才起作用,比如直道进入弯道和弯道进入直道的时候,这个位置也是车经常出现转不过来的地方。
利用数学规律,以后车出现弯道走线偏外侧就可以通过减小ki来调节;直道进入弯道转不过来可以加大kd项;
到后面随着车速的越来越快,车难免会出现抖动;这时候可以用上位机(也就是下面调节速度环的软件)把所有参数的作用效果发送回来,观察抖动是由于哪个参数的作用引起的,这时候就要重新调节这个参数。
上面基本把方向pid的参数整定完了;至于速度pid参数的整定就比较容易了。
速度pid:
out += kp*(error - last_error) + ki*error;
下面,我结合匿名科创上位机给大家演示如何调节速度pid;
kp = 4.0; ki = 0;
kp = 5.0; ki = 0;
kp = 10.0; ki = 0;
可见随着kp的增大,速度稳定的的值越来越接近目标值(1200的黄色直线就是目标值);但无论我们怎么加大kp,也无法让速度达到目标值;这个差值我们称之为静差。
此时我们只用给定一个很小的ki,就可以让速度缓慢的加到目标值;什么原因大家可以自己看公式理解;且随着ki的增大,达到目标速度的时间越快,我一般称为比较硬。
kp = 5.0; ki ==0.05;(kp取10有点偏大,所以此处我们取5)
kp = 5.0; ki ==0.1;
kp = 5.0; ki ==0.15;
一边ki都是一个小于0.5的数,大家整定速度环ki参数的时候要小心翼翼的增加,不然容易让车轮疯转。
我对于速度环的浅显理解就是,ki起主要作用,可以加快小车电机的响应速度。kp反而不是很重要。到时候杜哥还会详细跟大家讲的。
至于调参要用到的软件和代码,我会整理好发群里的。