首页 > 其他分享 >【ROS2机器人入门到实战】姿态的不同表示

【ROS2机器人入门到实战】姿态的不同表示

时间:2023-10-31 10:33:19浏览次数:38  
标签:入门 机器人 矩阵 旋转 四元 姿态 坐标系 ROS2 欧拉角


3.姿态的不同表示

写在前面

  1. 当前平台文章汇总地址:ROS2机器人从入门到实战
  2. 获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取
  3. 教程配套机器人开发平台:两驱版| 四驱版
  4. 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn

大家好,我是小鱼,本节课,我们来学习姿态的多种表示方式。在前面的课程中,我们一共接触了三种姿态的表示方式:

  1. 旋转矩阵-在位姿描述一节中
  2. 坐标轴旋转-绕xyz轴旋转不同的角度(欧拉角)
  3. 四元数-ROS2的TF2中的姿态描述

本节小鱼将对以上的三种姿态描述进行归类与介绍,并对他们之间的转换方法进行讲解,下一节小鱼带你一起通过代码直观的观察和操作姿态变换。

小鱼将常用的坐标描述分为三类,共五种。这五种也是小鱼在平时工作中所接触到的几乎所有姿态描述方法,三类共五种方法如下:

  • 旋转矩阵-旋转矩阵
  • 坐标轴旋转-固定轴欧拉角,非固定轴欧拉角
  • 任意轴旋转-等效轴角,四元数

常用的坐标转换包括:

  • 固定角四元数互转
  • 固定角旋转矩阵互转
  • 四元数旋转矩阵互转

1.旋转矩阵

关于旋转矩阵我们在前几节教程中已经介绍了,旋转矩阵采用的是旋转后的坐标系三个轴分别与原坐标系三个轴的夹角余弦值共九个数字组成的3*3矩阵。

旋转矩阵一般记作【ROS2机器人入门到实战】姿态的不同表示_坐标轴

若两个坐标系姿态相同,其旋转矩阵为单位矩阵。

1.1 旋转矩阵的描述

【ROS2机器人入门到实战】姿态的不同表示_旋转矩阵_02

如图,描述坐标系{P}参考坐标系{A}之间的姿态关系的旋转矩阵用符号【ROS2机器人入门到实战】姿态的不同表示_姿态_03来表示。

【ROS2机器人入门到实战】姿态的不同表示_姿态_04

两个向量的点乘=两个向量的长度(1)与它们夹角余弦的积,所以【ROS2机器人入门到实战】姿态的不同表示_姿态_05可以表示为向量【ROS2机器人入门到实战】姿态的不同表示_姿态_06【ROS2机器人入门到实战】姿态的不同表示_机器人_07的点积,旋转矩阵就可以写为下面的形式

【ROS2机器人入门到实战】姿态的不同表示_机器人_08

1.2 绕某一轴旋转【ROS2机器人入门到实战】姿态的不同表示_姿态_09角的旋转矩阵

新的坐标系原坐标系某一坐标轴旋转任意角度得到的旋转矩阵有如下等式。

绕x轴旋转【ROS2机器人入门到实战】姿态的不同表示_姿态_09后姿态矩阵

【ROS2机器人入门到实战】姿态的不同表示_姿态_11

绕y轴旋转【ROS2机器人入门到实战】姿态的不同表示_姿态_09后姿态矩阵

【ROS2机器人入门到实战】姿态的不同表示_姿态_13

绕z轴旋转【ROS2机器人入门到实战】姿态的不同表示_姿态_09后姿态矩阵

【ROS2机器人入门到实战】姿态的不同表示_姿态_15

2.欧拉角-绕坐标轴的旋转

2.1 12种旋转顺序

旋转矩阵是一个冗余的(九个值之间存在约束关系),可以只需要三个参数来表示的矩阵。聪明的鱼粉肯定会想到,假如知道坐标系绕分别绕X、Y、Z轴的旋转角度,不就同样可以表示旋转了吗?

这个猜想是对的,结合1.2中绕三个轴旋转的三个【ROS2机器人入门到实战】姿态的不同表示_姿态_09,按照特定的顺序将对应的旋转矩阵乘起来就可以确定一个旋转矩阵。

但需要注意的是,矩阵的乘法不具备交换性,所以旋转顺序不同会造成不同的结果。

比方说若是先绕自身【ROS2机器人入门到实战】姿态的不同表示_机器人_17轴旋转【ROS2机器人入门到实战】姿态的不同表示_机器人_18,再绕自身【ROS2机器人入门到实战】姿态的不同表示_机器人_19轴旋转【ROS2机器人入门到实战】姿态的不同表示_旋转矩阵_20

【ROS2机器人入门到实战】姿态的不同表示_姿态_21

比方说若是,先绕自身【ROS2机器人入门到实战】姿态的不同表示_机器人_19轴旋转【ROS2机器人入门到实战】姿态的不同表示_旋转矩阵_20,绕自身【ROS2机器人入门到实战】姿态的不同表示_机器人_17轴旋转【ROS2机器人入门到实战】姿态的不同表示_机器人_18

【ROS2机器人入门到实战】姿态的不同表示_机器人_26

所以我们对旋转顺序做排列组合,可以得到12种旋转顺序:

  • xyz,xyx, xzy
  • xzx,yzx, yzy
  • yxz, yxy , zxy
  • zxz, zyx, zyz

2.2 两种参考坐标系

除了要考虑旋转时所绕轴的顺序,还要考虑参考坐标系(坐标轴)的不同。

2.2.1 参考固定的坐标系

【ROS2机器人入门到实战】姿态的不同表示_四元数_27

假设坐标系B与坐标系A初始姿态相同

  • 坐标系{B}绕坐标系A的x轴Ax旋转【ROS2机器人入门到实战】姿态的不同表示_姿态_28
  • 接着坐标系{B}绕着A的y轴Ay旋转【ROS2机器人入门到实战】姿态的不同表示_机器人_29
  • 接着绕Az旋转【ROS2机器人入门到实战】姿态的不同表示_旋转矩阵_30

上述三次旋转,都是以A坐标系的xyz轴为参考坐标系进行旋转,该旋转方式为固定旋转轴的旋转,通常称之为固定角欧拉角或固定轴旋转。

2.2.2 参考自身坐标系

【ROS2机器人入门到实战】姿态的不同表示_坐标轴_31

我们也可以不沿着坐标系A的各轴旋转,而是绕旋转之后B的某一轴再次旋转,我们称之为非固定旋转轴的欧拉角。

小鱼说:无论是参考自身坐标系还是参考固定的坐标系,都有12种旋转方式,所以欧拉角有12*2=24种旋转方式,后面的计算中我们也将直观的感受到24种旋转方式的不同。

2.3 固定转轴欧拉角 转 旋转矩阵

首先我们来考虑绕固定的坐标系旋转如何转换成旋转矩阵

我们以XYZ的旋转顺序来举例说明,其他旋转顺序类似

现在假设A、B两个坐标系重合,B坐标系绕A坐标系的X轴旋转45度,绕A的Z轴旋转90度.

求旋转之后A为参考坐标系,B坐标系的姿态【ROS2机器人入门到实战】姿态的不同表示_姿态_32

小鱼先告诉你最终的结果:
【ROS2机器人入门到实战】姿态的不同表示_机器人_33

为什么结果是将绕Z轴的旋转矩阵乘绕X轴的旋转矩阵呢?

这里引用林沛群老师的解释:

我们可以假设一个向量v固定在B坐标系上,那我们让B坐标系绕着A坐标系的三个轴做旋转,就可以认为是让向量v绕着坐标系A的三个轴做旋转,那先转的肯定先乘,所以我们先让向量v乘上Rx(45),再让其乘上Rz(90),即:
【ROS2机器人入门到实战】姿态的不同表示_姿态_34
根据矩阵乘法的结合律,括号可以去掉:
【ROS2机器人入门到实战】姿态的不同表示_机器人_35

所以我们可以得到,绕固定轴XYZ旋转的欧拉角转旋转矩阵方法:

【ROS2机器人入门到实战】姿态的不同表示_机器人_36

最终结果:

【ROS2机器人入门到实战】姿态的不同表示_四元数_37

根据旋转顺序不同,固定角有12种旋转方式,这里我们给出了绕固定轴以XYZ顺序旋转欧拉角的转旋转矩阵的等式,其他旋转顺序对应的旋转矩阵可以尝试自行推导。

2.2 非固定旋转轴的欧拉角

非固定旋转轴,即每次旋转是绕着自身的坐标轴进行旋转,其旋转动图如2.2.2节所示。

非固定旋转的欧拉角转旋转矩阵推导也很简单,我们以旋转顺序ZYX为例子分析

2.2.1 ZYX

因为每次旋转都是绕着自身进行的,我们可以将每次的旋转进行拆解

【ROS2机器人入门到实战】姿态的不同表示_四元数_38

等式右边的三次旋转按照顺序Z-Y-X进行的,所以最终B坐标系在A坐标系下的姿态为:

【ROS2机器人入门到实战】姿态的不同表示_旋转矩阵_39

最终结果太难敲,小鱼直接截图啦

【ROS2机器人入门到实战】姿态的不同表示_四元数_40

旋转矩阵转欧拉角的方法需要使用双参变量的反正切函数,我们后面在程序当中直接调用对应函数即可实现,这里对原理就不再进行推导了

3.轴角

在介绍四元数之前,我们先来说说等效角度轴线,这种表示姿态的方式。

上一节欧拉角中无论是绕着自身的某个轴旋转,还是绕着固定的坐标系的某个轴进行旋转,旋转时参考的轴都是坐标系的主轴

假如我们参考的轴不是主轴,那么任何姿态都可以通过选择适当的轴和角度得到,换句话说,两个坐标系之间的任何姿态都可以通过绕某一个特定的轴(矢量)旋转特定的角度得到。

说到这里相信你已经理解了轴角的意义,接着我们给出轴角和旋转矩阵之间的转换关系

轴角转旋转矩阵

假设坐标系B和参考坐标系A重合,将B绕着A坐标系下的矢量【ROS2机器人入门到实战】姿态的不同表示_姿态_41按右手定则旋转【ROS2机器人入门到实战】姿态的不同表示_姿态_09角度,旋转之后B坐标系在A坐标系下的姿态可以用
【ROS2机器人入门到实战】姿态的不同表示_姿态_43
表示,注意矢量K为单位矢量(模长为1),K为一个3*1的矢量
【ROS2机器人入门到实战】姿态的不同表示_旋转矩阵_44

在已知矢量K和【ROS2机器人入门到实战】姿态的不同表示_姿态_09的情况下,我们如何得到旋转矩阵呢?

有等式:

【ROS2机器人入门到实战】姿态的不同表示_坐标轴_46

其中

【ROS2机器人入门到实战】姿态的不同表示_姿态_47

【ROS2机器人入门到实战】姿态的不同表示_姿态_09的符号由右手定则确定,右手大拇指指向矢量K的方向.

旋转矩阵转轴角需要根据情况讨论,该部分转换我们直接调用相应函数实现,这里对其原理不再叙述,感兴趣的同学可以参考:https://en.wikipedia.org/wiki/Rotation_matrix#Axis_of_a_rotation

4.四元数

除了轴角可以使用一个数字表示角度,三个数字表示旋转轴,一共四个数字表示旋转外。还有另外一种四个数字表示表示旋转的方式——四元数。

四元数的四个数字由一个实部和三个虚部组成,是一个超复数形式

【ROS2机器人入门到实战】姿态的不同表示_姿态_49

关于四元数的由来有个小故事,小鱼分享一下:

1843年10月16日的傍晚,英国数学家哈密顿和他的妻子一起步行去都柏林,途中经过布鲁哈姆桥时,他的脚步突然放慢了。妻子以为他要尽情欣赏周围的景色,于是也放慢了脚步。其实哈密顿此时正在思考他久久不能解决的问题。早在1828年,他就想发明一种新的代数,用来描述绕空间一定轴转动并同时进行伸缩的向量的运动。他设想这种新代数应包含四个分量:两个来固定转动轴,一个来规定转动角度,第四个来规定向量的伸缩。但是在构造新代数的过程中,由于他受传统观念的影响,不肯放弃乘法交换律,故屡受挫折。哈密顿盲目地相信,普通代数最重要的规律必定继续存在于他寻找的代数中。然而此刻,他的脑际突然产生了一个闪念:在所寻找的代数中,能否让交换律不成立呢?比方说,A×B不等于B×A而是等于负的B×A。这个想法太大胆了,他感到非常激动。哈密顿马上掏出笔记本,把他的思想火花记录下来。这一火花就是I,J,K之间的基本方程,即四元数乘法基本公式。哈密顿因此把1843年10月16日称为四元数的生日。此后,哈密顿一生的最后22年几乎完全致力于四元数的研究,成果发表在他去世后出版的《四元数基础》一书中。四元数的出现,推倒了传统代数的关卡,故有数学史上里程碑的美誉。后人为了纪念这一发明,特意在当年哈密顿刻划过的石头上镶嵌了一块水泥板,上面清楚地记载着1843年曾经发生的故事。

四元数在机器人中使用的非常多,甚至在量子力学中都有使用,关于四元数旋转的本质,小鱼也学习了很久才搞清楚,B站上3B1B的视频非常经典,大家自行食用。

在机器人学当中用到的四元数都是单位四元数(四维单位超球体在三维空间的投影),下文中提到的四元数默认指单位四元数

接着我们来说说四元数常用的转换

四元数转旋转矩阵

【ROS2机器人入门到实战】姿态的不同表示_机器人_50

旋转矩阵转四元数

【ROS2机器人入门到实战】姿态的不同表示_四元数_51

四元数转欧拉角

【ROS2机器人入门到实战】姿态的不同表示_旋转矩阵_52

欧拉角转四元数

【ROS2机器人入门到实战】姿态的不同表示_旋转矩阵_53

轴角转四元数

轴:【ROS2机器人入门到实战】姿态的不同表示_旋转矩阵_54 角:【ROS2机器人入门到实战】姿态的不同表示_姿态_09
【ROS2机器人入门到实战】姿态的不同表示_四元数_56

小计算: 【ROS2机器人入门到实战】姿态的不同表示_旋转矩阵_57


标签:入门,机器人,矩阵,旋转,四元,姿态,坐标系,ROS2,欧拉角
From: https://blog.51cto.com/u_15473553/8102200

相关文章

  • 【ROS2机器人入门到实战】MiniConda与Jupyter介绍安装
    2.MiniConda与Jupyter介绍安装写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn大家好,我是小鱼,上一节我们介绍了机器人学的基......
  • 【ROS2机器人入门到实战】矩阵运算实战
    3.矩阵运算实战写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn上一节我们安装好了MiniConda和Jupyter,本节课我们继续回到学......
  • TypeScript入门到精通——泛型
    泛型 泛型程序设计是一种编程风格或编程范式,它允许在程序中定义形式类型参数,然后在泛型实例化时使用实际类型参数来替换形式类型参数。通过泛型,我们能够定义通用的数据结构或类型,这些数据结构或类型仅在它们操作的实际类型上有差别。泛型程序设计是实现可重用组件的一种手段。......
  • ​飞行模拟机使用入门—X-Plane使用介绍
    偶然的机会深刻体会了飞行程序规划与模拟机中的路径之间经常存在的显著差异,于是开始考虑深入了解一下飞行模拟机。搜索之后,发现当下主流的模拟游戏X-Plane、FlightGear等,一定程度上已经具备了飞行模拟机所需的基础功能,高仿真的界面、高仿真的操作流程,可更新的数据库,支持多......
  • 二、UI入门
    1.QWidget类QWidget类是Qt所有图形用户界面(组件)的基类,因此QWidget类内部规定了所有最基础的UI相关功能。例如以下成员:●width:constint宽度(单位:像素,后文同)Qt中的getter和setter属性都在Accessfunctions下面●height:constint高度//修改宽高可以使用此函数//参数......
  • 硬件测试快速入门你必须了解的知识!
    硬件测试工程师这个职位越来越吃香,相对纯技术开发而言,要求不是那么高,但又需要一定技术含量。对于想从事技术领域,技术又不是那么自信的可以选择测试岗位,在测试中积累经验,晋升做技术开发,算是一个不错的过渡职位,对于想要从事技术领域的女生来说,也非常适合。测试工具的选择主要有以下......
  • python 飞书 获取飞书租户访问令牌 自定义机器人 向webhook_url发送POST请求
    importjsonimportrequestswebhook_url=post_data=#见应用凭证#获取飞书租户访问令牌,用于调用飞书开放平台的其他API接口#url:飞书开放平台的获取租户访问令牌的API接口地址url=r"https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/"r=......
  • 数据集成实现以及平台安装部署入门
    ETLCloud是什么?ETLCloud提供了一套工具和服务,用于将数据从不同的来源抽取(Extract)、转换(Transform)和加载(Load)到目标系统中。ETL代表了这个过程的三个主要步骤。抽取(Extract):从不同的数据源中获取数据,可以是关系型数据库、文件、Web服务或其他数据存储系统。ETLCloud提供了各种连接器......
  • mysql优化入门
    查看慢sqlSelect*frominformation_schema.processlist;Show[full]processlist;不加full只能显示前100字符 通过慢日志Slowquerylog记录时间超过long_query_time的SQLlog_slow_admin_statements记录ALTERTABLE,ANALYZETABLE,CHECKTABLE,CREATEINDEX,DROPINDE......
  • TypeScript入门到精通——TypeScript类型系统基础——类
    类 JavaScript是一门面向对象的编程语言,它允许通过对象来建模和解决实际问题。同时,JavaScript也支持基于原型链的对象继承机制。虽然大多数的面向对象编程语言都支持类,但是JavaScript语言在很长一段时间都没有支持它。在JavaScript程序中,需要使用函数来实现类的功能。 ......