自动驾驶中,实现三维点旋转原理

news2024/9/21 14:44:54

文章目录

      • 1. 三维点旋转的方案
      • 2. 使用复数表示二维点的旋转
        • 2.1. 复数的概念
        • 2.2. 复数的三种形式及相互转换
        • 2.3. 复数概念扩展:实数、虚数、复数
      • 3. 四元数旋转三维点原理
      • 4. 使用四元数进行旋转的公式
      • 5. 旋转叠加
      • 6. 四元数转换为三维点
      • 7. 代码实现

1. 三维点旋转的方案

三维旋转的方案,主要有:

  • 欧拉角:简单易懂,但有万向节锁问题。在三维软件的用户界面上通常都用欧拉角表示。但是软件内部的计算过程都用四元数。

  • 旋转矩阵:可以累乘,但有误差累计问题。

  • 四元数:正是因为这两种表示方式的缺陷,才造就了四元数表示法的流。

本文仅对四元数的旋转进行说明。

2. 使用复数表示二维点的旋转

2.1. 复数的概念

复数为: a + b i

复数可以表示二维点的旋转。

在这里插入图片描述

其中的圆是单位圆。

如图,就表示点或向量绕着原点旋转了θ (theta)角度。可以把图中的二维坐标(a,b)写成一个复数:

在这里插入图片描述

2.2. 复数的三种形式及相互转换
  • 代数形式

  • 三角形式

  • 指数形式

在这里插入图片描述

2.3. 复数概念扩展:实数、虚数、复数

在这里插入图片描述

3. 四元数旋转三维点原理

四元数就是四个数。它是复数的推广。

四元数则多了两个虚部: q = w + (ai + bj + ck) , 其中i,j,k都是虚数。所以:

在这里插入图片描述

四元数可以表示三维单位球面上的一个点(或者说是一个单位方向向量)的旋转:

在这里插入图片描述

这就表示绕着一个轴(a,b,c)(它是个单位向量)旋转θ (theta)角度。

在这里插入图片描述

4. 使用四元数进行旋转的公式

使用四元数进行旋转的公式如下(结果为一个新的四元数):

在这里插入图片描述

假设有四元数q : q = w + (ai + bj + ck) , 那么四元数的逆的公式为:

在这里插入图片描述

这就是实部不变,虚部加个负号而已!

以试验一下,它是否符合逆的概念,也就是:

在这里插入图片描述

注意:如果q没有归一化,那么q的逆只需要再除以模的平方:

在这里插入图片描述

5. 旋转叠加

四元数也像旋转矩阵那样能够累乘!比如先旋转q1,再旋转q2:

在这里插入图片描述

6. 四元数转换为三维点

旋转之后,怎么得到三维的点坐标呢?

我们只需要把实部抛弃(或者写成0),虚部的三个值恰好就是一个三维点的坐标。

也就是说:( 0 , x i + y j + z k )

恰好就是三维点:( x , y , z )

7. 代码实现

关于代码实现,请参考下一篇文章:《Eigen C++ 代码实现三维点的旋转》

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

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

相关文章

《昇思25天学习打卡营第19天|生成式-Pix2Pix实现图像转换》

学习内容:Pix2Pix实现图像转换 1.模型简介 Pix2Pix是基于条件生成对抗网络(cGAN, Condition Generative Adversarial Networks )实现的一种深度学习图像转换模型,该模型是由Phillip Isola等作者在2017年CVPR上提出的&#xff0c…

基于javaScript的简易ATM机

目录 一.设计要求 二.设计思路 三.案例展示 四.源代码展示 一.设计要求 首先里面已经存放了100元钱。如果用户执行存钱操作,就将输入进去的存钱数目和现有的钱相加,再显示余额提示框。如果用户执行取钱操作,就用现有的钱减去要取出钱的数目…

AutoHotKey自动热键(七)WINDOWS按键映射与鼠标映射(替换/组合)

该脚本支持简单的按键替换,可以针对某个窗口进行按键替换,还可以对鼠标和键盘进行互相替换,也可以用来禁用一些按键 键盘按键映射 普通按键映射 a::b这样子就直接在全局把所有的a键输入都映射成b键输出 上面这一行在执行过程中相当于拆解成下面两个,第一个是按下,第二个是弹…

【刷题汇总 --游游的水果大礼包、买卖股票的最好时机(二)、倒置字符串】

C日常刷题积累 今日刷题汇总 - day0111、游游的水果大礼包1.1、题目1.2、思路1.3、程序实现 2、买卖股票的最好时机(二)2.1、题目2.2、思路2.3、程序实现 3、倒置字符串3.1、题目3.2、思路3.3、程序实现 -- c语言3.4、程序实现 -- c 4、题目链接 今日刷题汇总 - day011 1、游游…

U盘打不开的终极解决方案:原因剖析、恢复策略与预防之道

U盘困境:打不开的焦虑与应对 在数字化时代,U盘作为数据交换与存储的重要工具,几乎成为了每个人工作、学习和生活中的必需品。然而,当您满怀期待地将U盘插入电脑,却遭遇“无法识别”、“无法访问”等提示,U…

安装isce2

今天再次尝试安装,之前试过2次都是卡在同一步,今天换成了用mamba conda就没有再报错了 全程参考云军老师的step by step教程,安装成功 GitHub - yunjunz/conda-envs: conda environment setup on Linux / macOS for InSAR data processing …

初识Spring Web MVC

1. 什么是 Spring Web MVC? Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"SpringMVC".Servlet&am…

宝马退出价格战,19万买不到i3了

ChatGPT狂飙160天,世界已经不是之前的样子。 更多资源欢迎关注 宝马退出价格战 这一消息,源自知名汽车博主孙少军。 7月11日他发文称,“因价格战导致门店亏损严重,宝马7月将会开始降量保价。” 第二天他又做了补充&#xff0c…

SQL,python,knime将数据混合的文字数字拆出来,合并计算实战

将下面将数据混合的文字数字拆出来,合并计算 一、SQL解决: ---创建表插入数据 CREATE TABLE original_data (id INT AUTO_INCREMENT PRIMARY KEY,city VARCHAR(255),value DECIMAL(10, 2) );INSERT INTO original_data (city, value) VALUES (上海0.5…

如何判断代码是否是在UPDATE TASK的Session中执行?

1. 背景 有时我们想控制ABAP代码在UPDATE TASK中的逻辑,例如某些逻辑执行,某些逻辑不执行。 那么,我们应该如何判断当前代码运行的环境呢?也即,怎么知道一段运行时代码是运行在当前的ABAP session中,还是…

红帽官方福利:RHCE赠送免费补考

RHCE 红帽官方活动【免费补考来了】 新班 7月27日 RHCE 周末班 学完9月底考试,享受免费补考! RHCE9.0 (点击查看课程介绍) 上课课时:72课时/12天考试辅导1-2天 开班频率:2个月开一期 最新新班&#x…

高精度定位与AI技术的深度融合——未来智慧世界的钥匙

引言在当今迅速发展的科技时代,精确定位和人工智能(AI)技术正在快速推动各领域的创新与变革。高精度定位结合AI技术所产生的融合效应,正在加速智慧城市、智能驾驶、智能物流以及许多其他领域的实现。这篇文章将详细探讨高精度定位…

栈(Stack)与队列(Queue,Deque)

前言: 栈与队列在数据结构中用法都相对比较简单,是数据结构中经常用到的两种。 1.栈(Stack) (1)特点: 先入后出,后入先出。栈的底层就是一个数组(java原生库中&#x…

uniapp发送Form Data格式请求

设置header的Content-Type为 application/x-www-form-urlencoded 即可 uni.request({url: , // 接口urldata: {input: 写一篇一千字的作文}, // 入参method: POST, // 参数类型header: {"Content-Type": "application/x-www-form-urlencoded"}, // 请求头…

本地部署,isNet 图像背景去除

目录 摘要 引言 ISNet 架构 关键组件 技术原理 本地部署 运行结果 结论 参考文献 GitHub - xuebinqin/DIS: This is the repo for our new project Highly Accurate Dichotomous Image SegmentationThis is the repo for our new project Highly Accurate Dichotomous…

介绍一款数据准实时复制(CDC)中间件 `Debezium`

简介 文章开头先介绍一下什么是CDC。数据准实时复制(CDC)是目前行内实时数据需求大量使用的技术。常用的中间件有Canal、Debezium、Flink CDC等 下面我们做一下对比 各有优缺点吧,本主要介绍一下Debezium中间件。 Debezium是什么 Debezium是一个为变更数据捕获(CDC)提供…

220.贪心算法:根据身高重建队列(力扣)

代码解决 class Solution { public:// 定义排序规则&#xff1a;首先按身高降序排序&#xff0c;如果身高相同则按k值升序排序static bool cmp(const vector<int>&a, const vector<int>&b){if (a[0] b[0]) return a[1] < b[1]; // 如果身高相同&#…

注册自定义总线

1、在/sys/bus下注册一个自定义总线 #include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h> #include<linux/kobject.h> #include<linux/slab.h> #include<linux/sysfs.h> #include<linux/device.h> #include…

【Linux】1w详解如何实现一个简单的shell

目录 实现思路 1. 交互 获取命令行 2. 子串分割 解析命令行 3. 指令的判断 内建命令 4. 普通命令的执行 补充&#xff1a;vim 文本替换 整体代码 重点思考 1.getenv和putenv是什么意思 2.代码extern char **environ; 3.内建命令是什么 4.lastcode WEXITSTATUS(sta…

Java-final关键字详解

Java-final关键字详解 一、引言 二、什么是 final 关键字&#xff1f; 三、final 变量 final 局部变量 final 实例变量 final 静态变量 四、final 方法 五、final 类 六、final 关键字的实际应用 1. 定义常量 2. 防止方法被重写 3. 创建不可变类 4. 优化性能 七、…