frodo2975..

7

我一直在寻找类似解决方案的几天,我终于遇到了这个网站,它有一个将四元数转换为任意Euler和Tait-Bryan旋转的算法!

这是代码:

///

// Quaternion to Euler

///

enum RotSeq{zyx, zyz, zxy, zxz, yxz, yxy, yzx, yzy, xyz, xyx, xzy,xzx};

void twoaxisrot(double r11, double r12, double r21, double r31, double r32, double res[]){

res[0] = atan2( r11, r12 );

res[1] = acos ( r21 );

res[2] = atan2( r31, r32 );

}

void threeaxisrot(double r11, double r12, double r21, double r31, double r32, double res[]){

res[0] = atan2( r31, r32 );

res[1] = asin ( r21 );

res[2] = atan2( r11, r12 );

}

void quaternion2Euler(const Quaternion& q, double res[], RotSeq rotSeq)

{

switch(rotSeq){

case zyx:

threeaxisrot( 2*(q.x*q.y + q.w*q.z),

q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z,

-2*(q.x*q.z - q.w*q.y),

2*(q.y*q.z + q.w*q.x),

q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z,

res);

break;

case zyz:

twoaxisrot( 2*(q.y*q.z - q.w*q.x),

2*(q.x*q.z + q.w*q.y),

q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z,

2*(q.y*q.z + q.w*q.x),

-2*(q.x*q.z - q.w*q.y),

res);

break;

case zxy:

threeaxisrot( -2*(q.x*q.y - q.w*q.z),

q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z,

2*(q.y*q.z + q.w*q.x),

-2*(q.x*q.z - q.w*q.y),

q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z,

res);

break;

case zxz:

twoaxisrot( 2*(q.x*q.z + q.w*q.y),

-2*(q.y*q.z - q.w*q.x),

q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z,

2*(q.x*q.z - q.w*q.y),

2*(q.y*q.z + q.w*q.x),

res);

break;

case yxz:

threeaxisrot( 2*(q.x*q.z + q.w*q.y),

q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z,

-2*(q.y*q.z - q.w*q.x),

2*(q.x*q.y + q.w*q.z),

q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z,

res);

break;

case yxy:

twoaxisrot( 2*(q.x*q.y - q.w*q.z),

2*(q.y*q.z + q.w*q.x),

q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z,

2*(q.x*q.y + q.w*q.z),

-2*(q.y*q.z - q.w*q.x),

res);

break;

case yzx:

threeaxisrot( -2*(q.x*q.z - q.w*q.y),

q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z,

2*(q.x*q.y + q.w*q.z),

-2*(q.y*q.z - q.w*q.x),

q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z,

res);

break;

case yzy:

twoaxisrot( 2*(q.y*q.z + q.w*q.x),

-2*(q.x*q.y - q.w*q.z),

q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z,

2*(q.y*q.z - q.w*q.x),

2*(q.x*q.y + q.w*q.z),

res);

break;

case xyz:

threeaxisrot( -2*(q.y*q.z - q.w*q.x),

q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z,

2*(q.x*q.z + q.w*q.y),

-2*(q.x*q.y - q.w*q.z),

q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z,

res);

break;

case xyx:

twoaxisrot( 2*(q.x*q.y + q.w*q.z),

-2*(q.x*q.z - q.w*q.y),

q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z,

2*(q.x*q.y - q.w*q.z),

2*(q.x*q.z + q.w*q.y),

res);

break;

case xzy:

threeaxisrot( 2*(q.y*q.z + q.w*q.x),

q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z,

-2*(q.x*q.y - q.w*q.z),

2*(q.x*q.z + q.w*q.y),

q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z,

res);

break;

case xzx:

twoaxisrot( 2*(q.x*q.z - q.w*q.y),

2*(q.x*q.y + q.w*q.z),

q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z,

2*(q.x*q.z + q.w*q.y),

-2*(q.x*q.y - q.w*q.z),

res);

break;

default:

std::cout << "Unknown rotation sequence" << std::endl;

break;

}

}

如何将四元数方向转化为旋转举证_是否有将四元数旋转转换为欧拉角旋转的算法?...相关推荐

  1. 如何将四元数方向转化为旋转举证_旋转表示法(持续更新)

    旋转矩阵: 旋转矩阵转欧拉角 欧拉角: 欧拉角转旋转矩阵 function rot = rpy2rot(roll,pitch,yaw)Cphi = cos(roll); Sphi = sin(roll ...

  2. java 三维旋转立方体_【转】 CATransform3D 矩阵变换之立方体旋转实现细节

    原文网址:http://blog.csdn.net/ch_soft/article/details/7351896 第一部分.前几天做动画,使用到了CATransform3D ,由于没有学过计算机图形 ...

  3. iphone强制旋转屏幕_我的iPhone或iPad屏幕无法旋转。 我如何解决它?

    iphone强制旋转屏幕 Khamosh Pathak Khamosh Pathak The iPhone and the iPad screen rotates almost seamlessly ...

  4. 旋转 翻转_自组装的立方体机器人会跳、旋转、翻转和相互识别

    上图是一个模块化的立方体机器人与M-Block的其余部分拼接在一起. 麻省理工学院计算机科学和人工智能实验室开发的机器人可以自组装成各种结构,包括救灾应用. Rachel Gordon | MIT C ...

  5. 旋转函数_一招搞定高中数学函数平移旋转问题

    我们的命运,凭什么由你来决定. --蒙奇D路飞 <海贼王> 选自柴老师高中时候最爱最爱的动漫,哇,一想起来真是满满的回忆.还记得当时在学校,半个月回一次家,每次回家只能住一晚上,那天晚上就 ...

  6. java旋转太极图_如何用CSS纯代码画一个旋转的太极图(附代码)

    这是一个中国人都非常熟悉的图案--太极图,它分为阴阳两级,会旋转(用到css3 animation动画属性),此图通过css3纯代码实现,它由 若干个小圆组合而成,适合初学css3的人练练手,娱以 致 ...

  7. d3.js 旋转图形_苏教版三年级数学上册6.1平移和旋转微课视频 | 练习

    本公众号学习资源丰富! 欢迎分享到班群.朋友圈.帮助更多孩子. 微课视频第一课时 微课视频第二课时 同步练习 1.连一连. 升旗时国旗的运动                     钟摆的运动 风扇叶 ...

  8. 高精度矢量汉字的一种填充方法_惯导解算数学基础4(等效旋转矢量解,圆锥补偿解)...

    等效旋转矢量及Bortz方程 由于姿态阵和四元数的方法都有不可交换误差的问题,不可回避,所以现代高精度算法都使用等效旋转矢量来表达. 还记上次那个 角速率和等效旋转矢量的关系式吧? 为了书写整洁,改写 ...

  9. d3.js 旋转图形_苏教版三年级数学上册第六单元平移、旋转和轴对称(6.1~6.2)微课视频 | 练习...

    在小学学习中,关键点就是积累足够多的基础知识,为今后更高级的学习奠定基础.今天小学基础知识库就为大家分享苏教版三年级数学上册第六单元平移.旋转和轴对称(6.1~6.2)微课视频 | 练习,希望对老师教 ...

最新文章

  1. Python:numpy生成正态分布的平均数
  2. php中对MYSQL操作之事务控制,回滚
  3. 什么是m叉树_不懂数据库索引的底层原理?那是因为你心里没点b树
  4. fibonacci数列前20项_面试题精选:神奇的斐波那契数列
  5. linux中mfsort用法,Linux命令――sort
  6. DirectX11 初探XMVECOTRXMMATRIX
  7. python switch_从邮箱验证小项目说python字符串判断与if判断那些事儿
  8. mysql主从配置 windows_windows实现mysql主从配置
  9. ubuntu配置dns
  10. 如何成为优秀的前端工程师
  11. 人造肉真的上市了,这对养殖业会有什么影响?
  12. mitmproxy抓包 | Python篡改请求参数实战(五)
  13. routing zuul_金三银四跳槽季快到了:送上Spring cloud全家桶系列之Zuul
  14. 安装gid12.0.4linux-x64l后启动报错/liblzma.so.5: no version information available 的解决办法
  15. 内存中inode与磁盘中inode
  16. speedoffice(word)如何批量让字体大一号
  17. 【gloomyfish】数据分析之 – 离群值(Outliers) BoxPlot
  18. 企业级 zabbix 监控项目实战
  19. linux桌面版无线鼠标不能用,外设门诊:安卓电视为何不能用无线鼠标
  20. Dynamic Programming?老牛吃药

热门文章

  1. 当心Spring缓慢的事务回调
  2. JUnit 5 –条件
  3. 适用于具有Couchbase和WildFly的多容器和多主机应用程序的Docker Machine,Swarm和Compose...
  4. 开发自上而下的Web服务项目
  5. 一个罐子统治一切:Apache TomEE + Shrinkwrap == JavaEE引导
  6. Java 8星期五:Java 8的阴暗面
  7. PrimeFaces在GlassFish 3.1.2.2上推动大气
  8. Spring和JSF集成:国际化和本地化
  9. 使用SQL:2003 MERGE语句的奥术魔术
  10. 无线鼠标可以强制配对_赛睿Rival 3 Wireless游戏鼠标评测:无限全能