搜索
bottom↓
回复: 28

四元数三子样姿态算法参考程序,想要的加QQ1487494416

[复制链接]

出0入0汤圆

发表于 2011-11-26 08:53:48 | 显示全部楼层 |阅读模式
辛苦写的,你懂得。
头像被屏蔽

出0入0汤圆

发表于 2011-11-26 09:06:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2011-11-26 09:36:28 | 显示全部楼层
哈哈。。。。围观中

出0入0汤圆

发表于 2011-11-26 09:58:35 | 显示全部楼层
坐等被封

出0入0汤圆

发表于 2011-11-26 10:43:27 | 显示全部楼层
asha是个好人,也是个技术高手。封了不知道到底谁损失了。

出0入0汤圆

发表于 2011-11-26 11:03:56 | 显示全部楼层
先支持一下楼主的奉献精神。
既然准备分享了,那就传上来吧,免得封ID了:)

出0入0汤圆

 楼主| 发表于 2011-11-26 12:07:26 | 显示全部楼层
我宁愿被封,程序不传。

出0入0汤圆

发表于 2011-11-26 12:39:09 | 显示全部楼层
私聊可能是有报酬的才会给
其实也无可厚非
但切实不符合论坛的规定

出0入0汤圆

发表于 2011-11-26 12:55:30 | 显示全部楼层
坐等被封!!!

出0入0汤圆

发表于 2011-11-26 13:35:50 | 显示全部楼层
其实四元数就是旋转矢量法的单子样形式,多子样旋转矢量法比四元数计算更精确(这里不是说传感器的误差,而是算法本身误差)
但是我觉得,MEMS的陀螺仪,用四元数就够了,本身误差就很大了。

我不是很懂,MEMS输出的是角速度,而多子样对应的应该是角增量,如果要用多子样四元数,那么还要对时间积分之后,才是角增量。如此在MEMS上的意义是不是真的那么大?

对于四元数看《惯性导航》里的推导过程,结合上面5imx的帖子会比较好理解。我的算法没有用多子样,我觉得不是很有必要。

网上的关于三子样四元数的帖子。

科创论坛有
http://bbs.kechuang.org/read-kc-tid-36679-page-e.html
本板块老帖178楼也有
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1148130&bbs_page_no=1&bbs_id=1025


另外这个是原本的四元数。
http://bbs.5imx.com/bbs/viewthread.php?tid=504301&highlight=%CB%C4%D4%AA%CA%FD


以下是科创版的三子样四元数,这个写得比较清晰。
void init_Q(void)
{////////pitch  roll  yaw
q0=cos(roll/2)*cos(pitch/2)*cos(yaw/2)+sin(roll/2)*sin(yaw/2)*sin(yaw/2);

}
void angle()  //姿态矩阵
{
float DX,DX1,DX2,DX3,DY,DY1,DY2,DY3,DZ,DZ1,DZ2,DZ3;
float model,h0,h1,h2,h3;  //h表示增量四元数
float q0,q1,q2,q3;          //q表示更新前的四元数
float model_d,d0,d1,d2,d3;   //d表示更新后的四元数
float T11,T12,T13,T21,T22,T23,T31,T32,T33;

//三子样采样优化 D表示角增量
DX=DX1+DX2+DX3+(9/20)*(DY1*DZ3+DZ1*DY3)+(27/40)*(DY2*(DZ3-DZ1)+DX2*(DX3-DX1));

DY=DY1+DY2+DY3+(9/20)*(DY1*DY3+DX1*DZ3)+(27/40)*(DZ2*(DX3-DX1)+DY2*(DY3-DY1));

DZ=DZ1+DZ2+DZ3+(9/20)*(DZ1*DZ3+DY1*DX3)+(27/40)*(DX2*(DY3-DY1)+DY2*(DZ3-DZ1));

//计算增量四元数h
model=sqrt(DX*DX+DY*DY+DZ*DZ);
if(model==0)
{
  h0=1;  
  h1=0;
  h2=0;
  h3=0;
}
else
{
  h0=cos(model/2);
  h1=(DX/model)*sin(model/2);
  h2=(DY/model)*sin(model/2);   
  h3=(DZ/model)*sin(model/2);   
}

//四元数更新
d0=q0*h0-q1*h1-q2*h2-q3*h3;
///////////////////////////
d1=q1*h0+q0*h1-q3*h2+q2*h3;      
d2=q2*h0+q3*h1+q0*h2-q1*h3;   
d3=q3*h0-q2*h1+q1*h2+q0*h3;
//进行规范化
model_d=sqrt(d0*d0+d1*d1+d2*d2+d3*d3);
d0=d0/model_d;
d1=d1/model_d;
d2=d2/model_d;
d3=d3/model_d;
//将更新和规范化之后的四元数d赋给q,以便下一次的更新
q0=d0;
q1=d1;
q2=d2;
q3=d3;

//将四元数转化成方向余弦矩阵
T11=q0*q0+q1*q1-q2*q2-q3*q3;
T12=2*(q1*q2-q0*q3);
T13=2*(q1*q3+q0*q2);

T21=2*(q1*q2+q0*q3);
T22=q0*q0-q1*q1+q2*q2-q3*q3;
T23=2*(q2*q3-q0*q1);

T31=2*(q1*q3-q0*q2);
T32=2*(q2*q3+q0*q1);
T33=q0*q0-q1*q1-q2*q2+q3*q3;

//提取姿态角
pitch=asin(T32);
if(T22==0&&T12>0)
yaw=pi/2;
if(T22==0&&T12<0)
yaw=-pi/2;
if(T22>0&&T12>0)
yaw=atan(-T31/T33);
if(T22>0&&T12<0)
yaw=atan(-T31/T33);
if(T22<0&&T12>0)
yaw=atan(-T31/T33)+2*pi;
if(T22<0&&T12<0)
yaw=atan(-T31/T33)-2*pi;
}

出0入0汤圆

发表于 2011-11-26 14:47:14 | 显示全部楼层
回复【7楼】asha
我宁愿被封,程序不传。
-----------------------------------------------------------------------

估计楼主可能不是封ID那么简单的……

出0入0汤圆

发表于 2011-11-26 15:27:36 | 显示全部楼层
回复【5楼】oldbreadman
asha是个好人,也是个技术高手。封了不知道到底谁损失了。
-----------------------------------------------------------------------

我不觉得有损失,很讨厌这些自私的人,该封

出0入0汤圆

发表于 2011-11-26 19:15:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-26 22:18:06 | 显示全部楼层
又不是啥困難的東西。滿好笑的...

出0入0汤圆

发表于 2011-11-26 22:26:52 | 显示全部楼层
怎么解算的是pitch角和yaw角?roll呢

出0入0汤圆

发表于 2011-11-27 00:51:41 | 显示全部楼层
回复【15楼】nnnkey  
怎么解算的是pitch角和yaw角?roll呢
-----------------------------------------------------------------------

看我的回复的5imx的帖子

出0入0汤圆

发表于 2011-11-28 16:30:44 | 显示全部楼层
回复【10楼】majianjia  阿嘉^_^
其实四元数就是旋转矢量法的单子样形式,多子样旋转矢量法比四元数计算更精确(这里不是说传感器的误差,而是算法本身误差)
但是我觉得,mems的陀螺仪,用四元数就够了,本身误差就很大了。
我不是很懂,mems输出的是角速度,而多子样对应的应该是角增量,如果要用多子样四元数,那么还要对时间积分之后,才是角增量。如此在mems上的意义是不是真的那么大?
对于四元数看《惯性导航》里的推导过程,结合上面5imx的帖子会比较好理解。我的算法没有用多子样,我觉得不是很有必要。
网上的关于三子样四元数的帖子。
科创论坛有
http://bbs.kechuang.org/read-kc-tid-36679-page-e.html
本板块老帖178楼也有
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1148130&amp;bbs_page_no=1&amp;b......
-----------------------------------------------------------------------

多子样算法要求陀螺仪输出角增量吧,而MEMS输出的是角速度,所以用龙库法就行了

出0入0汤圆

发表于 2011-11-28 16:37:09 | 显示全部楼层
majianjia 你发的科创三子样算法和这个贴子里:http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=1148130 ASHA发的程序一样

出0入0汤圆

发表于 2011-11-28 23:07:24 | 显示全部楼层
回复【18楼】skystalker  
-----------------------------------------------------------------------

是的。。呵呵。。。发了之后我才发现。。
我也觉得,MEMS上用三子样不太合适

出0入0汤圆

发表于 2011-11-29 08:38:47 | 显示全部楼层
看书搞定了,最后提取欧拉角写错了,判别条件是航向角的,公式用的是横滚角的

出0入0汤圆

发表于 2013-9-2 11:04:17 | 显示全部楼层
楼主  我的四元数融合好的  静态时测量的比较准确  可是动态时就波动很大  该怎么处理呢?

出0入0汤圆

发表于 2014-9-17 22:58:10 | 显示全部楼层
怎么看老帖啊

出0入0汤圆

发表于 2014-9-18 22:36:44 | 显示全部楼层
谢谢,,,,,,,,,,,,,,,,,,,,,,,

出0入0汤圆

发表于 2014-9-18 23:13:59 | 显示全部楼层
学习一下了

出0入0汤圆

发表于 2014-9-26 11:30:31 | 显示全部楼层
估计也没什么料

出0入0汤圆

发表于 2015-6-17 14:43:40 | 显示全部楼层
笑死,这还卖弄,初中生吧

出0入0汤圆

发表于 2015-7-21 11:46:58 | 显示全部楼层
LZ的账号好像没被封。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-29 05:51

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

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