在测试之前先要弄清楚什么是PID算法?
PID算法是由比例(Proportional,P)、积分(Integral,I)和微分(Derivative,D)三种算法组成,通俗点理解就是通过PID三个参数一系列的计算,使得实际的目标值无限的接近于期望值。在实际控制中,会进行不同的组合来达到不同的控制效果。
下面分别对三个参数进行简单的理解:
比例参数是根据当前误差(实际值与目标值之间的差异)的大小来调整控制器输出的部分。减小测量值(如平衡小车实际角度)和理论值(如平衡小车平衡时期望的0度)之间的误差(差值),让测量值不断接近理论值。它使得系统对误差做出快速而直接的响应。
具体表达式:输出=p参数×误差(误差=测量者-理论值)。
可以看出,误差越大,p的输出也越大;
微分参数根据误差变化的速率来调整控制器的输出。它可以抑制系统的过度振荡,并提高系统的稳定性。可以将D的作用作用是“阻尼”。如果系统误差很大(比如把平衡小车放倒30度)或p参数较大,那么p的输出就会很大,导致系统剧烈响应,出现过冲现象(在平衡小车中表现为大幅度低频震荡),此时就需要用到D算法来抑制,让系统可以刚好停在理论值而不过冲。就好像在水里挥拳,挥的速度越快,受到水的阻力越大,越难继续挥拳。这个“水的阻力”跟D算法的作用很像,因此可以把d算法理解为“阻尼”,抑制过冲现象。
具体表达式:输出=d参数×(此次误差-上一次误差)。
此次误差与上一次误差的差值反映的是误差的变化速度(比如在平衡小车自平衡的过程中,t0时刻的误差是30度,t1时刻10度,t2时刻5度,那么t0到t1时刻的误差变化速度较大,t1到t2时刻较小)。可以看出,两次误差的差值越大,d的输出也越大,抑制效果越明显;
积分参数考虑过去的误差积累,通过积分控制来减小稳态误差。换句话讲:I算法的作用是消除稳态误差。当系统误差已经接近0时,p的输出会很小,起不到继续减小误差的作用,导致误差始终没办法减小到0。这个时候就需要用到i算法,让误差值不断累加,并将累加后的值输出。I算法常用于精确的控制,比如控制小车的速度和转向角精确维持在某个值。它对于系统长时间处于偏离目标值的状态时非常有用。
具体表达式:输出=i参数×误差的累加。
可以看出,只要存在误差(这种误差叫稳态误差),不论误差有多小,i的输出也会像滚雪球一样越滚越大;
我们可以根据PID原理将其应用到平衡底盘控制中,在这之前需要将正确获取陀螺仪的数据以及正常的电机控制。
参考网络上平衡车的说明以及其他高校开源的平衡控制,平衡车PID包含直立环、速度环、转向环三个环向控制。但是放在平衡步兵上,每个大环是不够的,所以又拆分为两个PID控制器。直立环包含倾角、倾斜角速度,速度环包含位移、运动速度,转向环使用串级PID计算,其中旋转偏角PID的输出作为旋转角速度PID的期望。
底盘各PID控制器划分及关系这里速度环和平衡环采用混连PID并联结构,转向环采用混连PID串联结构。
PID_k1
:底盘位移(ecd)
该PID控制器用于维持平衡车底盘的位移在一个稳定的位置,使其保持在目标位置。
P部分:根据底盘位移的当前偏离值来计算控制输出,使位移回到期望值。
D部分:用于控制位移变化速度,以避免过冲或震荡。
PID_k2
:底盘速度(speed)
该PID控制器用于控制底盘的速度,以实现平衡车的前进运动,同时避免速度变化过快。
P部分:根据底盘速度的当前偏离值来计算控制输出,以控制速度。
D部分:用于减小速度变化的速度,以防止过冲或震荡。
PID_k3
:底盘倾角(ecd)
该PID控制器用于维持平衡车底盘的倾角在一个稳定的位置,使其保持直立
P部分:根据底盘倾角的当前偏离值来计算控制输出,使倾角回到期望值。
D部分:用于控制倾角的变化速度,以避免过冲或震荡。
PID_k4
:底盘倾斜角速度(speed)
该PID控制器用于控制底盘的倾斜角速度,以防止底盘倾角速度过快,导致失去平衡。
P部分:根据底盘倾斜角速度的当前偏离值来计算控制输出,以控制倾斜速度。
D部分:用于减小倾斜速度的变化,以防止过冲或震荡。
PID_k5
:底盘旋转偏角
该PID控制器用于维持平衡车底盘的旋转偏角在一个稳定的位置,使其保持在期望的方向。
P部分:根据底盘旋转偏角的当前偏离值来计算控制输出,使偏角回到期望值。
I部分:用于处理积分误差,消除长期的静态偏角误差。
D部分:用于控制偏角的变化速度,以避免过冲或震荡。
PID_k6
- 速度控制器,其期望值来自PID_k5
:
该PID控制器用于控制底盘的旋转速度,其期望值由前一个PID控制器
PID_k5
的输出提供,以实现方向控制。P部分:根据底盘旋转速度的当前偏离值来计算控制输出,以控制旋转速度。
I部分:用于处理积分误差,以防止长期的速度误差。
D部分:用于减小速度变化的速度,以防止过冲或震荡。
针对上面的解释,就可以根据每个PID控制器所会影响的结果进行调参,根据调试的情况判断是否调试正确,更方便盲调。
- 调试理想状态是在水平地面上在受力后仍可以直立不倒,且车体不会抖动。
- 调试的过程中会向前倾,原因是没有加行进环,他会向前倾倒,为了保持平衡他也要顺势往前给力,所以会出现向前动。
- 需要手扶着
先调试底盘倾角PID,目的是为了保证他立住保持平衡
再调试倾角速度PID,目的是为了保证他不会大幅度向前向后倾倒
调完直立环效果:
调试过程中没有明确需要调到什么样子,理论上来讲踢走但是可以返回(加了里程计),但是在调试过程中效果始终没有那么好。
位移在一个稳定的位置,使其保持在目标位置
前进保持平稳,停下快速返回平衡状态
在调试过程中由于没有加转向环,所以在静止状态下或者急停前进,方向会变化属于正常现象
先调试底盘的位移PID,目的是为了保持在目标位置不会乱动
这里说明一下,目标状态(肉眼)看很难看出来什么效果,都是凭感觉调试,但是需要注意的点是使用Kd,Kp;并且Kd加的很大,才可以消除位置误差使他保持原地不动。
先加P:P加的小,平步就软,容易推动,P加大到可以感受到明显阻力即可(要水平推,不要从上往下给力),静止状态下推动,平步有抖动并且会来回移动。
再加D:加大D以消除平步来回移动,直到推动或者运动状态下可以快速回正,我这里给的是P的40倍(这里很大,也是不断测试加上去的)
没有加I,因为效果不明显
再调试前进运动PID,目的是为了在移动过程中保持平衡且能快速回正
先加P:调至前进可以保持平衡状态即可,加大的效果与0时的效果区别比较明显,前进更加稳定。过大会轻微反复摇摆。
加I:P与I是200倍关系。
没有加D,加D会抖
调完行进环效果
串级PID调试流程,这里不做调试过程叙述(按流程调试,个人感觉串级PID不好调)。
三天让车立起来!STM32平衡车入门PID —— 第三天(PID调参)_平衡车pid-CSDN博客
【平衡小车PID】直立环+速度环完整调参过程 (开源)_哔哩哔哩_bilibili
平衡底盘重点可以分两大部分,一部分属于底层控制及获取数据正确,另一部分就是PID算法控制及参数调节,后部分属于非常耗时间且折磨的。根据内容其实也能看出来是RoboMaster的平衡步兵,希望写的文章内容能对其他人(RMer)有帮助。