搜索
bottom↓
回复: 5

关于四元数表示旋转组合的问题

[复制链接]

出0入0汤圆

发表于 2012-12-2 22:36:05 | 显示全部楼层 |阅读模式
本人平生第一帖,献给阿莫了!
问题是这样的,陀螺仪传回的三个角分别是 a,b,c,那应该怎么用一个四元数来表示这次旋转呢?

假设原始姿态q0={1,0,0,0},q1={cos(a/2),sin(a/2),0,0}表示绕x轴转角,
q2={cos(b/2),0,sin(b/2),0}表示绕y轴转角,q3= {cos(c/2),0,0,sin(c/2)}表示绕z轴转角,
我开始想用三个四元数连乘,来表示组合,即q0 = q0*q1*q2*q3,
但是我后来又想,q0*q1后,y轴在世界坐标系里已经不是(0,1,0)了,那q2也就不适用了,继续连乘就不对了,一直不得解,后来看到一个坛友同志发的外国人的代码,代码如下
  1. #include "IMU.h"
  2. #include <math.h>

  3. //----------------------------------------------------------------------------------------------------
  4. // Definitions

  5. #define Kp 2.0f                        // 比例增益支配率收敛到加速度计/磁强计
  6. #define Ki 0.005f                // 积分增益支配率的陀螺仪偏见的衔接
  7. #define halfT 0.5f                // 采样周期的一半

  8. //---------------------------------------------------------------------------------------------------
  9. // 变量定义

  10. float q0 = 1, q1 = 0, q2 = 0, q3 = 0;        // 四元数的元素,代表估计方向
  11. float exInt = 0, eyInt = 0, ezInt = 0;        // 按比例缩小积分误差

  12. //====================================================================================================
  13. // Function
  14. //====================================================================================================

  15. void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az) {
  16.         float norm;
  17.         float vx, vy, vz;
  18.         float ex, ey, ez;         
  19.        
  20.         // 测量正常化
  21.         norm = sqrt(ax*ax + ay*ay + az*az);      
  22.         ax = ax / norm;
  23.         ay = ay / norm;
  24.         az = az / norm;      
  25.        
  26.         // 估计方向的重力
  27.         vx = 2*(q1*q3 - q0*q2);
  28.         vy = 2*(q0*q1 + q2*q3);
  29.         vz = q0*q0 - q1*q1 - q2*q2 + q3*q3;
  30.        
  31.         // 错误的领域和方向传感器测量参考方向之间的交叉乘积的总和
  32.         ex = (ay*vz - az*vy);
  33.         ey = (az*vx - ax*vz);
  34.         ez = (ax*vy - ay*vx);
  35.        
  36.         // 积分误差比例积分增益
  37.         exInt = exInt + ex*Ki;
  38.         eyInt = eyInt + ey*Ki;
  39.         ezInt = ezInt + ez*Ki;
  40.        
  41.         // 调整后的陀螺仪测量
  42.         gx = gx + Kp*ex + exInt;
  43.         gy = gy + Kp*ey + eyInt;
  44.         gz = gz + Kp*ez + ezInt;
  45.        
  46.         // 整合四元数率和正常化
  47.         q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
  48.         q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
  49.         q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
  50.         q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;  
  51.        
  52.         // 正常化四元
  53.         norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
  54.         q0 = q0 / norm;
  55.         q1 = q1 / norm;
  56.         q2 = q2 / norm;
  57.         q3 = q3 / norm;
  58. }
复制代码
整合四元数和正常化那段,他的意思是用(1,sin(a/2),sin(b/2),sin(c/2))表示一次叁轴旋转。但是我们用a=60,b=0,c=0,即只绕x轴转了60度来验证一下。
以外国人的意思,这次旋转的四元数应该是(1,1/2,0,0),而根据四元数表示旋转的资料说明,应该是(cos30,sin30,0,0)=(根号3/2,1/2,0,0)显然外国的表示法是不符合事实的.
求救,到底要怎样才对?

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

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

出0入0汤圆

 楼主| 发表于 2012-12-3 00:31:24 | 显示全部楼层
没人回复,我自己在用opengl模拟了一下,发现,外国人的是对的,连乘也是对的。

出0入0汤圆

 楼主| 发表于 2012-12-3 00:31:47 | 显示全部楼层
感谢上帝,但是还是不明白原理

出0入0汤圆

 楼主| 发表于 2012-12-3 01:13:05 | 显示全部楼层
外国人的不对,时间长了后,发现和连乘的不重叠了,测试是,先把飞机倾斜60度,这60度再不动,然后只绕飞机z轴,按一定的速度转,连乘的z轴一直不动,外国人的,z轴偏转了,外国的人能正常也一定是很大程度的依赖了他的滤波器修正了

出0入0汤圆

发表于 2012-12-3 04:01:53 | 显示全部楼层
關注一下~

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 00:30

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

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