智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 17531|回复: 21
打印 上一主题 下一主题

浅谈PID调试心得

    [复制链接]

4

主题

65

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1991
威望
1113
贡献
442
兑换币
56
注册时间
2010-11-11
在线时间
220 小时
跳转到指定楼层
1#
发表于 2013-10-11 11:35:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 keyx 于 2013-10-11 11:48 编辑

本人曾在大二,大三参加过第六,第七届飞思卡尔智能车比赛,之后在考研过后在飞思卡尔智能车为我打下的良好基础下开始制作四轴飞行器。在年中到现在陆续调试了两架四轴,一架十字,一架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调试。

下面我讲讲我在调第二个X四轴过程中遇到的问题。
第二架四轴是我做了用来参加爱板网的ARM-STM32校园比赛的,因为第一架属于学校了财产留在学校了,手里没有。第二架的配置采用的是飞越的650碳纤机架,电调用的是好赢的奔腾40A,电机同样是新西达2212 1000kV。其实这个机架和电调配这个电机是大才小用了,但是我的预算实在不够了就只好买了个水一点的电机,等以后在升级。这次我才用X型四轴,主要是挂了云台。PID的设计与之前讲的一样,就不多说了直接说调试中遇到的问题。

调试方法还是先调平衡杆,如图:











刚开始调X的时候我以为跟十字的差不多,于是我只是简单的把原有PID参数按照新的程序里面的PWM值域缩放了一下倍数,但是发现不行,PID完全没有起作用。

具体表现为四轴开机后直往一边倒到底。只好重新开始调。
还是P=1,I=0,D=0开始,这组参数我发现,开机后四轴往一边倒,但是没有倒下就起不来了。在倒到一个很大的角度,大概70度左右,电机力量像是突然加大,四轴起来,反向,接着倒向另外一边。进入失控的大幅震荡。
因为一开始就倒,所以是P太小。于是我开始加大P,但是当我把P加到很大时,四轴还是一开始往一边倒,然后电机力量增大,四轴翻倒向另外一边,开始发散性的震荡。此时我觉得开始P比较小的时候是P不足,电机的惯性的作用下开始震荡。到后来是P太大了,直接进入震荡。我始终没有观察到一个等幅震荡或者说接近小幅震荡的点。无论P大P小我的四轴都会进入失控的发散震荡。换而言之这个X四轴光靠P根本进入不不了一个比较稳定的状态或者接近稳定的状态。连相对稳定的等幅震荡都观察不到就直接进入发散的震荡。此时我开始困惑了。这个情况跟十字的很不一样。我没有明显观察到网上流传最通俗的调节PID说法的那种情况,即:逐渐加大P直到开始发生等幅震荡,然后P不变,加入D抑制震荡。。。
我观察到的是P无论怎么给,我的四轴都倒向一边然后开始进入发散的震荡,唯一的区别就是P小一开始倒下的角度大,P越大一开始倒下得角度越小,进入震荡的越快。此种情况与前一个四轴的情况截然不同。

当我潜入困境时,以为名叫螃蟹的网友帮助了我。他告诉我定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大了。在这种情况下说明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项。


最后来总结几点:
1.我觉得调节PID首先要明白最基本PID三项的意义P是回复力是系统平衡的主力,D是阻尼力,始终是抑制作用,I虽然能使系统回复但是I大了容易激发震荡,所以I只能是辅助P
2.一般从P开始调节时候首先要找到临界震荡点,要学会便是系统临界震荡点的特点,不同系统临界状态可能不同。
3.P不一定就比D大,切不可经验主义,一切遵循实际,多尝试可能性
4.调节PID最麻烦的就是会产生震荡,只要参数不合适都会产生震荡,初学者往往心急不知如何下手,其实是不同参数不合适而产生的震荡都有所区别,要细心观察,最好是能看PID输出,被调量,设定值三者的曲线图,通过图来对比特征曲线得出震荡产生的原因,关于曲线特征判别我推荐下面附件中的篇文献。
5.调节参数是个令人蛋疼的活,一定要心平气和,切莫急躁,多多尝试,我觉得一个平静的心态是在调PID时很重要,能让你脑子清醒的看清问题。调参数很枯燥,如果 你很烦或者很着急,调不出来只会让你更加烦躁,更迷糊。还有就是耐心,多试。参数选择刚开始不知道大致范围时参数尝试变化范围可以大一点。确定范围后就要耐心的一点点的加。
6.以上所言都是针对位置式PID,增量式PID三组参数所起作用与位置式大相径庭,不可套用。

然后贴上我认为比较好的两个PID资料,一个讲PID基本定义,一个讲PID参数整定
贴上几个调试的视频:
十字
PID输入:单位:角度,度每秒;PID输出PWM宽度:250-500,P:0.4,I:0.35,D:0.15, 控制周期4ms
PWM频率125
X型
PID输入:单位:角度,度每秒;PID输出PWM宽度:1000-2000,P:3.5,D:50,控制周期4ms
PWM频率125

最后贴上一个我参加ARM-ST校园创新比赛的视频
希望大家顺便支持我一票,投票地址
基于STM32F4的四轴航拍飞行器就是我的作品,投票窗口里的图片点进去还可以下到我的四轴源代码及论文
谢谢大家支持











本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

5

主题

171

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3616
QQ
威望
1742
贡献
1148
兑换币
1163
注册时间
2013-8-5
在线时间
363 小时
2#
发表于 2013-10-11 18:07:47 | 只看该作者
回复 支持 反对

使用道具 举报

8

主题

185

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6711
QQ
威望
4558
贡献
1251
兑换币
633
注册时间
2012-10-19
在线时间
451 小时
3#
发表于 2013-10-11 18:39:11 | 只看该作者
抛砖引玉
回复 支持 反对

使用道具 举报

29

主题

621

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2686

论坛元老奖章

威望
1771
贡献
53
兑换币
1177
注册时间
2013-5-28
在线时间
431 小时
4#
发表于 2013-10-11 19:10:55 | 只看该作者
厉害
回复 支持 反对

使用道具 举报

17

主题

950

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4892

活跃会员奖章优秀会员奖章论坛元老奖章在线王奖章

威望
3047
贡献
817
兑换币
1947
注册时间
2013-1-28
在线时间
514 小时
5#
发表于 2013-10-11 22:59:43 | 只看该作者
强贴,必须占座围观!!
回复 支持 反对

使用道具 举报

5

主题

441

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4496
威望
2432
贡献
1336
兑换币
849
注册时间
2012-1-20
在线时间
364 小时
6#
发表于 2013-10-11 23:00:05 | 只看该作者
回复 支持 反对

使用道具 举报

4

主题

190

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2184

优秀会员奖章活跃会员奖章在线王奖章

威望
933
贡献
591
兑换币
531
注册时间
2012-10-23
在线时间
330 小时
7#
发表于 2013-10-11 23:55:06 | 只看该作者
楼主辛苦 强势围观
回复 支持 反对

使用道具 举报

137

主题

4169

帖子

1

精华

杰出人士

我认为最省轮子的跑法最快。曾经的西科4队

Rank: 12Rank: 12Rank: 12

积分
14006
QQ
威望
6233
贡献
1229
兑换币
4171
注册时间
2013-1-10
在线时间
3272 小时
8#
发表于 2013-10-12 00:30:05 | 只看该作者
顶~~~
回复 支持 反对

使用道具 举报

16

主题

590

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2987
威望
1599
贡献
34
兑换币
939
注册时间
2012-11-17
在线时间
677 小时
9#
发表于 2013-10-12 07:35:59 | 只看该作者

回复 支持 反对

使用道具 举报

16

主题

458

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3536

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

威望
1663
贡献
1171
兑换币
662
注册时间
2013-1-25
在线时间
351 小时
10#
发表于 2013-10-12 11:03:57 | 只看该作者
给力啊!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 16:32 , Processed in 0.692420 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表