二维空间与三维空间的姿态表示法

news2024/11/24 4:35:47

二维空间与三维空间的姿态表示法

  • 一、2D空间姿态表示法
  • 二、3D空间姿态表示法
    • 2.1 三个数表示空间姿态
      • 问题
    • 2.2 九个数表示空间姿态
      • 问题
    • 2.3 四个数表示空间姿态
  • 结语
  • Reference

假设,你有志成为我空军某航空旅歼-20飞行员,但要想开好飞机,那就得锻炼身体,好好学习,因此,你刻苦学习专业知识,并梦想有一天,能真正演练编队飞行技术和空中作战战术,下面,未来的飞行员同志,在此之前,你需要学习以下内容。首先注意,这里是 姿态表示法,而不是 位置表示法,平面位置表示法有二维笛卡尔坐标系,空间位置表示法有三维笛卡尔坐标系,这个很容易理解。

一、2D空间姿态表示法

看完这篇《旋转与复数》,就知道为什么复数相乘,能表示平面向量的旋转了,总结:
z 1 = a 1 + b 1 i = r 1 c o s θ 1 + i r 1 s i n θ 1 = r 1 ( c o s θ 1 + i s i n θ 1 ) = r 1 e i θ 1 z_1 = a_1+b_1i \\ =r_1cos\theta_1 + ir_1sin\theta_1 \\ =r_1(cos\theta_1 + isin\theta_1) \\ = r_1e^{i\theta_1} z1=a1+b1i=r1cosθ1+ir1sinθ1=r1(cosθ1+isinθ1)=r1eiθ1
z 2 = a 2 + b 2 i = r 2 c o s θ 2 + i r 2 s i n θ 2 = r 2 ( c o s θ 2 + i s i n θ 2 ) = r 2 e i θ 2 z_2 = a_2+b_2i \\ =r_2cos\theta_2 + ir_2sin\theta_2 \\ =r_2(cos\theta_2 + isin\theta_2) \\ = r_2e^{i\theta_2} z2=a2+b2i=r2cosθ2+ir2sinθ2=r2(cosθ2+isinθ2)=r2eiθ2

z 1 ∗ z 2 = r 1 r 2 e i ( θ 1 + θ 2 ) z_1*z_2 = r_1r_2e^{i(\theta1+\theta_2)} z1z2=r1r2ei(θ1+θ2)
所以,两个复平面的向量相乘,代表的含义是:长度相乘,角度相加,即“长乘角加”,这里的角度是有正负的。根据上述公式可以看出:
z 2 z_2 z2向量的 r 2 = 1 r_2=1 r2=1,也就是说 z 2 z_2 z2是一个单位长度的向量,就只有角度相加
z 2 z_2 z2向量的 θ 2 = θ 1 \theta_2=\theta_1 θ2=θ1,也就是说 z 2 z_2 z2向量的方向和 z 1 z_1 z1一样,就只有长度相乘
所以复平面具备美妙的构造,有着非常美妙的性质,以后看到复平面的向量计算,就会更加直观了,但你并不满足只在平面国成为一名飞行员,你想在三维的世界翱翔,有了这个基础,可以开始挑战高难度。
以前对构造性质这两个词理解不深刻,后面发现实际应用中,很多数学公式就是为了满足某种性质而特意构造出来的,俗称先射箭再画靶,比如损失函数,完全没有推理可言,损失函数不是推导出来的,就是为了满足某种性质从构造出来的。

二、3D空间姿态表示法

2.1 三个数表示空间姿态

这是最自然的方式,一开始我也是这么想的,我想你一开始也会这么想,令人欣慰的是,大数学家欧拉也是这么想滴。欧拉角总共有三个角,其英文分别是pitch,yaw,roll,翻译为俯仰角,偏航角,翻滚角,动画效果展示请看《欧拉角pitch、yaw,roll的理解》,有了这个理解,就可以开始了。

问题

这种表示法真的没问题吗?有,欧拉角表示法存在万向死锁的问题,实在不理解,上淘宝搜索,太空环玩具,玩一玩就理解了。
拿下面这张图举例,就会出现死锁,保持绿色环相对位置不动,转动黄色环和转动粉色环,效果都是俯仰。归位,保持黄色和粉色环和不动,转动绿色环,效果是偏航。“莫名其妙”地少了一个方向的旋转!!!
在这里插入图片描述
【无伤理解欧拉角中的“万向死锁”现象 - bilibili】

2.2 九个数表示空间姿态

这九个数组成了一个矩阵, X ^ B \hat{X}_{B} X^B表示物体B在其自身坐标系X方向的主轴向量,第一列该向量在世界坐标系上三个方向上的投影,这里的世界坐标系就是指A所处的坐标系。

[ X ^ B ⋅ X ^ A Y ^ B ⋅ X ^ A Z ^ B ⋅ X ^ A X ^ B ⋅ Y ^ A Y ^ B ⋅ Y ^ A Z ^ B ⋅ Y ^ A X ^ B ⋅ Z ^ A Y ^ B ⋅ Z ^ A Z ^ B ⋅ Z ^ A ] \begin{bmatrix} \hat{X}_{B}·\hat{X}_{A} & \hat{Y}_{B}·\hat{X}_{A} & \hat{Z}_{B}·\hat{X}_{A} \\ \hat{X}_{B}·\hat{Y}_{A} & \hat{Y}_{B}·\hat{Y}_{A} & \hat{Z}_{B}·\hat{Y}_{A} \\ \hat{X}_{B}·\hat{Z}_{A} & \hat{Y}_{B}·\hat{Z}_{A} & \hat{Z}_{B}·\hat{Z}_{A} \end{bmatrix} X^BX^AX^BY^AX^BZ^AY^BX^AY^BY^AY^BZ^AZ^BX^AZ^BY^AZ^BZ^A
在这里插入图片描述
【【机械臂运动学教程】机械臂+旋转矩阵+变换矩阵+DH+逆解+轨迹规划+机器人+教程】—— 台湾大学

问题

但这种方式也是有问题的,会有误差累计问题

2.3 四个数表示空间姿态

3Blue1Brown是最受欢迎的数学区科普UP,可以按顺序观看他发的这两个视频:【四元数的可视化 - bilibili】【四元数和三维转动,可互动的探索式视频(请看链接)】,但后面的视频并没说为什么要右乘逆矩阵,可以看评论区用户冰月旋律的留言:“ q ∗ p ∗ q − 1 q * p * q^{-1} qpq1 得到什么? 2次同样旋转1轮抵消缩放”,及此问答 Why does rotation by a quaternion require multiplying two times?,稍后会证明并解释。

总结如下:
(1) 四元数计算规则
规则记忆方式, i → j → k → i → j . . . . . . i \rightarrow j \rightarrow k \rightarrow i \rightarrow j ...... ijkij......,两两一组计算得到下一个,若顺序相反,就要带负号。
在这里插入图片描述在这里插入图片描述这里 v 1 → ∗ v 2 → v^\rightarrow_1 * v^\rightarrow_2 v1v2是叉乘(外积)

(2) q ⋅ p q·p qp,前面的 q q q 视作一个作用于点 p p p f u n c t i o n function function ,代表对 p p p进行拉伸与旋转。
(3) 1D-3D球极投影截图:
在这里插入图片描述(4)对实部为0的一个虚四元数 p p p ,进行旋转,需要左乘 q q q 和右乘 q − 1 q^{-1} q1,即 p ′ = q p q − 1 p^{'} = qpq^{-1} p=qpq1 才是一个完整的旋转操作。
下面是证明,首先复习共轭复数(conjugate complex number), a + b i a+bi a+bi a − b i a-bi abi 是一对共轭复数,它们实部相同,虚部相反,四元数与之类似,有四元数 q q q
q = w + x i + y j + z k q = w + x\bold{i} + y\bold{j} + z\bold{k} q=w+xi+yj+zk
对应的共轭复数为
q ∗ = w − x i − y j − z k q^* = w - x\bold{i} - y\bold{j} - z\bold{k} q=wxiyjzk
易得
q q ∗ = q ∗ q = ( w 2 − w x i − w y j − w z k ) + ( w x i + x 2 − x y k + x z j ) + ( w y j + x y k + y 2 − y z i ) + ( w z k − x z j + y z i + z 2 ) = w 2 + x 2 + y 2 + z 2 qq^* = q^*q \\ = (w^2 - wx\bold{i} - wy\bold{j} - wz\bold{k}) \\ +(wx\bold{i} + x^2 - xy\bold{k} + xz\bold{j}) \\ +(wy\bold{j} + xy\bold{k} + y^2 - yz\bold{i}) \\ +(wz\bold{k} - xz\bold{j} + yz\bold{i} + z ^2) \\ = w^2 + x^2 + y^2 + z^2 qq=qq=(w2wxiwyjwzk)+(wxi+x2xyk+xzj)+(wyj+xyk+y2yzi)+(wzkxzj+yzi+z2)=w2+x2+y2+z2
用矩阵的观点来看计算会更快,对结果中的所有元素求和,得到的依旧是 w 2 + x 2 + y 2 + z 2 w^2 + x^2 + y^2 + z^2 w2+x2+y2+z2
[ w x i y j z k ] [ w , − x i , − y j , − z k ] = [ w 2 , − w x i , − w y j , − w z k w x i , x 2 , − x y k , x z j w y j , x y k , y 2 , − y z i w z k , − x z j , y z i , z 2 ] \begin{bmatrix} w \\ xi \\ yj \\ zk \end{bmatrix} \begin{bmatrix} w, -xi, -yj, -zk \end{bmatrix} = \begin{bmatrix} w^2, -wx\bold{i}, - wy\bold{j}, - wz\bold{k} \\ wx\bold{i}, x^2, - xy\bold{k}, xz\bold{j} \\ wy\bold{j}, xy\bold{k}, y^2, - yz\bold{i} \\ wz\bold{k}, - xz\bold{j}, yz\bold{i}, z ^2 \end{bmatrix} wxiyjzk [w,xi,yj,zk]= w2,wxi,wyj,wzkwxi,x2,xyk,xzjwyj,xyk,y2,yziwzk,xzj,yzi,z2

模长为
∣ ∣ q ∣ ∣ = w 2 + x 2 + y 2 + z 2 ||q|| = \sqrt{w^2 + x^2 + y^2 + z^2} ∣∣q∣∣=w2+x2+y2+z2
且有
∣ ∣ q 1 q 2 ∣ ∣ = ∣ ∣ q 1 ∣ ∣ ⋅ ∣ ∣ q 2 ∣ ∣ ||q_1q_2|| = ||q_1||·||q_2|| ∣∣q1q2∣∣=∣∣q1∣∣∣∣q2∣∣
在矩阵中,一个矩阵的逆矩阵,定义为可以得到单位矩阵的行(列)变换矩阵
而四元数中,一个四元数的逆,定义为一个可以通过四元数乘法得到1+0i+0j+0k的四元数
也就是说
q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 q ⋅ q − 1 = q − 1 ⋅ q = 1 q^{-1} = \frac{q^*}{||q||^2} \\ q·q^{-1} = q^{-1}·q = \bold{1} q1=∣∣q2qqq1=q1q=1
现在开始解释,为什么要左乘 p p p 和右乘 p − 1 p^{-1} p1 ,首先,我们只想旋转方向,而不想伸缩长度,根据上面的公式
∣ ∣ q p q − 1 ∣ ∣ = ∣ ∣ q p ∣ ∣ ⋅ ∣ ∣ q − 1 ∣ ∣ = ∣ ∣ q ∣ ∣ ⋅ ∣ ∣ p ∣ ∣ ⋅ ∣ ∣ q ∗ ∣ ∣ ∣ ∣ q ∣ ∣ 2 = ∣ ∣ p ∣ ∣ ||qpq^{-1}|| \\ =||qp|| · ||q^{-1}||\\ =\frac{||q|| · ||p|| · ||q^*||}{||q||^2} \\ =||p|| ∣∣qpq1∣∣=∣∣qp∣∣∣∣q1∣∣=∣∣q2∣∣q∣∣∣∣p∣∣∣∣q∣∣=∣∣p∣∣
那么确认一点,这样变换不会影响旋转后的点 p ′ p^{'} p的模长,接下来要验证, p ′ p^{'} p的实部依旧为0,还是一个虚四元数,这其实都不用验证了, p p p的实部为0,0乘任何数都会为0。然后要验证的是, q p qp qp p q − 1 pq^{-1} pq1旋转的方向是相同的,其实这个也容易验证,根据之前的记忆法则 i → j → k → i → j i \rightarrow j \rightarrow k \rightarrow i \rightarrow j ijkij p q − 1 pq^{-1} pq1相当于箭头从左到右的运算变成了从右到左,这样会给结果带来负号,但是 q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 q^{-1} = \frac{q^*}{||q||^2} q1=∣∣q2q,且 q ∗ = w − x i − y j − z k q^* = w - x\bold{i} - y\bold{j} - z\bold{k} q=wxiyjzk的虚部都是负数,相当于给带上负号的结果进行了负负得正,因此 q p − 1 qp^{-1} qp1旋转的方向与 q p qp qp是相同的,这也就解释了为什么会有半角出现,转两次半角等于旋转角度完全到位,证毕。

看这个视频的时候,我感觉,三维复数已经足够表示旋转了,但作者说三维复数实际上无法定义一个有效的计算规则,这个我就不清楚了,视频还说,是哈密顿(Hamiton)发明的vector这个说法,vector之前在数学和物理中从未出现过,用来称呼只有ijk分量而没有标量部分的四元数,查阅Wiki百科发现,哈密顿还有其它贡献

He coined the neologisms “tensor” and “scalar”, and was the first to use the word “vector” in the modern sense. 他创造了“张量”和“标量”这两个新词,并且是第一个使用现代意义上的“向量”一词的人 —— William Rowan Hamilton - Wiki

我还记得我在高中数学课本上看到过四元数的内容,于是去找了找教材,只翻到了在新人教B版数学必修第四册的目录里有,内容就没找到了,所以高中数学教科书的编者早早的跑在前头等着,更令人破防的是,高中数学教科书的很多选修部分,其实涵盖了很多多大学内容,这令我感到一阵脸红,我的水平只有高中?谁道人生无再少,门前流水尚能西,修将白发唱黄鸡。《中小学电子版教材,看这12个网站就够了》- 进击的金牛的文章 - 知乎

结语

《上海交通大学学生生存手册》里有两句话,我深以为然:“我无意全盘否定同学们吃苦耐劳的精神,但这份精神充其量只能称为悲壮。我们耗费了大量的时间和精力掌握的那些考点、技巧,在真正的知识殿堂根本登不上大雅之堂。哪怕我们特征值求的再熟练,积分积得再复杂,中国的载人飞船也不会因此而顺利上天”,“学习最需要的,不是悲壮的毅力,而是对无限未知的渴求”。塔台期盼你早日单飞,平安归来。

Reference

[1] 视觉SLAM十四讲:从理论到实践(第2版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1174191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mac装不了python3.7.6

今天发现一个很奇怪的问题 但是我一换成 conda create -n DCA python3.8.12就是成功的 这个就很奇怪

数据结构——B树

文章目录 B树1. 概念2. B树插入分析3.插入过程4. B树插入实现5.B树验证6. B树性能分析7.B树&B*树8. 小结9. B树的运用MyISAMInnoDB 10. 总结 B树 可以用于查询的数据结构非常的多,比如说二插搜索树、平衡树、哈希表、位图、布隆过滤器,但如果需要存…

【MySQL】MySQL入门基础

文章目录 一、数据库基础1. 什么是数据库2. 数据库和文件3. 主流数据库(关系型数据库) 二、MySQL的基本使用1. 连接服务器2. 服务器管理3. 服务器、数据库、表关系4. 使用案例 三、数据的逻辑存储和实际存储四、MySQL的架构五、SQL分类六、存储引擎 一、…

Java基础-015-System.java常用类

Java基础-015-System.java常用类 1、标准输入输出2、获取属性3、System.java初始化4、设置标准输出System.out java/lang/System.java 1、标准输入输出 System.in、System.out public class Test {public static void main(String[] args) {String charsetName String.valueOf…

青少年python大赛知识点学习5--字典

python中的字典,与我们使用的新华字典有点像。索引与对象,新华字典存的是每个字的相关内容,python中的字典是一个容器类型的数据结构,通过key进行索引。 1.什么是字典 字典是python内置的重要数据之一,与列表一样是一…

Intel oneAPI笔记(2)--jupyter官方文档(oneAPI_Intro)学习笔记

前言 本文是对jupyterlab中oneAPI_Essentials/01_oneAPI_Intro文档的学习记录,包含对SYCL、DPC extends SYCL、oneAPI Programming models等介绍和SYCL代码的初步演示等内容 oneAPI编程模型综述 oneAPI编程模型提供了一个全面而统一的开发人员工具组合&#xff0…

Go与数据库:NoSQL数据库的应用

大家好!我是[lincyang]。 今天我们将一起探索Go语言与NoSQL数据库结合的强大能力,并通过五个实际案例来深入理解它们的应用。 1. Go与MongoDB的结合 1.1 用户管理系统 在用户管理系统中,我们需要存储用户的基本信息和权限设置。MongoDB的…

MQTT协议零基础快速入门

MQTT协议零基础快速入门 MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,广泛应用于物联网(IoT)和机器对机器(M2M)通信场景。它具有简单、开放、易于实现等优…

产品经理入门学习(五):思维导图 原型设计

参考引用 黑马-产品经理入门基础课程 1. 思维导图的作用和应用场景 什么是思维导图? 思维导图是一种将思维进行可视化的实用工具。具体实现方法是用一个关键词去引发相关想法,再运用图文并茂的技巧把各级主题的关系用相互隶属的层级表现出来,…

多态 虚函数表深度剖析 纯干货讲解(2)

💯 博客内容:多态 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准C后端工程师,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这里是CSD…

crond服务

目录 一、crond服务基础知识 1、crond服务介绍 2、查看crond服务的状态 3、crond服务配置文件详解 4、额外的配置文件目录 二、crond服务基础命令 1、crond服务使用 2、 管理和操作 crond 服务 3、crond服务命令举例 一、crond服务基础知识 1、crond服务介绍 1、crond…

【redis面试题】双写一致性

文章目录 前言一、什么是双写一致性1. 先删除缓存还是先修改数据库1.1 先删除缓存的情况1.2 先修改数据库的情况 2. 双写一致性的解决方案 二、允许延迟一致的解决方法1. 采用 MQ 中间件2. 采用 canal 中间件 三、强一致性的解决方法1. 采用 Redisson 提供的读写锁 前言 跟着B…

7-2 数论中的模幂运算

solution 欧拉函数法可以解决模幂运算 #include<stdio.h> #include<math.h> int main(){int a, m, n, r1;scanf("%d%d%d", &a, &m, &n);while(m){if(m&1) r(r*a)%n;a(a*a)%n;m>>1; }printf("%d", r);return 0; }给定伪…

AtCoder Beginner Contest 327 G. Many Good Tuple Problems(带标号二分图计数+有区别小球放入有区别盒子)

题目 一个长为n(n<30)的原始序列x&#xff0c;x[i]可以取值0或1 一个长为m(m<1e9)的点对序列(s,t)&#xff0c; s序列第i项和t的第i项&#xff0c;均可以取值[1,n]&#xff0c; 如果构造好s和t后&#xff0c;对任意都存在01序列x使得&#xff0c; 则称这个序列是合法…

基于8086家具门安全控制系统设计

**单片机设计介绍&#xff0c;基于8086家具门安全控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 8086家具门安全控制系统设计介绍 8086家具门安全控制系统是一种用于保护家具和保证室内安全的系统。该系统基于808…

类的成员函数总结

前言&#xff1a; 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的…

【java学习—十三】处理流之一:缓冲流(1)

文章目录 0. 引言1. 缓冲流2. 缓冲字节流2.1. 缓冲字节输入流2.2. 缓冲字节输出流2.3. 缓冲流实现文件的复制 3. 缓冲字符流 0. 引言 上一章节讲了&#xff1a;文件字符流和字节流&#xff08;基于硬盘&#xff09; 其中&#xff0c;用到的方法有&#xff1a;FlieInuputStream、…

JDBC简单流程

Step1&#xff1a;加载对应数据库&#xff08;比如mysql、oracle、sqlserver&#xff09;的驱动器 1、以mysql驱动器为例&#xff0c;下载好对应的jar包后&#xff0c;在项目对应目录下新建一个lib文件夹&#xff0c;将jar包复制到该文件夹中。 2、然后选中改jar包&#xff0…

链队的练习

链队的练习 相关内容&#xff1a;队列的链式存储结构&#xff08;链队&#xff09; //链队的初始化、入队、出队、取对头 #include<stdio.h> #include<malloc.h> #define OK 1 #define ERROR 0 typedef int Status; //结点结构 typedef struct QNode{ int data; …

单链表的应用(1)

移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 思路&#xff1a;&#xff08;1&#xff09;创建三个结构体指针&#xff0c;分别代表一条新链表的头newhead&#xff0c;…