5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 63945|回复: 144
打印 上一主题 下一主题

共轴双桨自动驾驶直升机(二)之四轴飞行器篇

[复制链接]
跳转到指定楼层
楼主
发表于 2009-5-20 21:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
上一篇共轴双桨自动驾驶直升机,由于论坛管理原因被关闭了,因为这个帖子已经持续一年了。

下面只好新开帖子,继续记录制作过程。


书归正传,最近几天一直在研究为什么我的四轴总是抖动。今天在和feng_matrix交流的过程中,被他的一个问题“为什么积分总是在正半轴”给提醒,想到也许是四轴重量配比不均匀,导致四轴无法依靠重力稳定在平衡位置。结果造成积分必须持续纠正,引起震荡。

经过分析,我认为这个可能性很大。这样下面就比较明确了,继续研究MK的代码,将其中修改了陀螺仪中立点的部分也搞明白,这样我的四轴就可以自动适应负载变化,不再抖动了。



[ 本帖最后由 c_nmusic 于 2009-5-20 21:43 编辑 ]

欢迎继续阅读楼主其他信息

沙发
发表于 2009-5-20 22:13 | 只看该作者
没看动 沙发:em15:
3
发表于 2009-5-20 23:56 | 只看该作者
看过楼主上一篇帖子,支持下!
4
发表于 2009-5-21 09:43 | 只看该作者

修改好了没有啊!实验一下啊!

:em04:
5
发表于 2009-5-22 00:12 | 只看该作者
:em04:
6
 楼主| 发表于 2009-5-22 07:36 | 只看该作者
这2天在我的四轴上试验了一下,发现一个很关键的问题——如果陀螺仪中立点没有变化,为了能够自动补充重心改变引起的不平衡,而手动调整了中立点,最大的问题是这样积分就会一下子变化很大,是根本无法继续做到平衡的。

看起来我的问题还需要自己想办法。

目前我在查的地方有几个:
1、机架配重不对称,目前是容易左右晃动,所以我检查了一下左右的配重。除了发现多了一个铜柱外没有什么太大差异。
2、姿态控制频率一致性不够。由于加入了SD卡,所以那个文件系统时不时地要写一下SD,这样就会造成延迟。引起频率变化从425Hz到470Hz都有。也许这个会引起积分变化,引起晃动。这个是目前重点怀疑的。
3、P参数过大。这个也会引起震动,因为过大的P会把陀螺仪震动也放大,引起机身震动。这个我前几天试飞只用P后已经调整到一个比较合适的参数了。
7
发表于 2009-5-22 11:07 | 只看该作者
:em15:
8
发表于 2009-5-22 18:41 | 只看该作者

你好!

调整的不是陀螺仪的中立点吧,,调整的是方向杆量的中立点吧,

这就相当于,人为进行部分校正,手工修改姿态。

这样,陀螺仪的积分量,就不会捣乱了!
9
 楼主| 发表于 2009-5-22 21:43 | 只看该作者
原帖由 nomoneyiv 于 2009-5-22 18:41 发表
调整的不是陀螺仪的中立点吧,,调整的是方向杆量的中立点吧,

这就相当于,人为进行部分校正,手工修改姿态。

这样,陀螺仪的积分量,就不会捣乱了!


我参考MK的代码,看到他里面有调整陀螺仪中立点的部分。
但是我的目地是想达到调整方向杆量的功能。可惜没有在MK的代码里看到。

现在看起来,也许是别的部分的代码起到了这个作用。
10
 楼主| 发表于 2009-5-22 21:47 | 只看该作者
今天稳定性有了点收获。

我把四个马达都换掉了,以前用的850KV的马达有一个桨夹被一次倒扣给撞弯了,然后只要高转速就会非常抖,抖到手根本拿不住。而另外2个马达就没这个问题。由于桨夹没有单卖的,只好把4个马达全都换了。现在也是新西达2212 1000KV的马达了。

经过这个调整后,现在水平方向已经比较平稳了,以前的晃动被消除了。不过前后又开始晃动,真是按下葫芦瓢又起。不过这回的抖动我知道原因——重心配比不平衡,由于我这个四轴并不是完全对称的机架,以前手工设置的马达调整量不完全正确,所以四轴自己拉平后一撤掉调整量就又歪了,于是就开始晃动。

现在的姿态调整频率已经稳定到500Hz,这是拿示波器量过确认的。我把SD卡部分的代码放到了main里,这样就不用担心姿态调整中断被打扰了。给我的感觉现在有可能上到1000Hz的调整速度呢。
11
发表于 2009-5-22 23:24 | 只看该作者
:em26:
12
 楼主| 发表于 2009-5-23 15:20 | 只看该作者
今天继续有所收获。

本来是根据MK的四轴来调整我的四轴I参数的,我发现MK的四轴在倾斜45度后马达转速加倍,于是我就用这个来调整我的I参数,可缺发现了这个问题。



陀螺仪积分放一阵子不动会自己衰减下去。这个以前还没注意到过。

又仔细看了看MK的数据,他的没有这个问题。



陀螺仪积分和加速度配合的很好。

可这时为什么呢?忽然我想到以前看到单没有引起注意的一个参数:ACC_AMPLIFY。

在MK的融合算法的即时融合里,我注意到他用加速度计去补偿陀螺仪的积分,这2种风马牛不相及的东西居然可以放到一起,这个ACC_AMPLIFY起到了关键的作用。它将加速度计的数据放大,做到和积分差不多,然后才能用来补偿。而我犯的错误就是直接拿原始的加速度计数据去补偿了,结果怎么算积分也是偏大,这就造成了陀螺仪积分逐渐地被越衰减越小。

重新设置的放大倍数为3的ACC_AMPLIFY参数后,四轴地积分曲线终于正常了,不再会衰减了。
13
 楼主| 发表于 2009-5-23 15:53 | 只看该作者
下面这个图可以看出有没有对陀螺仪积分进行调整的区别。


看到这个图以后,我就明白了MK后面的针对陀螺仪的0点调整代码里的一些参数是怎么来的了。

[ 本帖最后由 c_nmusic 于 2009-5-23 16:02 编辑 ]
14
发表于 2009-5-23 18:05 | 只看该作者

你好

期待你的继续,我的有机会了,也会加入你的讨论中!呵呵!:em19:
15
发表于 2009-5-24 11:19 | 只看该作者
楼主你好,一直关注你的帖子。能不能吧你参考的老外的源码发一份给我,我也学习学习。
huqingpp@yahoo.com.cn
谢谢
16
发表于 2009-5-24 13:20 | 只看该作者
关注中!:em00:
17
 楼主| 发表于 2009-5-24 13:47 | 只看该作者
原帖由 huqingpp 于 2009-5-24 11:19 发表
楼主你好,一直关注你的帖子。能不能吧你参考的老外的源码发一份给我,我也学习学习。
huqingpp@yahoo.com.cn
谢谢


这里下:
V0.71h Code Redesign killagreg.rar (84.63 KB, 下载次数: 442)
18
 楼主| 发表于 2009-5-24 16:34 | 只看该作者
今天搞定了视频http://www.mikrokopter.de/ucwiki/VideoAbspielen?id=181 里的那个挂相机的动作,终于明白了为什么MK的可以做到这种稳定。

我的四轴现在也可以在重心变化的时候保持稳定了,原因很简单,就是因为陀螺仪。

在挂上重物后,四轴一起飞,势必往重的方向倾斜,这就产生了一个这个方向的角速度。可以角速度可以被陀螺仪检测到并由PID处理。由于处理频率很快,所以基本没有时间让这个角速度产生位移就处理完了。这就形成了在外部看来四轴完全不受重心改变的影响。这个效果并不需要特殊的代码就可以做到,实在是很巧妙的。核心就是一个相当大的I参数,大到可以产生足够的拉力把重物拉起来。
19
 楼主| 发表于 2009-5-24 17:23 | 只看该作者
今天还把陀螺仪温飘的修正代码加上了,不过在试飞的时候并没有出现过调整动作。

   // deviation of gyro nick integral (IntegralNick is corrected by averaged acc sensor)
   IntegralErrorNick  = IntegralNick2 - IntegralNick;
   Reading_IntegralGyroNick2 -= IntegralErrorNick;

   cnt = 1;// + labs(IntegralErrorNick) / 4096;
   CorrectionNick = 0;
   if((labs(MeanIntegralNick_old - MeanIntegralNick) < MOVEMENT_LIMIT) || (FCParam.Kalman_MaxDrift > 3* 16))
   {
    if(IntegralErrorNick >  ERROR_LIMIT2)
    {
     if(last_n_p)
     {
      cnt += labs(IntegralErrorNick) / ERROR_LIMIT2;
      CorrectionNick = IntegralErrorNick / 8;
      if(CorrectionNick > 5000) CorrectionNick = 5000;
      AttitudeCorrectionNick += CorrectionNick / BALANCE_NUMBER;
     }
     else last_n_p = 1;
    }
    else  last_n_p = 0;
    if(IntegralErrorNick < -ERROR_LIMIT2)
    {
     if(last_n_n)
     {
      cnt += labs(IntegralErrorNick) / ERROR_LIMIT2;
      CorrectionNick = IntegralErrorNick / 8;
      if(CorrectionNick < -5000) CorrectionNick = -5000;
      AttitudeCorrectionNick += CorrectionNick / BALANCE_NUMBER;
     }
     else last_n_n = 1;
    }
    else  last_n_n = 0;
   }
   else
   {
    cnt = 0;
    BadCompassHeading = 1000;
   }
   if(cnt > ParamSet.DriftComp) cnt = ParamSet.DriftComp;
   if(cnt * 16 > FCParam.Kalman_MaxDrift) cnt = FCParam.Kalman_MaxDrift / 16;
   // correct Gyro Offsets
   if(IntegralErrorNick >  ERROR_LIMIT)   AdNeutralNick += cnt;
   if(IntegralErrorNick < -ERROR_LIMIT)   AdNeutralNick -= cnt;

这是MK的0点调整代码,再解说之前,先看看为什么需要进行温飘调整。

还是这个图:


通过这个图可以很明确地看出来,如果不进行温飘调整,到后来陀螺仪会越偏越大,直到超过加速度计的调整范围。
在实际测试中,如果让马达转2分钟,在没有0点调整代码的情况下,会明显感觉四轴开始慢慢地向一边歪,而程序则将这个歪的位置认为是平衡位置。

看到这个图,我们大概也可以明白如何进行0点调整了。那就是我们需要比较陀螺仪的原始数据的积分和我们经过调整后的积分值之间的差异,如果这个差异过大,那么说明我们需要动一下0点了。MK的流程也差不多是这样,只是他写的比较复杂。

   // deviation of gyro nick integral (IntegralNick is corrected by averaged acc sensor)
   IntegralErrorNick  = IntegralNick2 - IntegralNick;
   Reading_IntegralGyroNick2 -= IntegralErrorNick;

这部分,就是计算陀螺仪原始数据积分和调整后积分的差异的。IntegralNick2,Reading_IntegralGyroNick2  是陀螺仪原始数据积分,IntegralNick是经过加速度计调整后的积分,IntegralErrorNick  就是他们的差异。
第一行求出差异,第二行将这个差异从陀螺仪的原始积分里去掉,Reading_IntegralGyroNick2 这个是真正在AD部分用的陀螺仪原始数据积分。这个去掉的动作很重要,否则的话一旦积分差异超过上限,就会一直调整下去。

下面的部分就是根据这个差异进行判断,其实很多时候代码执行起来是这样的:
   cnt = 1;
   // correct Gyro Offsets
   if(IntegralErrorNick >  ERROR_LIMIT)   AdNeutralNick += cnt;
   if(IntegralErrorNick < -ERROR_LIMIT)   AdNeutralNick -= cnt;

关键部分就是:
  if(IntegralErrorNick >  ERROR_LIMIT)   AdNeutralNick += cnt;
   if(IntegralErrorNick < -ERROR_LIMIT)   AdNeutralNick -= cnt;

其中ERROR_LIMIT是(BALANCE_NUMBER * 4),意思是如果我们每次进行积分,2个数据差异都有4,那么说明我们确实应该调整一下中立点了。
代码简化成上面的形式就容易理解多了,就是看一下差异,如果超过ERROR_LIMIT那么就对陀螺仪中立点增加1,如果小于-ERROR_LIMIT,那么就减1。
而这个差异是执行了BALANCE_NUMBER次计算后的,也就是积分要在0.5秒内差出这么多才可以。条件还是很严格的。

不过MK还多想了一些,还想到了如果在这0.5秒内一下子差出(BALANCE_NUMBER * 16)的情况:
cnt = 1;// + labs(IntegralErrorNick) / 4096;
   CorrectionNick = 0;
   if((labs(MeanIntegralNick_old - MeanIntegralNick) < MOVEMENT_LIMIT) || (FCParam.Kalman_MaxDrift > 3* 16))
   {
    if(IntegralErrorNick >  ERROR_LIMIT2)
    {
     if(last_n_p)
     {
      cnt += labs(IntegralErrorNick) / ERROR_LIMIT2;
      CorrectionNick = IntegralErrorNick / 8;
      if(CorrectionNick > 5000) CorrectionNick = 5000;
      AttitudeCorrectionNick += CorrectionNick / BALANCE_NUMBER;
     }
     else last_n_p = 1;
    }
    else  last_n_p = 0;
    if(IntegralErrorNick < -ERROR_LIMIT2)
    {
     if(last_n_n)
     {
      cnt += labs(IntegralErrorNick) / ERROR_LIMIT2;
      CorrectionNick = IntegralErrorNick / 8;
      if(CorrectionNick < -5000) CorrectionNick = -5000;
      AttitudeCorrectionNick += CorrectionNick / BALANCE_NUMBER;
     }
     else last_n_n = 1;
    }
    else  last_n_n = 0;
   }

首先,如果上次的陀螺仪积分平均值和这次的差异不大,那么去判断是否需要调整中立点。具体为什么,不知道,有待后续研究。
下面就是判断的流程,如果积分差异超过ERROR_LIMIT2,也就是(BALANCE_NUMBER * 16),且出现了2次(last_n_p标志位),那么我们根据这个积分差异来计算cnt这个调整量的数值。
然后根据差异算出AttitudeCorrectionNick 的调整量。

不过我比较怀疑有多大几率陀螺仪0点会一下子飘很多,一般情况下都是慢慢飘的,所以我怀疑这部分复杂逻辑在实际飞行时有没有起到很多的作用。
20
发表于 2009-5-25 16:44 | 只看该作者
我是来学习的
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

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