浅析机器人学位姿之单位四元数,一文彻底了解四元数,干货
moboyou 2025-04-22 00:49 26 浏览
对于机器人姿态的转换前面一直介绍欧拉角的方式,其实对于三维坐标的转换四元数法和欧拉角用得都比较多,在内部算法里四元数法占比例更大,欧拉角多用于原理讲解!
四元数是一个复数,下面就一步一步讲解下复数怎么和坐标系旋转勾搭上的!
四元数顾名思义对于旋转的变换只需要四个参数,而欧拉角的旋转矩阵则是3*3的矩阵,有9个元素,所以四元数法用来优化程序,好处显而易见!
在网上查了一些资料,对于四元数的讲解基本上没有让我满意的,可能是我水平不够或者思路跟不上!所以我打算自己总结一篇浅显易懂有不漏知识点的四元数浅析文章!
四元数是一个标量加一个向量,标量一个数,向量三个数!
首先四元数是一个复数,什么是复数?应该初中还是高中的数学肯定是学过的,估计大部分人都还给老师了!
复数
1、概述一下复数
任意一个复数z都可以表示为z=a+bi 的形式.我们将a称之为这个复数的实部,b称之为这个复数的虚部。 其中i的平方等于-1!怪不怪!我理解的复数的发明就是为了让它的虚部也能参与运算,因为数学里有的地方会出现i平方等于-1的情况,如果没发明复数,那么就无法完成计算!
复数的模长|z|;
它的共(轭)是z1=a-bi;
z*z1=a*a+b*b也就是模长的平方;
加减乘除法则和正常运算一样,如z1=a+bi,z2=c+di;z1+z2=a+b+bi+di; z1*z2=ac+adi+bci+bdi^2;
复数参与运算主要靠上面这几个关系互相转换,算到最后可以把虚数算没了,就像个中间变量一样;兔死狗烹,鸟尽弓藏!
2、复数怎么和旋转矩阵勾搭上的?
推导
首先写z1=a+bi,z2=c+di两个复数;
z1*z2=ac+adi+bci+bdi^2
由于i平方等于-1;进而化简:
z1*z2=ac-bd+adi+bci;
再化简:
z1*z2=ac-bd+(ad+bc)*i;
写成矩阵形式
右侧的矩阵c d;就是用向量的形式表示z2;为啥呢?因为复数可以图像化表示,复数z=a+bi可以用如下图表示:
既然右侧的列矩阵c d 表示z2,那么复数z1就是左侧的二维矩阵表示的!进而可以推断出z2的二维矩阵形式;
最终得出,z1*z2就是两个二维矩阵相乘,如下图公式:
上面的式子里面i不见了,我们就是当i=1;或者让矩阵乘以一个二维矩阵,但是结果不变,那么这个矩阵就是如下形式,得出i的二维矩阵形式,后面会用到这个i矩阵:
以上这些公式就可以和旋转矩阵眉目传情有点关系了;下面继续推导,把复数z1的矩阵形式再变换一下,就彻底勾搭上了,如下:
配合下面这个图看一下,就知道为啥彻底勾搭上了:
这不就是三角函数吗!
那么上面的公式就可以写成三角函数的形式了,加上求模的公式,再加上上面得出的i二维矩阵,最终可以把公式写成如下形式:
右边的矩阵就是二维里面的旋转矩阵了;
左边的其实就是缩放矩阵;
验证
实验一下我们将一个点坐标 (1,0),旋转θ角度,带入上面这个公式,最终得到如下;
就是对点(1,0)逆时针旋转了θ角度,然后再缩放|z|倍;同理代入点(1,0)也是一样的原理,如下图显示两个点的旋转图;
如果复数的模为1,那么就只剩旋转矩阵了!
总结一下:
如果(模)等于1,复数z可以写成如下矩阵形式:
写成复数形式就是:
Z=cosθ+sinθ*i;
对比下 :
Z=a+b*i;
如此,复数和旋转矩阵的关系大家应该知晓了!
数学真好玩,把两个不相关的东西硬是紧密的勾搭到了一起,佩服!
单位四元数(模为1)
概述
四元数的定义和复数非常类似,唯一的区别就是四元数一共有三个虚部,而复数只有一个。
四元数q写成如下形式:
q=s+v1i+v2j+v3k;
根据复数的定义:i平方=j平方=k平方=ijk=-1;
使用的时候把虚部和实部分开,写成:
q=s+v;
标准里我们把四元数表示为:
q=s<v1,v2,v3>;
应用
单位四元数的复数形式怎么和3D旋转扯上关系,推理方法和上面复数推理2D旋转矩阵一样,就不详细讲了,下面我们直接使用它,用matlab写程序案例,直接到应用层次!
直接调用函数UnitQuaternion,下面的0.1、0.2、0.3表示绕x绕y绕z旋转;
>> q = UnitQuaternion( rpy2tr(0.1, 0.2, 0.3) )
q =
0.98335 < 0.034271, 0.10602, 0.14357 >
用q.R可以输出旋转矩阵:
>> q.R
ans =
0.7536 -0.4993 0.4275
0.5555 0.8315 -0.0081
-0.3514 0.2436 0.9040
输出图形如下:
>> q.plot()
以上就是四元数的简单介绍,第一部分主要让大家搞懂四元数怎么能表示旋转的,第二部分就是简单的应用了,可以看出应用非常简单,如果实际写应用程序,四元数法会简单明了,节省时间,也可以让程序更流畅!
各位朋友感觉有用的话多谢关注我!我会持续给大家输出工控领域的经验和容易理解的知识点!
- 上一篇:IIR数字滤波器原理及实现方法
- 下一篇:基于帧间高频能量和相关性的烟雾检测算法研究
相关推荐
- NodeJs(一)我对NodeJs的认知
-
欢迎来到我的NodeJs专题系列,更多精彩内容持续更新中,敬请关注!写在前面前面我已经分享了100+篇前端相关的技术文章,都是自己平时工作中遇到的一些问题的问题,还有是我平时自学的内容。但是那些前端文...
- 「Django框架」-Django初识
-
Django介绍Django是一个由Python编写的Web应用框架。它源自一个在线新闻Web站点。Django作为一个从新闻系统生成环境中诞生的框架,是直接面向企业级开发的。Django是一个全功能...
- 什么是PHP?APP开发可以选择PHP编程语言吗?
-
在开发一款APP的过程当中,一支专业的APP开发团队需要UI设计师、前端开发人员、后端开发人员以及测试等等。而熟练掌握PHP编程语言的人才就相当于APP开发团队中的后端开发人员。一般在APP开发中后端...
- php可以做前端吗
-
php可以做前端吗?php不可以做前端,因为php是在服务器端执行的脚本语言,也就是后端语言,主要适用于Web后端开发领域。php简介:PHP(全称:PHP:HypertextPreprocesso...
- PHP多久能学会?比java,python难还是简单呢?
-
PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及PHP自创的语法。利于学习...
- java哪有这细糠啊,PHP是世界上最好的语言!
-
要不说我们要多了解一下其他技术呢,java哪有这好玩应啊。今天分享个php开发的辅助工具:phpenv(当然,php是世界上最好的语言,毋庸置疑)phpenv就是一个开发者工具箱神器,只有拥有了他,你...
- Java和Php的对比
-
(1)开发速度Java是一种面向对象和结构化的语言,开发速度较慢,比如代码更多,耗费较多时间。而PHP是一种解释型语言,开发速度快,代码量少,耗费的时间较少。(2)安全性Java基于字节码形式进行...
- php宝塔搭建实战多端壁纸小程序源码一(wordpress后台安装篇)
-
大家好啊,我是测评君,欢迎来到web测评。本期给大家带来一套php开发的多端壁纸类型的小程序源码,后台是使用wordpress集成的,前端是使用uniapp开发的。今天先给大家分享后台怎么在宝塔里部署...
- PHP中的IMAP扩展简单入门
-
对于邮件处理来说,大家比较熟悉的应该是POP3、SMTP这类的协议,而今天我们介绍的IMAP其实也是非常常用的一种邮件处理协议。它和POP3比较类似,都是以接收处理邮件为主。不过相对于...
- 【推荐】一款免费、全能型的数据库管理神器,效率提升利器
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍HeidiSQL是一款免费的数据库管理工具,适用于与数据库打交道的开发人员和数据库管理员。它支持多种数据...
- Php+Vue.js实现的项目管理系统
-
一个基于Vue.js实现的项目管理系统目前已实现的主要功能项目管理任务管理账号管理文件管理团队管理权限管理多组织管理技术栈PHPVueMySQLRedis相关界面前端源码地址:https://git...
- 让PHP和Node.js同框共舞:解密php-node的革命性玩法!
-
你有没有想过,PHP和Node.js有朝一日能在一个进程里握手言和?不是“后端服务调用后端服务”,也不是“前端请求后端接口”,而是——直接共享内存、互传变量、同步执行逻辑。听起来像是幻想,但今天...
- 8个增强PHP程序安全的函数
-
安全是编程非常重要的一个方面。在任何一种编程语言中,都提供了许多的函数或者模块来确保程序的安全性。在现代网站应用中,经常要获取来自世界各地用户的输入,但是,我们都知道“永远不能相信那些用户输入的数据”...
- Peachpie —— .NET 的 PHP 编译器
-
Peachpie是一款.NET平台的PHP编译器,主要特性:物联网:可以使用PHP开发WindowsIoT设备应用,至少节省30%的开发支出安全:可以在最安全的平台上运行PH...
- PHP的垃圾回收机制-PHP高级面试题+详解
-
ps:本篇内容包括精选面试题与知识篇。PHP面试题关于PHP的垃圾回收机制,PHP的垃圾回收机制引用计数(referencecounting)GC机制,PHP可以自动进行内存管理,清除不需要的...
- 一周热门
- 最近发表
- 标签列表
-
- curseforge官网网址 (16)
- 外键约束 oracle (36)
- oracle的row number (32)
- 唯一索引 oracle (34)
- oracle in 表变量 (28)
- oracle导出dmp导出 (28)
- oracle两个表 (20)
- oracle 数据库 字符集 (20)
- oracle安装补丁 (19)
- matlab化简多项式 (20)
- 多线程的创建方式 (29)
- 多线程 python (30)
- java多线程并发处理 (32)
- 宏程序代码一览表 (35)
- c++需要学多久 (25)
- c语言编程小知识大全 (17)
- css class选择器用法 (25)
- css样式引入 (30)
- html5和css3新特性 (19)
- css教程文字移动 (33)
- php简单源码 (36)
- php个人中心源码 (25)
- 网站管理平台php源码 (19)
- php小说爬取源码 (23)
- github好玩的php项目 (18)