这里写目录标题
前言
在接触电赛题目以及平常训练的过程中,遇到很多地方要使用到PID算法,从而达到自己所期望的效果
而往往PID,又有点子不好入门,有很多小伙伴包括我,在学习初期都不能很好的理解啥是PID啊?三个参数到底是啥啊?我为什么要调节这三个参数啊?我光是知道PID,但是不知道怎么用啊?什么串级PID,一听就头大,什么并级,怎么还分这个啊?这也太难理解了叭
我对PID的理解也仅仅停留在如何运用,如何根据不同的场景来写PID,从而使我的系统保持一个稳定的状态。
我会在文章中把我的理解以文字的形式,告诉大家听,并且以近几年的电赛题为例,告诉大家其中什么场景,我们需要使用到PID
当然,博主我因为时间匆忙,在准备比赛期间主要加强的是小车方面的练习,可能本文更多部分是关于PID算法是以小车为载体的方面上进行说明
当然,就比如今年,电赛E题的运动目标控制和自动追踪系统也用到了PID算法,我大概说一下,就是根据摄像头读取四个点的坐标,然后实际值为红色激光点的坐标,目标值就是摄像头读取四个点的坐标
,但是博主在这道题上栽了跟头,遗憾收尾
就拿发挥部分来说,就是赛前训练的OpenMv追小球,不同的是,变成了绿激光追红激光,本质上还是一样的,悲,比赛没调出来,心态崩了
好了,废话不多说,希望我的文章能在未来某一天对同学你有帮助,不要再犯和博主同样的错误
1、PID三个参数的意义
1、P 比例
根据PID公式
我就说个大概,不对其内部做深究
可以知道
比例系数P是*(Target-Actual),这就是PID计算公式的第一项
这一项是 P*(Target-Actual) 也就是P*(Err)
当系统得到反馈,和设定的期望值做差时,就会产生一个误差Err,比例系数P,就会快速到达目标值,这个随着P的系数的增加而增加,但是无法到达目标值,总会出现一个静态误差
就拿小车的速度环来说,光靠单P是无法到达目标速度的,比如我小车设定的目标速度是100Rpm,这个时候我的P是30,速度已经到了65rpm,我再怎么加P,速度都不增加了
这就是P的作用
当然这也要分类讨论,在不同的系统中不同,就拿云台系统和舵机移动来说,可能单P就可以取得较好的效果,需要具体情况具体对待
2、积分I
积分I,就是对误差的累积,然后积分系数I*误差的累积,就是PID计算公式的第二项
当误差累积到一定的程度后,积分系数I,就可以快速到达目标值,这个时候单P所产生的静态误差就会消失,从而快速到达目标值
一般小车的速度环,PI参数即可准确到达目标值,所以通过I的作用,小车速度系统即可相对稳定
3、微分d
微分d,d*(当前误差Err-上一次误差Last_Err),这个就是PID计算公式的第三项
这一项我的理解是,可以对系统瞬间,猛冲超出目标值的压制,加d参数可以减缓目标值的过冲
这一项在小车的PID使用方面,我印象中使用的较少,对于速度环PI,即可,D也可以加,但是一般PI即可
但是舵机方面,比如舵机前轮转向,d增加,可以快速提高响应速度,摆动响应的程度更好,在调试舵机转向的时候,可以适当提高d
2、几种PID的使用场景
有一说一,我刚开始学习的时候使用过位置式的PID和增量式的PID,后面觉得位置式用的顺手就一直都使用的是位置式的PID,对于单车系统来说,位置式PID就够用了
但是貌似有些问题位置式PID也无法解决,需要改变策略
3、近年电赛题和某些场景使用到PID的情况
1、21年智能送药小车
这道题 一个是速度闭环,一个是循迹闭环
速度闭环
,就是实际值为编码器读取到的脉冲,期望值为期望速度Rpm
循迹闭环
,就是实际值为小车当前行驶情况车身的误差,期望值就是小车始终保持在线中的值
可以并级并起来,也可以串级串起来
不同的就是,并起来就是直接在速度闭环算出来的PWM,两轮一加一减
串起来就是,把循迹闭环的输出作为速度闭环的输入,在速度闭环的期望的两轮一加一减,这样根据速度环的闭环,小车的速度保持期望速度,而小车循迹始终在线上,这样就能稳定的在直线上运动了
2、22年小车跟随系统
这道题的循迹思路和21年电赛题目一样,循迹闭环和速度闭环,上方仅适用于二轮差速转向的车型
我再来讲一下,循迹闭环,假如小车使用的是前轮舵机转向
呢,前轮舵机转向,也是一样的,不同的是转向由前方舵机控制
这个时候,你只需要定义线中期望值,比如你车此时偏离线,这个时候通过循迹传感器或者摄像头得到的数据偏差,把此时的数据偏差减去期望值,大于0为左边,小于0为右边,此时你就可以根据两种情况来控制舵机转向的角度和方向了,后轮只管大力向前,舵机来控制转向
还有就是,可能前方弯度较大,仅靠舵机无法转向,舵机转向过大直接卡住了,这时候需要对舵机的转向角度加以限幅,采取后轮差速+舵机转向
完美解决,需要调好PID参数,即可丝滑循迹
这道题还有一个其实也可以使用到PID,超声波跟随
,题目要求的是,两小车始终保持20cm间距,单靠距离,速度++,速度–,效果不太好,可能会造成两车相撞
最理想的情况就是写一个PID,期望值为20cm,实际值为超声波测量到前车的距离,这个应该也要串起来,因为小车的速度要保持恒定,有的时候并级并不能够达到预期
这个时候就需要转变思路,换个方向可能就好了,串起来
3、舵机云台PID
这个云台的话呢,就是x轴和y轴各写一个PID,分别控制舵机的左右转动和上下转动
就拿舵机云台追踪小球的例子来说,他们的期望值就是摄像头的中心,而小球的坐标在摄像头内的位置就是实际值
这个舵机PID有所不同,因为云台不会像小车前轮舵机转向时,当始终处于期望时候,会复位,云台并不会复位,所以每次计算出来的PID的值叠加到PWM上的值是在上一次计算出来的值上进行想加减的
4、转向,角度环
这个和循迹相同,思路都一样
转向
的话,就拿21年电赛来说,需要转动90°,转动180°,那么转固定的距离即可等效于转动固定的角度,轮子走过一圈的脉冲和距离是恒定的,经过计算和解算即可得出转90度是小车转的脉冲(距离)
将其带入PID中进行计算
角度环
,就是MPU6050的yaw角,实际值为陀螺仪采集的车身实际转动的角度,期望值就是车身转动的期望角度,和循迹环思路一样,和速度环串起来
5、22年科目二
那个和边线保持5cm也是循迹实现
,你看啊,我只要把我的巡线期望改到左边一点就可以了,比如我此时的巡线误差依次是 3 2 1 0 -1 -2 -3,那我只要把巡线期望改为2或者1就可以往边线上靠,从而保持了5cm的距离
6、平衡小车
平衡小车的直立环也是PID,根据陀螺仪反馈,从而保持直立
速度环提高直立速度,加快响应,控制车稳定,前进后退
转向环转变方向
4、PID只是一个方法,不要被限定死了
我们遇到问题时,要从多方面去思考问题,假如这道题别人使用PID算法,实现的效果很好,但是你又搞不出来,何不思考不闭环呢?
有没有可能是这个思路和算法把自己的思维限制住了
有没有可能开环跑效果还要好一点
21年电赛题目,我尝试过多种方案,最后发现,其实开环也未尝不可,转向和停止也都很丝滑
所以大家要头脑风暴,不要仅限于一点,问题是可以使用不同的方法来解决的
5、PID调节经验
往往PID三个参数,先调P,再调I,再调D
但是不同的系统可能都需要这三个参数,也可能只需要其中两个,也可能只需要单个
1、单个速度环
单个速度环,先调P,再调I,依据情况增加D,一般情况PI即可达到较为稳定的速度
P一直加,找到一个临界点,在往上加速度都不变了的话,P可以取这个数,然后加I,系统就会快速消除静态误差,当查看波形曲线,速度到达期望速度时,此时系统的PID参数即为尚佳
2、循迹环或者角度环 和 速度环串起来
这种情况,一般先调节速度环,速度稳定后,调节循迹环或角度环,给定循迹环期望或角度环期望,调节PID参数
这个PID参数啊,一般先给p,要注意极性,如果你一直加P,没有效果的话,就要看看极性是不是反了,给个负方向的P看看,然后逐渐加大P,这个时候就不能看波形了,要根据实际情况修改P,加大或者减小
就拿循迹来说,我逐步加P,每加一次P,就让车跑一次,看小车有没有差速转弯的趋势,如果有,那就说明有效果,逐步加大,直至效果最佳
还又可能会震荡,这个时候可以减小P,然后加点D看看,响应会更快,同时震荡程度也会减少
同理,可以看转向环,我有没有转到90度,震荡否,慢慢调节
等调出来的那一刻,会很开心的哈哈哈
3、舵机前轮转向的PID应该怎么调
哦哦,这个还忘记讲了,这个前轮转向的舵机,初始时,始终是车轮朝前的,也就是基础时刻有一个中值,舵机PID计算出来的值都是再这个中值上进行相加减的
就和上面说的一样
通过循迹传感器或者摄像头得到的数据偏差,把此时的数据偏差减去期望值,大于0为左边,小于0为右边,此时你就可以根据两种情况来控制舵机转向的角度和方向了
同时需要对舵机限幅,防止打角过大,损伤舵机
这个PID调试也同理,P逐渐给大,看循迹偏差,在线上回没回正,偏离线有没有拉回去,车摆左边,轮子应该往中线方向打角
4、舵机云台的PID应该怎么调
说实话,这个我也没咋弄懂,电赛寄了,一个大概的思路,我觉得这个思路应该是正确的
实际值为小球(或绿色激光点)的坐标
期望值为屏幕中间(或红色激光点)的坐标
x方向一个PID
y方向一个PID
根据小球(绿色激光点的)坐标移动而改变云台舵机转动方向
赛前追踪小球成功实现,单个p就可以达到很好的效果
比赛的时候死活调不出来,程序的可读性较差,逻辑复杂混乱,导致寄了
6、总结
以上就是我在电赛备赛期间,经过实践和自己摸索出来的一点经验,希望能够对大家有所帮助
有什么不对的欢迎指出,很高兴与你们一起交流学习
大家加油加油!