【自动驾驶】24.欧拉角、旋转向量、四元数、万向锁

2024-06-16 21:18

本文主要是介绍【自动驾驶】24.欧拉角、旋转向量、四元数、万向锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:https://blog.csdn.net/shenxiaolu1984/article/details/50639298
原文链接:https://blog.csdn.net/lql0716/article/details/72597719

三维空间刚体旋转有两种方式:

  • (1) 任何一个旋转可以表示为依次绕着三个旋转轴旋三个角度的组合。这三个角度称为欧拉角。
  • (2) 三维空间的任意旋转,都可以用绕三维空间的某个轴旋转过某个角度来表示。

绕坐标轴的多次旋转可以等效为绕某一轴旋转一定角度,我感觉这就是四元数最直观的几何意义了。不管是RPY还是欧拉角,都可以利用四元数来代替表达。可以参考下面这篇博文:
https://www.cnblogs.com/21207-iHome/p/6894128.html


1.欧拉角的物理意义:

任何一个旋转可以表示为依次绕着三个旋转轴旋三个角度的组合。这三个角度称为欧拉角。
三个轴可以指固定的世界坐标系轴,也可以指被旋转的物体坐标系的轴。三个旋转轴次序不同,会导致结果不同。
本文中提到的欧拉角指:绕着世界坐标系的x,y,z轴,依次旋转的结果。其取值范围如下:

在这里插入图片描述


欧拉角→旋转矩阵
单独绕一个轴旋转θ角度的旋转矩阵为:
在这里插入图片描述
如果依次绕x轴、y轴、z轴旋转,该变换的旋转矩阵为:
在这里插入图片描述
在这里插入图片描述


2.四元数的物理意义:

旋转向量

三维空间的任意旋转,都可以用绕三维空间的某个轴旋转过某个角度来表示,即所谓的Axis-Angle(轴角)表示方法。轴角,就是绕一个旋转某个角度,来表示一个旋转。

这种表示方法里,Axis(轴)可用一个三维向量(x,y,z)来表示,θ可以用一个角度值来表示。

直观来讲,一个四维向量(θ,x,y,z)就可以表示出三维空间任意的旋转。注意,这里的三维向量(x,y,z)只是用来表示axis(轴)的方向朝向,因此更紧凑的表示方式是用一个单位向量来表示方向axis(轴),而用该三维向量的长度来表示角度值θ

这样以来,可以用一个三维向量(θ∗x,θ∗y,θ∗z)就可以表示出三维空间任意的旋转,前提是其中(x,y,z)单位向量,即 x 2 + y 2 + z 2 = 1 \color{red}x^2 + y^2 + z^2 = 1 x2+y2+z2=1。这就是旋转向量(Rotation Vector)的表示方式,OpenCV里大量使用的就是这种表示方法来表示旋转(见OpenCV相机标定部分的rvec)。

四元数

前面的旋转向量中的单位向量(x,y,z)旋转θ角度后的四元数:
在这里插入图片描述
对于三维坐标的旋转,可以通过四元数乘法直接操作,与旋转矩阵操作可以等价,但是表示方式更加紧凑,计算量也可以小一些。

需要注意,单位向量(x,y,z)指的是这个向量长度为1,即 x 2 + y 2 + z 2 = 1 \color{red}x^2 + y^2 + z^2 = 1 x2+y2+z2=1,这个向量是表示的这个的位置,表述某个向量时,一般会把这个向量用单位向量表示,下面的(w1,w2,w3)就是单位向量(x,y,z),写法不一致而已。

四元数的是四元数到原点的距离。如果某个四元数(q0, q1, q2, q3)的模长为1,即满足 q 0 2 + q 1 2 + q 2 2 + q 3 2 = 1 \sqrt {q_0^2 + q_1^2 + q_2^2 + q_3^2}=1 q02+q12+q22+q32 =1。但并不是说所有四元数的模都为1。只有表示旋转的四元数的模才为1,所以上面旋转向量的模才为1。不要混淆了。
在这里插入图片描述
注意,上面的w1,w2,w3不是i,j,k, 不要搞混了。[w1,w2,w3]是通过原点的某个轴上的单位长度(长度为1)的点,即 w 1 2 + w 2 2 + w 3 2 = 1 w_1^2+ w_2^2 + w_3^2 =1 w12+w22+w32=1
[w1,w2,w3]是个三维坐标点,设为点P,则OP就是这个旋转轴,w1,w2,w3分别为距离坐标系原点O的三个方向的距离。


欧拉角的缺点:

  • 1、 欧拉角的表示方式不唯一。给定某个起始朝向和目标朝向,即使给定yaw、pitch、roll的顺序,也可以通过不同的yaw/pitch/roll的角度组合来表示所需的旋转。这其实主要是由于万向锁(Gimbal Lock)引起的;
  • 2、欧拉角的插值比较难;
  • 3、计算旋转变换时,一般需要转换成旋转矩阵,这时候需要计算很多sin, cos,计算量较大;

对于三维坐标的旋转,可以通过四元数乘法直接操作,与旋转矩阵操作可以等价,但是表示方式更加紧凑,计算量也可以小一些。


万向锁

请参考原文:https://zhuanlan.zhihu.com/p/74040465

为了更好的理解这个现象,我们再用自己的手机做一个试验:

  • 把手机屏幕朝上,手机的长边为X轴,短边为Y轴,Z轴垂直屏幕向下。
  • 你先绕Z轴旋转一下手机,假设旋转30度;
  • 然后再把手机绕Y轴旋转90度,也就是把手机短边接触桌面,长边竖立起来;
  • 这时候你再绕手机的长边(X轴)旋转,你会发现手机的短边一直定在桌面上不可能脱离桌面,这就是万向锁现象。

下面这个说法,是从方向自由度来说明的:
需要注意的是XYZ轴的定义动态跟从手机的方向,例如Z轴永远是手机屏幕所示方向。
Z->Y->X的顺序来旋转手机,不过规定Y旋转的角度为90°。
这样做的时候你会发现无论你怎样选择Z和X的旋转角度,手机的短边都无法离开桌面。这意味着什么呢?这意味着虽然你看似有X、Z旋转的2向自由度,但是当Y被定为90的时候,这个系统实际上只有一向自由度,因为任何两向自由度的旋转一定可以使任一直线离开任一平面,而我们绕Z轴和x轴随便转却并不能将手机的短边移开桌面。

下面这个说法,是从绕X、Z轴分别旋转不同角度却能达到同样效果来说明:
首先旋转顺序就是Z-Y-X,绕完Y轴旋转后,只能绕X轴旋转了,不能再绕Z轴旋转了;
举例:

  • 转法1:你先绕Z正方向旋转30°,再绕Y正方向旋转90°,最后绕X轴旋转30°,见下图左;
  • 转法2:你先绕Z正方向旋转20°,再绕Y正方向旋转90°,最后绕X轴旋转40°,见下图右;
    实线是最开始没旋转的,虚线矩形是绕Z轴旋转后的,绕y轴旋转后的由于是竖直方向的,所以没画出来,箭头指向的那个虚线是绕X轴旋转的角度。下面两幅图最终都达到了同样的效果,角度都为60°。
    在这里插入图片描述

你会发现两种转法的结果是一样的,所以说先绕Z旋转的度数和最后绕X的旋转度数,没啥区别了。最终的结果就是,你绕X轴旋转的角度,也可以通过旋转Z轴来达到同样;或者,你绕Z轴旋转的角度,也可以通过旋转X轴来达到同样效果。

数学解释:

一般情况下都是绕X轴旋转的是pitch俯仰角,绕Y轴旋转的是yaw偏航角,绕Z轴旋转的是roll翻滚角。

最后,再让我们用数据公式来解释一下万向锁现象产生的原因,我们来回顾一下旋转矩阵:
在这里插入图片描述
这说明你改变φ和ψ的值都是一个效果,而矩阵的第一行和最后一列始终是保持不变,这说明无论你怎么改变φ和ψ,你的旋转轴一直是Z轴不变,要想改变φ和ψ有不同的效果,你只能是去改变θ的值,以上就是用数学方法来解释为什么俯仰角在±90°时欧拉角出现万向锁的过程。

这篇关于【自动驾驶】24.欧拉角、旋转向量、四元数、万向锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067571

相关文章

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp