首先例举第一个例子,我调的第一台四轴飞行器,十字型四轴飞行器,讲下配置: 采用位置式PID控制,位置式PID公式如下 PID的基本意义我在次就不作阐述了,我只讲我的设计,我以姿态角作为被控制对象,所以 对于微分项D,我做了一点改变,标准PID的微分项D=kd*(e(k)-e(k-1)),我在实践过程中因为角度的微分就是角速度,而陀螺仪可以直接测出角速度, 实现代码如下 float pidUpdate(pidsuite* pid, const float measured,float expect,float gyro){ float output; static float lastoutput=0; pid->desired=expect; //获取期望角度 pid->error = pid->desired - measured; //偏差:期望-测量值 pid->integ += pid->error * IMU_UPDATE_DT; //偏差积分 if (pid->integ > pid->iLimit) //作积分限制 { pid->integ = pid->iLimit; } else if (pid->integ < -pid->iLimit) { pid->integ = -pid->iLimit; } // pid->deriv = (pid->error - pid->prevError) / IMU_UPDATE_DT; //微分 应该可用陀螺仪角速度代替 pid->deriv = -gyro; if(fabs(pid->error)>Piddeadband) //pid死区 { pid->outP = pid->kp * pid->error; //方便独立观察 pid->outI = pid->ki * pid->integ; pid->outD = pid->kd * pid->deriv; output = (pid->kp * pid->error) + (pid->ki * pid->integ) + (pid->kd * pid->deriv); } else { output=lastoutput; } pid->prevError = pid->error; //更新前一次偏差 lastoutput=output; return output;}
我这么做的原因是因为,如果使用传统的D的形式,在我快速打舵时会产生输入的设定值变化频繁且幅度较大,四轴飞行器会迅速回到新的期望点,说白了就是非常灵活,四轴回复很猛,也许造成系统的振荡,对PID参数要求较高。如果用角速度代替的话,那怕你打舵非常快,四轴会较平稳的回到新位置,运动较柔和。对于我这种操作菜鸟来说无疑后面一种会更合适,所以我选择了D=kd*Gyro的方式。 PID控制器我大概就是这么实现的,下面讲讲我在调试过程中具体遇到的问题。首先我将四轴固定在单轴平衡平台上,让飞行器完成单轴平衡,主要观察姿态角的 我先调一个轴的平衡再调另外一个轴,最后调YAW轴。 在这里还应注意一点,当P太小时,四轴在很大倾斜的地方,在重力与P的作用下也会震荡,这种震荡不是等幅的,也不是对称的,震荡波谷的绝对值明显要比波峰绝对值大而且距离0度会很远。这种情况要加以区分。 我把P从0.2到0.8开始尝试,找到一个适合的点,即刚开是出现震荡的P值最后我定为0.5。注:此时还是有静差。 P=0.5时四轴在他的稳定位置震荡比较小了,但是在外力干扰下很难在稳定下来,抗干扰能力较差。然后我开始调D。 刚开始调D的时我就范了一个错误。因为我改了D的标准型,而D应该是抑制运动的,但是陀螺仪输出的数据符号导致我这里D变成了增加运动,所以一开始无论我怎么调整D,都会激发震荡。后来我在参数前加了个符号就好了。在这里我提醒要始终注意D是阻尼力,是其抑制震荡也就是运动的作用的,它始终期望的是它所作用的对象没有运动,至于停在什么位置不是D所关心的,那是P,I所关心的。所以直接用陀螺仪数据代替偏差的差得话就得注意下。修正这个问题后加了D效果就比较明显了,四轴在外力的干扰先能明显的有回复力且,能快速稳定在平衡点了,调D就是试,当然D大了也会产生震荡,但是此时不加D时光P作用时的震荡就很小,很明显就可以看出随着D的增大,震荡减小又增大的过程。最后P=0.4,D=0.15。 最后定好了P,D后我的四轴还是有静差,不能稳定在期望的0点。网上有很多四轴只用PD,在这里我决定根据我的实际情况加入I。调I的时候我先把积分限幅去掉。然后从小往大加,当调平衡时,随着油门的变大,静差应该是越来小的。我将油门推到差不多快要将四轴推离地面的位置,看I能不能消除静差。因为如果油门给小了,静差较大,调出来的I虽然能消除静差但是I比较大,在加油门时有可能也会产生超调震荡。最后I要再能消除静差又不产生震荡,个人认为要近可能小。最后加上合适的积分限幅。P:0.4,I:0.35,D:0.15。 下面我讲讲我在调第二个X四轴过程中遇到的问题。 调试方法还是先调平衡杆,如图: 刚开始调X的时候我以为跟十字的差不多,于是我只是简单的把原有PID参数按照新的程序里面的PWM值域缩放了一下倍数,但是发现不行,PID完全没有起作用。 具体表现为四轴开机后直往一边倒到底。只好重新开始调。 当我潜入困境时,以为名叫螃蟹的网友帮助了我。他告诉我定P要定在把手放开,开始震荡,只要左右晃二三次就达到大晃动幅度,大晃动幅度大概是45度左右。定下这个P值后然后加入D,而且D有可能比P大。在这个基础上我又开始了调试。 从头来调P,这次我观察到新现象。我把四轴稍微倾向一边几度,比如说左边,当P小时,启动电机松手后,四轴向左倒,如果P大了,四轴回向右倒。前者是补偿不足,后者是补偿过度。在这个两个P值得区间就有我们要找的P,合适的P就是能在平衡位置挣扎左右晃几下的值。此时我的P=3.0但是光靠P四轴还是站不住,只能在平衡位置坚持个1,2s。所以得加入D,尝试D=1,2,3时没什么明显的效果只能观察到起初的短时平衡跟稳定了点。D=10时可明显观察到平衡的时间跟长了,但还是会倒。当D=20,可明显观察到四轴可以基本平衡了,但还是有有小幅震荡,一但有干扰还是不能很快恢复稳定了,D=30时四轴已经开始比之前大的等幅震荡了,而且当有外力干扰时四轴也能抵抗住外力维持自身在平衡位置的震荡状态,说明D有起作用但是D大了。在这种情况下还说明P还是给小了,回复力不足。我把D定在25,再开始调节P,把P加大。增强恢复力。后面得的调节过程中我就是感觉,P会产生一种震荡A,这种A震荡是会发散的,频率较低。D也会产生一种震荡B,B是等幅的,频率较高的。然后P会抑制震荡B,但会激发A,D会抑制震荡A,但会激发B。后面的调节参数就是要调好P后再调D,定好D再调节P,两个参数互相扶持的趋近一个最佳点,想单靠一个参数一次就接近理想值是办不到的。当然机体表现出的等幅震荡时也不一定是D大了,P不合适同样也会产生此种情况。还有调节参数时不要一味只加不减。当我P=4,D=50时我就是将P往回减了点才取得了更好的效果。最后离开平衡杆时P=3.5,D=50。这次没有静差,所以没有I项。 最后来总结几点: 然后贴上我认为对我帮助比较大的两个PID资料,一个讲PID基本定义,一个讲PID参数整定 贴上两个个调试的视频: |
|