四元数和旋转轴及旋转角度之间的转换理解实例

2024-03-19 23:58

本文主要是介绍四元数和旋转轴及旋转角度之间的转换理解实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

主观心得:
    四元数与旋转轴是一一对应的关系。除了相差一个标量倍数外( 标量倍数,是指这么一个意思:对于任何数或者向量a,a与k*a(k是一个实数)本质上是相等的。如a= [1 2 3],b= [2 4 6]或者b=[0.1 0.2 0.3])都是相等的。
    四元数的定义:q = [w,x,y,z]其中w是实部,当然也有资料会把四元数写成q = [x,y,z,w]其中w是实部。这都是正确的。注意:q^2 = 1.

    四元数的基本数学方程为 : q = cos (a/2) + i(x * sin(a/2)) + j(y * sin(a/2)) + k(z * sin(a/2)) 其中a表示旋转角度,(x,y,z)表示旋转轴。

    说明:三维空间坐标系下,物体的旋转通常都会涉及到两个坐标系,一个是世界坐标系,一个是物体坐标系。
    常识告诉我们,对于一个物体点A,物体A点在世界坐标系下和物体坐标系下,有两个坐标,X_local=[x_local,y_local,z_local],X_body=[x_body,y_body,z_body],物体点A在物体坐标系下的坐标是不会发生改变的,但在世界坐标系下的坐标会随着整个物体坐标系发生改变而改变。举个不贴切的例子,假定以自己做为物体坐标系,地球做为世界坐标系,其中眼睛做为物体点A,物体点A在物体坐标系下的坐标是不会发生改变的。但是物体点A在世界坐标系下是不会发生改变的(我们经常去不同的地方嘛)。不知道你懂没有,反正我的表述能力差不多就这样了。

下面是如何把具体的四元数与旋转轴和旋转角度对应起来。
    1.指出旋转轴和旋转角度,如何转化为四元素。
    假定旋转轴是:RAxis = Z轴,换算成三维空间单位向量就是RAxis = [0 0 1],旋转60度
    那么转化成四元数就是
    q.w=cos((60/2)*pi/180) =  0.866
    q.x=RAix.x*sin((60/2)*pi/180) = 0*0.5=0
    q.y=RAix.y*sin((60/2)*pi/180) =  0*0.5=0
    q.z=RAix.z*sin((60/2)*pi/180) = 1*0.5=0.5
    例子验证:从三维空间中看,假定物体点A=[0 1 0],绕 RAxis = Z轴,旋转30度(假定顺时针为正,因为matlab就是顺时针为正,而下面的quat2dcm函数是matlab自带的)
那么物体点A旋转后在世界坐标系下的坐标将是B=[0.866 0.5 0],
      如何用四元数计算出呢?思路是这样的:任何一个四元数对应着一个旋转3*3矩阵。
M=quat2dcm(q)*A'=[0.866;0.5;0],关于quat2dcm在软件matlab里面有。
    2.指出四元数,怎么知道旋转轴和旋转角度呢。
       假定q=[0.866,0,0,0.5](其实这个是上面的反例子而已)
       q.w=cos((a/2)*pi/180) =  0.866
       q.x=RAix.x*sin((a/2)*pi/180) = 0
      q.y=RAix.y*sin((a/2)*pi/180) = 0
      q.z=RAix.z*sin((a/2)*pi/180) = 0.5
从上面可以得到:RAix.x=RAix.y=0
由cos((a/2)*pi/180) =  0.866,得到
a = 60或120
由RAix.z*sin((a/2)*pi/180) = 0.5,得到
a = 60或150
          因此a = 60度(四元数的旋转角度一般是在0-360之间,之后就是多一圈的问题。
          于是可得RAix.z = 1,因此其他q=[0.866,0,0,0.5]意味着旋转轴是RAxis =[0 0 1],旋转角度是60度,其他的类似可以计算

这篇关于四元数和旋转轴及旋转角度之间的转换理解实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827636

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc