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

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

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka