本文原创,作者zzw,转载请注明,版权属于燕骏团队zzw
概述
十几天前,开始和队友一起整自己的四旋翼飞行器。我们买了套飞行器的配件机架使用的是穿越机qv250机架。主控电路板,是自己用AD设计的电路图,然后制作的盘存表电路板,使用的是STM32F103RCT6芯片。上面集成mpu6050、hmc5883l、bmp180、超声波、光流、激光传感器等等。这个飞行器,我们自认为是将主控STM32RCT6芯片的功能,发挥到了极致。
我想做的是一架可以自动飞行的飞行器,学习并理解一些高级算法
辛辛苦苦十来天,整机模块驱动基本完成,姿态解算及PID控制等算法基本搞定。今天(2017.1.3)我和队友在实验室,整定了一天的PID参数,总结了一些规律以及一些经验。记录在博客下面,自己忘记的时候回来看看,也分享给大家和大家一起讨论学习。(若有错误,请点出,谢谢~)
**一篇博客写了好几天,最近几天忙着考试,今天抽空把这篇博客写完吧(2017.1.6)
关于我们这个四旋翼后续的详细资料以及详细制作过程,详细代码,寒假期间,我将陆续发布到自己的博客。我和队友最终的意愿是开源我们自己的飞控源码以及硬件电路。
单级PID整定
e(t)是偏差。
下面说说今天整定单级PID的一些感悟:(心塞塞啊~),一开始使用的是串级PID,分内环和外环,但是串级PID整定毫无头绪,现象不是特别明显(后续文章我将 分享一下我所理解的串级PID算法)。
无奈串级PID整定无头绪,又写程序改为单级PID进行整定调试找感觉。。。
下面说说单级PID:输入的是目标角度,输出是PWM增减量。
这里先默认大家会写单级PID算法,基础知识先自己脑补。
下面先看看wiki上介绍的PID控制器:(原文链接如下)
https://en.wikipedia.org/wiki/PID_controller
wiki内容
这里 盗来wiki的几幅图:
第一幅图:PID各个参数动图大家自己点击链接看吧
https://en.wikipedia.org/wiki/PID_controller#/media/File:PID_Compensation_Animated.gif
Kp比例项参数
第二幅图:
如图:当Ki,Kd保持为常量时,改变Kp。图上在t = 1s时,给系统一个阶跃信号,然后调节Kp比例项的值。图中红线为Kp = 0.5时候的响应曲线,绿线为Kp = 1.1时候的响应曲线,紫线为Kp = 1.6时的响应曲线。
上升时间 指:这里我们直接认为是 从一开始0% 到第一次达到目标值的时间100%。
从图 上分析:
红线:当Kp比例项较小时,响应无超调无震荡,上升时间较长,但是稳定时间很长,延时时间长。
绿线:当Kp比例项增大时,响应有较小超调,上升时间明显缩短,稳定时间缩短。
紫线:当Kp比例项足够大时,响应曲线超调较大,震荡很多次,上升时间继续缩短,但是稳定时间却增长了。
如果继续增大Kp值呢??这里图上没有反应,但是我们可以推测一下:上升时间继续减小,超调继续增大,震荡次数增大,最终系统失控发散,系统性能恶化。
所以调PID参数时一定要小心,Kp值不能过大。
Ki积分项参数
第三幅图:KI的影响:
大家看图:可能很多人都知道,Ki积分项是用来消除静差的。那么什么是静差??我个人的理解是,如果目标值是 10,经过P或者PD调节之后,系统稳定值为9.5,那么与10是有一定差距,这个就属于静差,这个静差的调节就需要积分项来进行。
继续分析图:
绿线为基准线:Kp = 1 Ki = 1 Kd = 1
红线:Ki = 0.5 其他一致
蓝线:Ki = 2 其他一致
可以看出Ki的特性和Kp类似,和Kp是“正”作用。Ki较大反而会引起系统震荡
Kd微分项参数
下面让我们来看看 Kd:微分项:
这张图中绿线为基准线:(Kp = 1 Ki = 1)
红线Kd = 0.5较小时,上升时间减小,但是比 Kd = 1.0时超调大一点,上升时间短一点。
黑线Kd = 2,和Kd = 1时做比较,发现超调量竟然比Kd = 1时大了,上升时间也长了。
所以可以大致总结出:Kd在一定范围内可以起到抑制超调量的作用,但是会延长系统上升时间。
我们自己整定经验总结
下面简单说一下,我们那天调PID参数的情况:
我们自己利用丝杠 做了一个单轴调节器。(只能一个轴动)使用起来很方便,如下图:
第一个经验
将各个轴分开来,单独调各个轴的PID
第二个经验
先单独调节Kp,Ki = 0和Kd = 0
调节方法是1,2,4,8,16等2倍数,且每次观察并用手感觉实际情况。(下面是以我们自己的飞行器举例的,先整定的是Y轴的PID各项参数)
比如 Kp 从1调到4 ,发现飞行器 有左右震荡调节趋势,但是软趴趴的,调节不过去。也就是说Kp比例项小了,力度不够不能调节到稳定位置。于是将Kp加大到8,发现飞行器很有力度了,左右震荡幅度很大。当飞行器手动向左偏得时候,有一个很大的力度让飞行器向右偏,在中间位置左右震荡幅度较大,需要很长时间 才能基本稳定。
于是我们感觉自己的Kp有点大,于是减小Kp到6.0。发现力道稍微小了点,但是最后还是能基本在中间平衡位置 基本稳定。
就这样感觉Kp差不多了,通过上面分析,我们知道加入Kp虽然能使系统快速达到目标值,但是会使系统超调震荡:
如下图:
在目标值上下震荡,也就是我们的飞行器在平衡位置的上下震荡。振幅按理说是减小的。
第三个经验
接着整定Kd微分项参数
这个时候就应该整定 微分项Kd了,这个参数大小范围实际还是看自己的PID算法实际是怎么写的。不过呢,Kd项参数的作用是一种阻尼作用,阻碍系统变化的。通过微分跟踪上一次状态(我是这么理解的,不知道对不对),调这个参数时,我们也是按照1、2、4、8、16、32这规律 再2分法整定的。比如:8和16之间取 12,然后确定是在12和16还是8和12直接进行二分法寻优。
我们中间做了个实验,只整定Kd其他项为0,目标值为0平衡位置。发现:在一定范围之内,随着Kd的增大,一种阻碍飞行器姿态变化的力逐渐增大。一个字概括为:“硬”。也就是说微分项通过微分,跟踪上一次的状态进行预估下一次的状态,阻碍系统的变化,是一个阻尼作用。
上面说到Kp比例项震荡,需要加入Kd进行调节,加入合适的Kd后,系统能较快稳定。效果还是不错的。
注意点:就我们个人经验,发现加入Kd后,可能之前的Kp项系数也要微调。也就是说各个参数不是死的,不是一个调整好就不需要动了的。而且就我们测试发现好几组PID参数都是基本可以的。
第四个经验
单轴、最后调节Ki,目标值为0度,然后用jlink仿真器进仿真,看看基本稳定后解算出来的姿态,实际角度与我们的目标角度有多大的差值。我们程序中设置了积分分离阈值与积分饱和阈值,积分分离阈值呢,我们设置为5度,也就是说大于5度我们就认为不是系统静差了,就不需要积分项进行作用了,积分饱和呢我们设置了100,也就是积分饱和最大输出100的PWM增量。我们的Ki积分项,参数很小0.0几的样子。
以上 单个轴的PID系数就基本整定出来了,剩下的几个轴重复以上步骤。。
今天先写到这,,后面再补充吧。最后附上队友MATLAB仿真PID
串级PID参数整定
串级PID待我寒假回家研究研究,貌似难调
附录:
队友MATLAB仿真:
参数
结果
参数
结果
参数
结果
参数
结果
参数
结果
参数
结果
参数
结果