标签:
Arduino + XXD 电调 +1000KV电机、 使用PID来调节稳定性,今天上午终于调节 x,y轴稳定。 回想遇到的问题,真的是试出来的值。
PID算法很简单,写的话不需要10分钟就能写出来,不过要想找对P,I,D三个参数的值 运气好的话自不用说,运气不好调一个月都不一定能调稳。 使用MPU6050调试,在室内是一个轴一个轴地调试,就是架在凳子上,让一个轴能够自由旋转,类似下面这样
使用欧拉角来调节PID三个参数,一开始遇到一个这个问题,就是当我设定值为0度的时候也就是水平放置的时候表现的还算可以,一直小幅震荡,也没有太大发散的现象,可是当我设定值不是0度而是偏转一定角度的时候就表现的啥也不是。 导致这个问题的原因是: 我的油门太小了,。。 因为一开始调的时候扇叶转的很快,不敢将油门加大,只用了 1100的油门(满量程是1900,就是程序中的占空比),油门太小导致飞行器还没有摆脱重力的影响,所以根本都不可能调对。这是放不开的第一个地方。
接下来的时候我们就将基础油门加大了,至少可以摆脱重力的影响了,然后又是几天的P、I、D参数整定。
先调P,如果能摆到平衡位置而且还发散震荡 ,说明P调大了,缩小一些,缩小到能够小幅等幅震荡为止 , 这里给大家说个小技巧,就是先用手将轴转到大约设定的角度,看看轴是不是小幅等幅震荡,如果小幅震荡说明P调好了,反之,如果轴转的过猛,太大了,如果力度感觉不足,那就是太小了 。 这个时候我们肯定不能要求快速性和静态误差。
静态误差的消除,调I。 P调的可以了,就缓慢增加 I ,我们的I都是0.01的增加,具体的做法是I先加一个比较大的值,这个时候四轴反应跟吃x药一样剧烈,然后再缓慢缩小,直到四轴开始平静下来,关于平静下来我也没有一个标准,当然如果你降低的过程中能够快速摆到平衡位置而且还不震荡不超调那说明你走运了。不走运的做法是,I往下降的时候能够等幅震荡,即使这个等幅震荡的幅度还是很大只要能够等幅震荡就可以了,反正只要不发散就已经可以了,等不等幅都是主观感应,也不需要太准,毕竟人又不是仪器。
上面两个参数调好了已经很不容易了,然后开始调D (有的开源飞控都不需要D啊,但是对于我们粗略调试来说不用D上面两个值简直就是没法用)。 刚开始调D,惯例又是没放开,因为调P,调I的时候得出的经验是我能预计到正切值的范围肯定在这附近。但是D完全不是这一回事啊,我一次 +1 +5 +10 仍然有震荡,而且快速性根本不好地说,调平稳需要5~10s !! 直到我都怀疑程序写错算法不对了,然后又是查资料又是开别人的飞控。看了匿名飞控,蔡大代码的PID部分之后发现,那几行核心代码都大差不差啊,为什么就是不行呢! 直到今天早上吧,放开了又调了一次,D生生被我加到了200 -)_(- ,稳了! 曲线大概是这个样子
上升时间不超过 0.5s 而且还能稳定在设定值那里,达到了网上成熟的飞控平稳效果。
PID算法本身而言很简单,背后的理论虽然都在课堂上交给老师了,但在用起来这么爽之后反而激发了自己的求知欲望。 PID核心算法摘自维基,如下伪代码
previous_error = 0 integral = 0 start: error = setpoint - measured_value integral = integral + error*dt derivative = (error - previous_error)/dt output = Kp*error + Ki*integral + Kd*derivative previous_error = error wait(dt) goto start
总结除了关键的地方就是被一些潜在的意识所束缚,调试飞行器的过程中理论分析也是必不可少。
标签:
原文地址:http://my.oschina.net/000quanwei/blog/484598