四轴PID调试心得 - 图文

2019-08-03 11:36

本人曾在大二,大三参加过第六,第七届飞思卡尔智能车比赛,之后在考研过后在飞思卡尔智能车为我打下的良好基础下开始制作四轴飞行器。在年中到现在陆续调试了两架四轴,一架十字,一架X。其中四轴的平衡是很重要的一环,其中涉及到的PID整定,因为听闻今年摄像头也要站起来了,个人认为PID整定过程都有可以互相借鉴之处,顾在此一贴,也顺便为我的ARM-ST校园比赛求支持。

PID调试心得

本人不是自动化出身,也没有受过专业训练,都是自己摸索,在这里浅述一下自己的PID参数整定心得。所言之物皆由实践及自己的理解得出,如有不当之处还请指正。

首先例举第一个例子,我调的第一台四轴飞行器,十字型四轴飞行器,讲下配置: 网上一百多的650机架,好赢20A电调,新西达2212 1000kV,1045的桨,2200mah电池。

采用位置式PID控制,位置式PID公式如下

PID的基本意义我在次就不作阐述了,我只讲我的设计,我以姿态角作为被控制对象,所以

e(k) = 期望-测量 = 给定值-测量姿态角

对于微分项D,我做了一点改变,标准PID的微分项D=kd*(e(k)-e(k-1)),我在实践过程中因为角度的微分就是角速度,而陀螺仪可以直接测出角速度,所以我没有将微分项作为偏差的差而是直接用D=kd*Gyro

实现代码如下

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控制器我大概就是这么实现的,下面讲讲我在调试过程中具体遇到的问题。首先我将四轴固定在单轴平衡平台上,让飞行器完成单轴平衡,主要观察姿态角的(1)稳定性,能否平衡在期望角度;(2)响应性,当操纵命令改变时,四轴能否即时的响应期望的变化;(3)操纵性,由操纵员感受四轴的姿态是否已与操纵,会不会产生响应过冲。

我先调一个轴的平衡再调另外一个轴,最后调YAW轴。

A:开始只调P,将I,D置0。由于不知道PID的大致范围我就随便给了一组值 :P=1,I=0,D=0观察现象。一开电机四轴就开始剧烈左右摇摆,很明显P给大了。然后P从小了往上加。从P=0.1开始试。调试的时候我就发现了一个现象就是我的四轴往一边歪,离平衡的0度差了那么一个角度A,P=0.1时A较大,除非油门推到很大否则四周根本起不来,这是P说明给小了,我再将P=0.2这时四轴状况无明显改善。于是我直接将P加大一点P=0.8,P=0.8时已经可以看出在等幅震荡了,但是不是在0度的平衡位置,也是偏离的一个角度B,此时B较小了。之后我再加大P到1四轴震荡又变大了,但是到震荡中心到零度的静差还是存在。由于此时I=0,所以我决定不管这个静差,先把P的临界震荡点找到。P=0.8时可以观察到比较明显的等幅震荡了,P=0.2时四轴又嫌的无力,所以P应该在0.2~0.8之间。临界震荡点就是P从为震荡到,刚开始震荡的点。

在这里还应注意一点,当P太小时,四轴在很大倾斜的地方,在重力与P的作用下也会震荡,这种震荡不是等幅的,对称的,震荡波谷明显要比波峰绝对值大而且距离0度会很远。这种情况要加以区分。

我把P从0.2到0.8开始尝试,找到一个适合的点,最后我定为0.5。在这个过程中一开始我一直想通过P来消除静差,但是我发现我把P加到很大,已经震荡

的很剧烈了,四轴的震荡中心都不是在0度位置。所以我只能选择先选好P,D最后加入I来解决这个问题。

P=0.5时四轴在他的稳定位置震荡比较小了,但是在外力干扰下很难在稳定下来,抗干扰能力较差。然后我开始调D,在平衡过程中P相当于四轴的回复力,它要努力时四轴在一个稳定的平衡位置,但这个位置不一定是你的期望点。个人认为就是当偏差不在变化时,pid的输出也没有变化了,所以有可能光用P时稳定的位置不一定是平衡的期望的位置。而D是阻尼力,他在四轴有速度的情况下才发挥作用,它与速度方向相反始终是抑制运动。所以他可以抑制震荡,但是他同样也可以抑制P的作用,当震动产生时,在震动的中心点四轴震动速度最大,也是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。


四轴PID调试心得 - 图文.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:图书馆个性化检索服务案例分析

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: