搜索
bottom↓
回复: 11

尼玛啊,看错程序差点出大问题。

[复制链接]

出0入0汤圆

发表于 2013-5-15 15:57:32 | 显示全部楼层 |阅读模式
先声明一点, 这个帖子的用意不是在说谁对谁错,而是把我发现的一个问题和大家讨论,如果说的是对的,可以给大家提个醒, 如果错了,也欢迎大家批评。

http://www.amobbs.com/forum.php?mod=viewthread&tid=5492189&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26digest%3D1

这篇我相信很多人都看过,  但是在今天下午之前,包括我在内都没人发现这里面附带的程序有问题(通过回帖来看,如有遗漏欢迎批评)。具体看下面

先看看公式:


再看看程序:
        // integrate quaternion rate and normalise

        q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;

        q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;

        q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;

        q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;  

有问题吗? 思考10秒钟后有了答案再往下看。。。。


第一次看我觉得是正确的,   实验上的数据也基本上能反应姿态的状态,更重要的是,有网友已经用这个程序飞起来了。
但是!

图中的公式是每一个元素N+1时刻的数值 都和 N 时刻 4个元素 有关。
然而,如果按照程序的写法的话, 只有Q0的数值是正确更新的,  当执行到Q1更新时, 公式里面的那个Q0 已经是N+1时刻的Q0了。 依次类推, Q2 和 Q3就会错的更离谱。



阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-5-15 19:10:44 | 显示全部楼层
好像是有些问题

出105入79汤圆

发表于 2013-5-15 19:28:21 来自手机 | 显示全部楼层
我用这个飞得比较稳,波形也没有滞后。让我想想::>_<::

出0入0汤圆

 楼主| 发表于 2013-5-15 19:37:14 | 显示全部楼层
qwe2231695 发表于 2013-5-15 19:28
我用这个飞得比较稳,波形也没有滞后。让我想想::>_

我只是从公式上面分析, 这个程序这样写肯定和公式有出入,  但是实际我运算过, 由于Q(N+1) 和Q(N) 一般差得不是很大,  所以计算结果上也可以用,带来的误差和陀螺仪本身漂移误差差不多,所以滤波做的好的话会被滤掉。

出105入79汤圆

发表于 2013-5-15 20:05:40 | 显示全部楼层
我改成了:
  qq0=q0;qq1=q1;qq2=q2;qq3=q3;

  q0 = qq0 + (-qq1*gx - qq2*gy - qq3*gz)*halfT;
  q1 = qq1 + (qq0*gx + qq2*gz - qq3*gy)*halfT;
  q2 = qq2 + (qq0*gy - qq1*gz + qq3*gx)*halfT;
  q3 = qq3 + (qq0*gz + qq1*gy - qq2*gx)*halfT;

一样还是可以飞,肉眼看不出差别

出0入0汤圆

 楼主| 发表于 2013-5-15 20:09:50 | 显示全部楼层
qwe2231695 发表于 2013-5-15 20:05
我改成了:
  qq0=q0;qq1=q1;qq2=q2;qq3=q3;

恩,  不过还是和公式一致的好,   其实我也不是看程序才发现错的,而是偶然发现的,    之前我实验的效果如你所说基本没有差别,  

出0入0汤圆

 楼主| 发表于 2013-5-15 20:12:48 | 显示全部楼层
qwe2231695 发表于 2013-5-15 20:05
我改成了:
  qq0=q0;qq1=q1;qq2=q2;qq3=q3;

另外请教一下前辈, 你的程序里滤波是用什么方法?

出105入79汤圆

发表于 2013-5-15 21:03:09 | 显示全部楼层
zouyf12 发表于 2013-5-15 20:12
另外请教一下前辈, 你的程序里滤波是用什么方法?

就是这一段代码 ,加上PID。 还没有研究卡尔曼。

出0入0汤圆

 楼主| 发表于 2013-5-15 23:12:07 | 显示全部楼层
qwe2231695 发表于 2013-5-15 21:03
就是这一段代码 ,加上PID。 还没有研究卡尔曼。

     嗯, 那就是由于有那个用加速度计向量来叉乘矫正的缘故,所以把这部分带来的偏差当成漂移给滤掉了,  我之前由于不懂这个叉乘的原理,所以删了这部分代码,直接看四元数的输出,结果基本上2-3秒就可以飘一度。  但是我还想当年用ENC-03都没有这么惨,  现在想想可能是这个缘故

出0入0汤圆

发表于 2013-5-16 09:53:25 来自手机 | 显示全部楼层
高啊,严谨,果然是技术达人啊

出0入0汤圆

发表于 2014-9-2 16:47:38 | 显示全部楼层
我的理解是1Ms的解算周期的话,Q2 Q3 Q4 基本和之前是一样的。所以公式也是可以的。但是还是建议用5楼的~

出0入0汤圆

发表于 2014-9-2 23:33:03 | 显示全部楼层
大神啊   又学到了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-28 03:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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