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

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进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab