amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 50717|回复: 162

浅谈四轴PID调试心得

  [复制链接]
发表于 2013-10-11 13:32:55 | 显示全部楼层 |阅读模式
本帖最后由 keyxyh 于 2013-10-11 22:19 编辑

PID调试心得

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

首先例举第一个例子,我调的第一台四轴飞行器,十字型四轴飞行器,讲下配置:
网上一百多的650机架,好赢20A电调,新西达2212 1000kV,1045的桨,2200mah电池。
主控是STM32F103
这是第一个四轴的帖子
http://www.amobbs.com/thread-5539270-1-1.html

采用位置式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开始尝试,找到一个适合的点,即刚开是出现震荡的P值最后我定为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。主控是STM32F407
其实这个机架和电调配这个电机是大才小用了,但是我的预算实在不够了就只好买了个水一点的电机,等以后再升级。
这次我采用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有起作用但是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三组参数所起作用与位置式大相径庭,不可套用。
7.多与人交流,在这里再次感谢指导我的诸多网友
8.调节PID最好能看曲线图,判别特征曲线,又曲线来看特征比直接看物体表现好得多

然后贴上我认为对我帮助比较大的两个PID资料,一个讲PID基本定义,一个讲PID参数整定


贴上两个个调试的视频:
第一个是十字的,
PID输入:姿态角,角速度,单位:角度和度每秒;PID输出PWM宽度:250-500,P:0.4,I:0.35,D:0.15, 控制周期4ms,PWM频率125hz
http://v.youku.com/v_show/id_XNjE3NjI3OTY4.html
第二个是X型的,
PID输入:姿态角,角速度,单位:角度和度每秒;PID输出PWM宽度:1000-2000,P:3.5,D:50,控制周期4ms,PWM频率125hz
http://v.youku.com/v_show/id_XNjE3MTcyODQw.html

最后贴上一个我参加ARM-ST校园创新比赛的视频,这里面包含了四轴的讲解与新四轴试飞视频
http://v.youku.com/v_show/id_XNjE3NzM0NTky.html
最后请允许我为我的作品求几票,这是投票连接
http://www.eeboard.com/bbs/plugin.php?id=eef_activity:list
基于STM32F4的四轴航拍飞行器就是我的作品,当然里面也有还有其他选手做的很多有意思的作品,这里面的作品i都应该是开源的
谢谢大家支持。

本帖子中包含更多资源

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

x
发表于 2013-10-11 15:46:34 来自手机 | 显示全部楼层
太棒啦!!
发表于 2013-10-11 17:04:13 | 显示全部楼层
雀巢不错
发表于 2013-10-11 17:17:46 | 显示全部楼层
不错,学以致用!
发表于 2013-10-11 18:42:17 | 显示全部楼层
现在正为四轴的PID,搞得头大,学习一下,说不定找到解决的方法,所以,得顶。
发表于 2013-10-11 19:37:07 | 显示全部楼层
顶  正在调试四轴的pid
发表于 2013-10-11 21:53:52 | 显示全部楼层
本帖最后由 liang_work 于 2013-10-11 21:55 编辑

         楼主,我认真阅读你的贴子,觉得你的贴子真的很不错。在调四轴的PID,也很有心得。现在我在调四轴的PID,也碰到了个头大的问题,一直没有得到解决,我调的四轴是匿名的套件,程式基本用他原配的,没有太大的改动,看到你也对匿名的四轴程式,也有一定的了解,可否帮忙参考一下,下面的现象,问题是出在那里。
     由于我已就这个问题,开了一个贴子,且内容比较多,就麻烦楼主移步到别一个贴子看看。


《匿名四轴,调试PID,在手上可以回中,飞起来却不能回中》
http://www.amobbs.com/forum.php? ... p;page=1#pid7018054
 楼主| 发表于 2013-10-11 22:07:32 | 显示全部楼层
zksniper 发表于 2013-10-11 17:04
雀巢不错

这亮点找得不错
发表于 2013-10-11 23:31:30 | 显示全部楼层
頂一個
很棒的經驗分享
发表于 2013-10-12 18:32:55 | 显示全部楼层
前几天都要调哭了。。遇到的就是X型的四旋翼的问题。用P完全不可能等幅震荡,然后完全起不来,要么直接震荡到侧翻。而且我只直接用四旋翼飞的,已经断了3根桨【捂脸。。】,然后直接凭自己的感觉把P固定到1,然后往上调D,以为D很小的,结果浪费了好多时间,一怒之下把D翻了几倍。。。你可以说我运气好,妈蛋,飞起来了。。。
现在参数和楼主说的差不是很远。痛心疾首的PID啊。
发表于 2013-10-12 20:52:16 | 显示全部楼层
我只是想不通,为什么,在空中就不能回中,在地面时就可以,两个情况,同样有马达转动,唯一的不同,就是一个在空中,一个在地面。

      在飞机刚从地面飞起时,飞机的平稳性很好,飘移不大,也没有抖动,打杆,飞机可以很好地跟随摆杆的控制的方向,跟随摆杆的幅度大小来变化,但在杆回中,飞机却不能跟随摆杆回中,而减少倾角的大小,或回到平衡的位置。如果要回到接近平衡的位置,还得再打杆到相反的方向,飞机倾角才会有相反的变化,跟据这一次打杆的角度大小时间的长短,飞机原来的倾角可能减少,或可以刚好到回到开始的平衡位置,或由于打杆过度,飞机又倒向另一方向。其本上,没有办法回到开始时的平衡状态。
发表于 2013-10-12 22:23:27 | 显示全部楼层
楼主,先调两个电机,你说的只加P的时候,四轴会来回振荡,可是我调的结果是只加P能感到回复力,四轴不会在平衡位置来回摆啊,除非用手扶着,否则直接翻过来了,这样正常么?
发表于 2013-10-12 22:31:30 | 显示全部楼层
mark........
发表于 2013-10-12 22:51:38 | 显示全部楼层
好 学习一下                                                                                                                                 
 楼主| 发表于 2013-10-13 01:13:37 | 显示全部楼层
mahengyu 发表于 2013-10-12 22:23
楼主,先调两个电机,你说的只加P的时候,四轴会来回振荡,可是我调的结果是只加P能感到回复力,四轴不会在 ...

没听懂,你把P从小到大都试了吗?你到地是震荡呢还是不震荡呢,不震荡不就是我们要的结果吗?
发表于 2013-10-13 07:29:55 | 显示全部楼层
keyxyh 发表于 2013-10-13 01:13
没听懂,你把P从小到大都试了吗?你到地是震荡呢还是不震荡呢,不震荡不就是我们要的结果吗? ...

是这样的, 我把P从0.1到2,20个值都试了,p小的时候仅仅能感受到回复力,但是P大的时候回复力能把四轴从一侧拉向另一侧,但是他不会在平衡位置震荡,直接就翻过来了。除非我用手扶着它在平衡位置,他会来回摆动,就是震荡。
这样正常么?
发表于 2013-10-13 21:52:46 | 显示全部楼层
mahengyu 发表于 2013-10-13 07:29
是这样的, 我把P从0.1到2,20个值都试了,p小的时候仅仅能感受到回复力,但是P大的时候回复力能把四轴从 ...

你把d加进去试试,然后d固定(凭感觉定d值,一般在0~1就差不多了),再调p
发表于 2013-10-15 22:45:34 | 显示全部楼层
必须回来给你顶一下,我觉得你们的调试方法很有启发性
发表于 2013-10-15 23:00:19 | 显示全部楼层
very good!
发表于 2013-10-17 21:04:31 | 显示全部楼层
mark                  
发表于 2013-10-18 09:39:56 来自手机 | 显示全部楼层
顶一下,记号
发表于 2013-10-19 11:12:21 | 显示全部楼层
很不错经验,学习了,最近调小四轴,被pid搞烦了,调了很久都是在震荡,用的PID控制函数也是和楼主一样的。
发表于 2013-10-19 12:00:34 | 显示全部楼层
学习一下
发表于 2013-10-19 17:33:49 | 显示全部楼层
楼主,我的四轴是十字的,我先调了两个电机,  P是1.2,D是35,I是0.005,能够保持平衡,没加yaw的pid     
再调另外两个,也能够保持平衡
但是加在一起就不行了,四轴振荡,按与十字机架呈45度的方向振荡
我应该怎么办?
 楼主| 发表于 2013-10-19 19:44:08 | 显示全部楼层
mahengyu 发表于 2013-10-19 17:33
楼主,我的四轴是十字的,我先调了两个电机,  P是1.2,D是35,I是0.005,能够保持平衡,没加yaw的pid      ...

没遇到多你说的现象,但在X四轴时遇到过,当时我产生这种现象是因为每个方向融合到电机输出时的方向搞反了。所以我现在怀疑你每个轴的PID输出在融合到电机输出时的方向有问题,使得R,P轴之间产生了耦合
发表于 2013-10-19 20:29:09 来自手机 | 显示全部楼层
keyxyh 发表于 2013-10-19 19:44
没遇到多你说的现象,但在X四轴时遇到过,当时我产生这种现象是因为每个方向融合到电机输出时的方向搞反 ...

可是我分开调的时候,每两个电机都可以平衡的,说明方向应该没反吧?
 楼主| 发表于 2013-10-20 01:39:44 | 显示全部楼层
mahengyu 发表于 2013-10-19 20:29
可是我分开调的时候,每两个电机都可以平衡的,说明方向应该没反吧?

真心不解
发表于 2013-10-20 12:41:04 | 显示全部楼层
keyxyh 发表于 2013-10-20 01:39
真心不解

楼主,我又来了

十字的,先调俩电机,能平衡,但是增加转速,四轴又乱晃了,这是怎么个情况?
发表于 2013-10-20 14:56:25 | 显示全部楼层
有用,谢谢楼主。
 楼主| 发表于 2013-10-20 23:40:29 | 显示全部楼层
mahengyu 发表于 2013-10-20 12:41
楼主,我又来了

十字的,先调俩电机,能平衡,但是增加转速,四轴又乱晃了,这是怎么个情况? ...

是说你推油门就不平衡了?说明你PID参数调的不好,是假的参数
发表于 2013-10-21 14:57:44 | 显示全部楼层
mahengyu 发表于 2013-10-19 17:33
楼主,我的四轴是十字的,我先调了两个电机,  P是1.2,D是35,I是0.005,能够保持平衡,没加yaw的pid      ...

我的也是遇到了这种情况,飞起来后就侧翻了。
发表于 2013-10-28 17:26:32 | 显示全部楼层
学习一下.
发表于 2013-11-4 10:43:03 | 显示全部楼层
不错,学习了
发表于 2013-11-5 20:39:25 | 显示全部楼层
学习中 标记
发表于 2013-11-6 17:09:32 | 显示全部楼层
好帖子~~顶一个~~
发表于 2013-11-8 16:36:10 | 显示全部楼层
顶一下,记号
发表于 2013-11-8 18:46:24 | 显示全部楼层
顶啊,PID参数问题恼火了很久了···
发表于 2013-11-8 21:43:42 | 显示全部楼层
大神的好帖啊,我刚开始调自己的pid,上手就是x型的,跟你帖子了的状态一样,好头疼,看了你的方法,我准备回头试试,感谢无私的经验总结啊
发表于 2013-11-8 22:49:43 | 显示全部楼层
我正着手玩这个,先向你们学习
发表于 2013-12-26 11:53:55 | 显示全部楼层
楼主的调试方法很值得学习,那个四个轴上的杆子是怎么弄到的?
 楼主| 发表于 2013-12-26 13:06:26 | 显示全部楼层
max-men 发表于 2013-12-26 11:53
楼主的调试方法很值得学习,那个四个轴上的杆子是怎么弄到的?

凉衣杆,俗称叉棍
发表于 2014-1-6 20:50:14 | 显示全部楼层
您好  我现在在调两个轴  要给两个控制量  是不是要给两个不同的pid公式?
 楼主| 发表于 2014-1-7 14:28:38 | 显示全部楼层
max-men 发表于 2014-1-6 20:50
您好  我现在在调两个轴  要给两个控制量  是不是要给两个不同的pid公式?

不是,PID公式都是一样的
发表于 2014-1-8 19:38:29 | 显示全部楼层
楼主 你Yaw 方向怎么调啊
发表于 2014-1-8 22:36:46 | 显示全部楼层
先关注吧,肯定要向你们多学习了。
发表于 2014-1-11 22:47:57 | 显示全部楼层
976717326 发表于 2013-10-12 18:32
前几天都要调哭了。。遇到的就是X型的四旋翼的问题。用P完全不可能等幅震荡,然后完全起不来,要么直接震荡 ...

当飞机快要起飞时(PWM=800),飞机可以稳定下来,给予干扰可以回复,只是有一些振荡而已。
现在的PD是P=3.5,D=0.8。起飞的PWM是1000左右。
现在加大油门之后直接就侧翻(估计有1400了),就算一边有80°的静差依旧往下掉,似乎P完全不起作用,是P小了吗?
那为什么PWM=800的时候可以平衡?
是楼主说的假的PID参数吗?
请问你遇到过这种问题没有
发表于 2014-1-12 09:33:53 | 显示全部楼层
本帖最后由 问乐寻音 于 2014-1-12 09:35 编辑
keyxyh 发表于 2013-10-20 23:40
是说你推油门就不平衡了?说明你PID参数调的不好,是假的参数


那不是假参数,我也是这种情况,小油门的时候非常好,一开大油门就直接侧翻,我开始也以为是p小了,但是油门小的时候没问题呀,而且姿态角也是正确的。
昨天晚上躺在床上突然想明白了,说的专业一点是由于输出PWM已经进入了非线性区,达到了电机的最大PWM值,无法提供反向的力矩平衡。通俗一点就是说由于你的油门(基本PWM)达到了一个比较高的值,此时经过姿态运算和PID运算后的附加值叠加在这个油门值上已经超过了你的最大PWM,无法再提供更多的力矩了,显然会侧翻。
举个形象一点的例子:比如现在我的PWM满值为2000,基本PWM为1000(基础油门),误差角假设到达了70°,乘以P(2.0)得到140的增量值给1000,就是1140,显然小于满值2000,这个时候如果飞机左倾,那么左边两个电机的PWM均为1140,右边两个电机的PWM为1000-140=860,这样的话飞机在两个力矩的帮助下翻转平衡过来。现在问题来了,当PWM满值为1100的时候,明显1140超过了,由于限幅只有1100,那么就少了40对应的PWM提供的力矩,而另一边仍然是860,所以往右翻转的力矩明显就小于刚来的力矩,等效于P减小,无法翻转过来。我刚才的例子还是不推油门,你如果直接把油门推到最大值1100的时候,就算你有100°的误差,他也不可能再继续增加了,这就等效于P缩减为原来值的一半,所以力矩不够,导致的现象就是侧翻。
今天早上测试了一下电机的PWM输出,发现快要侧翻的时候就是这个原因。
希望能够帮助你
发表于 2014-1-12 14:56:34 | 显示全部楼层
shujianxiaoyao 发表于 2013-10-21 14:57
我的也是遇到了这种情况,飞起来后就侧翻了。

刚才就你的问题我给楼主回复了,你可以参看一下,遇到加油门就侧翻的情形我开始找到的原因是由于油门过大而引起的PID运算之后的控制量超过了最大值,导致力矩不够而侧翻。
今天下午我又做了测试,虽然我确保PWM的输出不会达到最大值,但是似乎这种情况仍然存在。
后来我索性将PID运算后的增量值做了一个限幅,我的满PWM为2000,目前设置的最高值为1800(满速不好),然后油门最大值为1300,这样我就有500的裕量给PID运算。
理论上来讲我只需要给增量值给250的限幅就可以了(因为是X模式,是两个电机的综合,所以最差的情况是两倍关系),但是我的是小四轴,只有32g左右,惯性小,这么大的PWM不合适。我大致的找了一下范围。
发现限幅在150的时候就不会侧翻了。这样的话,一个输出就是150的限幅,两个电机加起来(X模式)就是300的PWM力矩,另一边就是-300PWM对应的力矩,这样的力矩足以控制飞机了。
你试一下吧,我感觉可以。
 楼主| 发表于 2014-1-12 15:44:33 | 显示全部楼层
问乐寻音 发表于 2014-1-12 14:56
刚才就你的问题我给楼主回复了,你可以参看一下,遇到加油门就侧翻的情形我开始找到的原因是由于油门过大 ...

要是按照你这么说我直接把油门推到最大,基准PWM就是最大,那岂不是四轴无法保持平衡了?而且直流无刷电机也是线性的,大四轴力道非常大,基本不可能在能起飞的试出现PWM越界的情况
发表于 2014-1-12 16:27:20 | 显示全部楼层
keyxyh 发表于 2014-1-12 15:44
要是按照你这么说我直接把油门推到最大,基准PWM就是最大,那岂不是四轴无法保持平衡了?而且直流无刷电 ...

是啊,就是这样啊。你说的没错,就是因为基准PWM太大,没有留给PID运算的裕量,就和电机全开是相似的。(有一点不同是电机全开是全满,而这个情况是有一边全满,另一边会减少一点值,当然会侧翻。)
我是有刷电机。。。我估计也和非线性有关,电机力量大了,估计力矩就不对了。。
发表于 2014-1-12 16:33:06 | 显示全部楼层
keyxyh 发表于 2014-1-12 15:44
要是按照你这么说我直接把油门推到最大,基准PWM就是最大,那岂不是四轴无法保持平衡了?而且直流无刷电 ...

我发现我那个限幅的方法只是权宜之计。不能解决根本问题。
我也不知道是不是PID参数是否有问题,但是在离起飞还差一点点的时候他是可以平衡的,等到我继续加油门之后就逐渐侧翻下去,这个时候的力度比较大,如果松手就直接像箭一样的飞了出去。
这个现象目测就是P小了。但是在小PWM情况之下(其实也不小,都快起飞了)他是平衡的,还是P太小的问题?那如果我把P继续加大,这就平衡不了了。
唉,我也搞不清楚,两者唯一的区别就是基本PWM的不同,P是不变的,相对来看,小PWM下误差乘以P得到的增量值占小PWM比较大的份额,可能会其作用就平衡了。但是大PWM下误差乘以P得到的增量值占大PWM比较小的份额,而且由于电机的一些什么原因,或许这个P就真的是“小”了,需要加大P来纠正。难道需要写动态P来调整吗?PWM越大,P越大?
还请一起交流是什么原因。。。
 楼主| 发表于 2014-1-12 23:31:29 | 显示全部楼层
问乐寻音 发表于 2014-1-12 16:33
我发现我那个限幅的方法只是权宜之计。不能解决根本问题。
我也不知道是不是PID参数是否有问题,但是在离 ...

你的事有刷电机,线性性不是很好,你要想办法把油门航程控制在线性区间李。至于无刷调的好的话油门推到满也不会有问题的
发表于 2014-1-13 14:52:45 | 显示全部楼层
keyxyh 发表于 2014-1-12 23:31
你的事有刷电机,线性性不是很好,你要想办法把油门航程控制在线性区间李。至于无刷调的好的话油门推到满 ...

我看视频上楼主的四轴水平时有点摆动,这是为什么呢?地效么?
 楼主| 发表于 2014-1-14 02:31:13 | 显示全部楼层
517650971 发表于 2014-1-13 14:52
我看视频上楼主的四轴水平时有点摆动,这是为什么呢?地效么?

一般在平衡杆上这样就差不多了,后面的两个方向在空中一起微调
发表于 2014-1-14 09:29:07 | 显示全部楼层
keyxyh 发表于 2014-1-14 02:31
一般在平衡杆上这样就差不多了,后面的两个方向在空中一起微调

竟然这样就行了。。。我调成这样子了还以为不行。。。纠结了好几天。
你后边的微调是怎么个调法?还是调节PID么?

本帖子中包含更多资源

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

x
 楼主| 发表于 2014-1-15 13:11:36 | 显示全部楼层
517650971 发表于 2014-1-14 09:29
竟然这样就行了。。。我调成这样子了还以为不行。。。纠结了好几天。
你后边的微调是怎么个调法?还是调 ...

你要能飞的起来,调不调就看你自己了,飞不起来当然还得继续调参数
发表于 2014-1-15 14:09:17 | 显示全部楼层
market!!!!!!!!!!!!!!
发表于 2014-1-17 20:06:02 | 显示全部楼层
keyxyh 发表于 2014-1-15 13:11
你要能飞的起来,调不调就看你自己了,飞不起来当然还得继续调参数

我想请问一下,你在调试PID的时候基础PWM你给的是多少,占起飞PWM的多少百分比?
我目前一直都在用90%的起飞PWM来调试,这样我感觉不靠谱。。。
发表于 2014-1-17 20:27:10 | 显示全部楼层
学无止境啊,谢谢分享~
 楼主| 发表于 2014-1-20 01:46:35 | 显示全部楼层
问乐寻音 发表于 2014-1-17 20:06
我想请问一下,你在调试PID的时候基础PWM你给的是多少,占起飞PWM的多少百分比?
我目前一直都在用90%的 ...

没测过,我觉得你这个不重要。管他百分之几多,重要吗?调完了,能飞起来就是好,飞不起来管你多少,还不是得回到地面重新调试
发表于 2014-1-20 05:43:34 | 显示全部楼层
严重支持!
发表于 2014-1-20 09:07:40 | 显示全部楼层
keyxyh 发表于 2014-1-20 01:46
没测过,我觉得你这个不重要。管他百分之几多,重要吗?调完了,能飞起来就是好,飞不起来管你多少,还不 ...

我碰到的问题是我小油门的时候飞机是平衡的,但是当我加到油门快起飞的时候飞机就倾斜一个角度了,而且油门越大,倾角越大。并且这个倾斜只往一边倾斜,另一边始终都可以回中。
测试了姿态,没有问题,准确的。
对角更换了电机,还是往这边倾斜,如果是电机的问题,那么更换之后会往另一边倾斜,但是还是往这边倾斜。真TM见鬼了。
更换了驱动和二极管,没有问题。
测试了PWM输出给四个电机的电压,没有问题,都是相等的。

这到底是什么问题。。。??
发表于 2014-1-20 09:17:26 | 显示全部楼层
keyxyh 发表于 2014-1-20 01:46
没测过,我觉得你这个不重要。管他百分之几多,重要吗?调完了,能飞起来就是好,飞不起来管你多少,还不 ...

刚才那个现象,唯一的情况就是气流和调试重力分布问题。因为我无论在杆子上调试还是用绳子拉着都是这种情况,始终往一边倾斜。另一边非常好。
我用把杆子固定在飞机PCB的上方,不是下方,所以可能有这种重力分布的原因。早上的时候我不管了,直接飞算了。倾斜就倾斜。
你妹的直接就可以起飞了,我还调试了3、4天的PID。因为他总是倾斜。搞了半天是由于调试设备的问题导致的误导现象。
其实当我发现兑换电机之后仍然是往这边倾斜我就开始兴奋了,因为越是奇葩的现象,背后的原因也越是奇葩。

我现在可以飞了。用的是那种姿态环的PID控制的,PID_OUT = P*姿态误差 + I*误差积分 - D*陀螺仪。
不用积分也可以,但是飞机起飞的时候会往一个方向快速的移动,速度比较快。回中极其缓慢。甚至是不回中的。
加了积分,有较大改善,但是仍然会往一个方向走大概2米左右,然后回中。平衡的时候会有缓慢平移现象。
请问这个怎么解决?只能更换串级PID算法吗?这种单环的PD控制可以达到楼主视频中的效果吗?为什么我起飞时的侧移现象那么严重?
发表于 2014-1-20 09:21:00 | 显示全部楼层
谢谢分享,学习了。
发表于 2014-1-20 18:53:56 | 显示全部楼层
问乐寻音 发表于 2014-1-20 09:17
刚才那个现象,唯一的情况就是气流和调试重力分布问题。因为我无论在杆子上调试还是用绳子拉着都是这种情 ...

可以适当加大I?这样回中速度可能会快一点。
另外缓慢平移是很正常的。除非你有定位模块,不然风随便吹一下,你的四轴就会飘很远。
发表于 2014-1-20 19:27:15 | 显示全部楼层
976717326 发表于 2014-1-20 18:53
可以适当加大I?这样回中速度可能会快一点。
另外缓慢平移是很正常的。除非你有定位模块,不然风随便吹一 ...

加大I我没尝试过,如果像你说的那样应该加I可以解决,但是我怕在起飞的时候他一直在积分(因为起飞的时候不可能完美的水平),这样就在起飞的瞬间,如果I越大,那么稳定性肯定越差。虽然回中快一些。
我已经回家了,调试不了了。不过过年回学校之后可以试试。
发表于 2014-1-22 19:21:42 | 显示全部楼层
学习了,多谢分享。
发表于 2014-2-2 18:15:10 | 显示全部楼层
感谢分享,对于我现在很有用。。
发表于 2014-2-5 10:58:49 | 显示全部楼层
马上也要调PID了 ,,mark一下
发表于 2014-2-15 16:43:56 | 显示全部楼层
非常好,能把调试过程和心得写出来,学习了。
发表于 2014-2-16 06:08:07 来自手机 | 显示全部楼层
学习一下
发表于 2014-2-16 12:08:55 | 显示全部楼层
马克~!学习~!!!
发表于 2014-2-19 21:19:36 | 显示全部楼层
感谢楼主提供这么详细的PID调试过程,嘿嘿,
发表于 2014-2-28 11:20:19 | 显示全部楼层
不错,值得学习!
发表于 2014-2-28 22:36:15 | 显示全部楼层
学习PID!
发表于 2014-3-2 17:26:21 | 显示全部楼层
请问一下前辈:我用的是arduino做四轴,我的控制周期是5.8毫秒,起飞的PWM为155最大我设为185最小我设为135,想问问这个范围能不能飞起来.另外我用的PID 中微分是:dError = pp->LastError - pp->PrevError; 不知道这样行不行,虚心向前辈请教.谢谢!
 楼主| 发表于 2014-3-3 19:11:28 | 显示全部楼层
1611182791 发表于 2014-3-2 17:26
请问一下前辈:我用的是arduino做四轴,我的控制周期是5.8毫秒,起飞的PWM为155最大我设为185最小我设为135,想 ...

能不能飞起来取决于你的动力系统提供升力是否足够,像你那样微分也是可以的,各有各的特点
发表于 2014-3-3 22:34:58 | 显示全部楼层
好的!非常感谢楼主!我今天调了之后微分的效果是比较好的,就是比例还没有调出来,发觉好难调呀!
发表于 2014-3-5 17:56:40 | 显示全部楼层
真心的感谢楼主,让我少走一些弯路,但是调出来抗风能力很差,纠结中
发表于 2014-3-6 01:51:34 | 显示全部楼层
好厉害啊!!
发表于 2014-3-24 19:06:31 | 显示全部楼层
mark………………
 楼主| 发表于 2014-3-24 19:38:11 | 显示全部楼层
shiruquaan23 发表于 2014-3-5 17:56
真心的感谢楼主,让我少走一些弯路,但是调出来抗风能力很差,纠结中

抗风能力差说明你P小了,回复力不足,或者是D过大,阻尼力过大
发表于 2014-3-24 19:51:53 | 显示全部楼层
太好了!!!
发表于 2014-3-26 23:02:05 | 显示全部楼层
必须要标记啊
发表于 2014-3-28 11:16:36 | 显示全部楼层
楼主,请问一下我们加了PD之后,是可以回复到一个位置的但是这个位置是倾斜的,怎么解决啊,还有怎么起飞,老是一起飞就歪倒,我们的pitch的P是0.13 roll的P是0.05
发表于 2014-3-28 20:10:40 | 显示全部楼层
X模式不加I,确定没有残差存在么?也许是你肉眼观察不出来,这个理论上行不通啊
发表于 2014-3-28 20:17:55 | 显示全部楼层
太棒啦!!
发表于 2014-3-29 00:04:30 | 显示全部楼层
X模式调了3天还是不行。。油门小时候,比较稳,但有点左右摆动,油门大了之后就很厉害了,甚至倾倒。
 楼主| 发表于 2014-4-1 10:30:36 | 显示全部楼层
a5123058 发表于 2014-3-29 00:04
X模式调了3天还是不行。。油门小时候,比较稳,但有点左右摆动,油门大了之后就很厉害了,甚至倾倒。 ...

你姿态电机启动后算的还是正确的吗?
发表于 2014-4-7 20:24:34 | 显示全部楼层
keyxyh 发表于 2014-4-1 10:30
你姿态电机启动后算的还是正确的吗?

从传回来的3D图像看是正确的。现在改了+模式,飞得很好。有空再调X模式了。
发表于 2014-4-9 01:33:54 | 显示全部楼层

顶一下
发表于 2014-4-14 16:25:52 | 显示全部楼层
我看了你代码,Accoffset_x= Angleaccx/numAcc;                                          
            Accoffset_y= Angleaccy/numAcc;
             Accoffset_z= Angleaccy/numAcc;                                   为什么Accoffset_z= Angleaccy/numAcc;中用Angleaccy?
 楼主| 发表于 2014-4-14 19:56:56 | 显示全部楼层
a5123058 发表于 2014-4-14 16:25
我看了你代码,Accoffset_x= Angleaccx/numAcc;                                          
            Accoffset_y= Angleaccy/numAcc;
             Accof ...

这个是写错了,应该是z,只不过这一段错误不致命。
发表于 2014-4-14 21:39:12 | 显示全部楼层
keyxyh 发表于 2014-4-14 19:56
这个是写错了,应该是z,只不过这一段错误不致命。

我改回来,用上位机看下姿态,完全乱了。
发表于 2014-4-15 14:39:58 | 显示全部楼层
赞啊,我被PID虐死了。。。
发表于 2014-4-15 14:40:25 | 显示全部楼层
赞啊,控制部分是难题。。。
 楼主| 发表于 2014-4-15 15:28:38 | 显示全部楼层
a5123058 发表于 2014-4-14 21:39
我改回来,用上位机看下姿态,完全乱了。

年带有点久远,这个具体该怎么改有点忘了,你把这个Accoffest整个拿掉,应该算出来是对的,只不过这样算出来的角度是绝对的,不会将你的初始位置设为零点罢了。
A_X=(A_X-AccBase_x)*3.9;
A_Y=(A_Y-AccBase_y)*3.9;
A_Z=(A_Z-AccBase_z)*3.9;

A_X=(A_X)*3.9;
A_Y=(A_Y)*3.9;
A_Z=(A_Z)*3.9;
发表于 2014-4-18 16:51:41 | 显示全部楼层
看了你的程序,请问你的yaw为什么不用陀螺仪积分呢
 楼主| 发表于 2014-4-18 23:27:18 | 显示全部楼层
vctor、南 发表于 2014-4-18 16:51
看了你的程序,请问你的yaw为什么不用陀螺仪积分呢

我的Yaw就是用陀螺仪积分算出来的啊
发表于 2014-4-22 23:37:57 | 显示全部楼层
非常有用啊,正在调小四轴的PID
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 粤ICP备09047143号 )

GMT+8, 2017-9-25 03:22

阿莫电子论坛, 原"中国电子开发网"

© 2004-2016 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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