不同角度范围下四元数转欧拉角的方式

前言

在标定过程中求出的欧拉角与预设真值差距太大,检查中发现求出的角度与真值角度都可以将车辆坐标系变换到相机坐标系。后通过查阅文献,发现四元数对应的欧拉角并不唯一,在不同的条件下可求出不同的欧拉角,实际应用中需根据实际设定的角度范围选择对应的欧拉角。

[1] 夏喜旺,杜涵,刘汉兵.关于大角度范围内四元数与欧拉角转换的思考[J].导弹与航天运载技术,2012,(05):47-53.

四元数与欧拉角

使用欧拉角描述空间旋转时, θ \theta θ 2 π + θ 2\pi+\theta 2π+θ可表示相同的姿态,即使在 ( − π , π ) (-\pi,\pi) (π,π)范围内,也有 ( ψ , θ , γ ) (\psi,\theta,\gamma) (ψ,θ,γ) ( ψ − s g n ( ψ ) π , s g n ( θ ) π − θ , γ − s g n ( γ ) π ) (\psi-sgn(\psi)\pi,sgn(\theta)\pi-\theta,\gamma-sgn(\gamma)\pi) (ψsgn(ψ)π,sgn(θ)πθ,γsgn(γ)π)表示相同的姿态。

四元数描述姿态

( ψ , θ , γ ) (\psi,\theta,\gamma) (ψ,θ,γ)为z-y-x旋转顺序下的欧拉角,则当前旋转对应的欧拉角为:
在这里插入图片描述
上式也可看作欧拉角到四元数的映射关系。
四元数对应的旋转矩阵为:
在这里插入图片描述上式带入四元数各项的值,可得到下式:
在这里插入图片描述

四元数转欧拉角

θ ∈ ( − π , π ) \theta\in(-\pi,\pi) θ(π,π),对应不同取值范围下四元数转欧拉角的方式如下。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

// 四元数转欧拉角
void quatToEuler(const Vec4d& quat, Vec3d& euler){double qw, qx, qy, qz, roll, pitch, yaw, rad2deg;qw = quat[0];qx = quat[1];qy = quat[2];qz = quat[3];rad2deg = 180.0 / M_PI;// [1]夏喜旺,杜涵,刘汉兵.关于大角度范围内四元数与欧拉角转换的思考[J].导弹与航天运载技术,2012,(05):47-53.// 1. pitch ∈ (-π/2,π/2)// roll = atan2(2 * (qw * qx + qy * qz), 2 * (pow(qw,2) + pow(qz,2)) - 1) * rad2deg;// pitch = asin(2 * (qw * qy - qz * qx)) * rad2deg;// yaw = atan2(2 * (qw * qz + qx * qy), 2 * (pow(qw,2) + pow(qx,2)) - 1) * rad2deg;// 2. pitch ∈ (-π,-π/2)∪(π/2,π)roll = atan2(- 2 * (qw * qx + qy * qz), 1 - 2 * (pow(qw,2) + pow(qz,2))) * rad2deg;pitch = asin(2 * (qw * qy - qz * qx)) * rad2deg;yaw = atan2(- 2 * (qw * qz + qx * qy), 1 - 2 * (pow(qw,2) + pow(qx,2))) * rad2deg;// 3. pitch = (+-2/π)// 有无穷多组欧拉角组合与四元数对应,只能确定roll+-yaw的值// 1与2情形下的欧拉角可直接转换// roll = roll - roll/abs(roll) * 180;// pitch = pitch/abs(pitch) * 180 - pitch;// yaw = yaw - yaw/abs(yaw) * 180;euler = {roll, pitch, yaw};cout << "eurler: " << euler << endl;
}

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

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

相关文章

【LeetCode】2629. 复合函数

复合函数 题目题解 题目 请你编写一个函数&#xff0c;它接收一个函数数组 [f1, f2, f3&#xff0c;…&#xff0c; fn] &#xff0c;并返回一个新的函数 fn &#xff0c;它是函数数组的 复合函数 。 [f(x)&#xff0c; g(x)&#xff0c; h(x)] 的 复合函数 为 fn(x) f(g(h(x…

提高软件代码质量的方法

提高软件代码质量是确保软件可维护性、稳定性和可扩展性的关键步骤。以下是一些建议&#xff0c;有助于提高软件代码质量&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.遵循编码规范&#xff1a; …

LangChain学习指南(二)——Retrieval

在上一章中&#xff0c;已经介绍了Langchain最最核心的module——model IO之后&#xff0c;本章继续介绍另一重要的模块Retrieval。 Retrieval这一模块在开发应用时也是至关重要的一部分&#xff0c;直接汉译过来即”检索“。该功能经常被应用于构建一个“私人的知识库”&…

网络程序设计

互相连接&#xff0c;发送信息 tcp和udp协议 tcp会有准备&#xff0c;udp不会准备。 8080端口&#xff1a;tomcat端口&#xff0c;java和web相连接 80端口&#xff1a;http 21端口&#xff1a;ftp 套接字 socket&#xff1a;提供给程序可以对外进行连接的接口 ip地址 特…

基于c++版本链队列改-Python版本链队列基础理解

##基于链表的队列实现 可以将链表的“头节点”和“尾节点”分别视为“队首”和“队尾”&#xff0c;规定队尾仅可添加节点&#xff0c;队首仅可删除节点。 ##图解 ##基于链表的队列实现代码 class ListNode:"""定义链表"""def __init__(self)…

构建工具链

系列文章目录 文章目录 系列文章目录一、GNU工具链组成二、构建工具链的过程三、准备工作1、环境变量2、Binutils 四、编译freestanding的交叉编译器1、GCC 下载 本文基于《深度探索Linux操作系统&#xff1a;系统构建和原理解析》 一、GNU工具链组成 编译过程分为4个阶段&…

Python接口自动化测试:断言封装详解!

前言 在进行API接口测试时&#xff0c;断言起着至关重要的作用。断言是用于验证预期结果与实际结果是否一致的过程。在Python中&#xff0c;我们可以利用一些库来实现断言功能。 1. 安装必要的库 在Python中&#xff0c;我们主要会使用两个库&#xff1a;requests和jsonpath…

cocos creator [Window] Cannot read property ‘dump‘ of null

写脚本的时候&#xff0c;出现了如下的问题&#xff0c; [Window] Cannot read property dump of null 原因&#xff1a;在下图中&#xff0c;方式一是正常的&#xff0c;而方式二则会爆出此错误&#xff0c;所以需要初始化&#xff0c;给它赋值

python+paddleocr 进行图像识别、找到文字在屏幕中的位置

目录 前言 1、安装paddleocr 2、安装PIL 3、安装numpy 4、 安装pyautogui 5、进行文本识别 6、识别结果 7、获取文字在图片/屏幕中的位置 8、pyautoguipaddleocr鼠标操作 9、完整代码 前言 最近在做自动化测试&#xff0c;因为是处理过的界面&#xff0c;所以使用pyw…

在KeyarchOS上体验WildFly

一、浪潮信息KeyarchOS简单介绍 KeyarchOS具备稳定可靠、高效软硬协同、全天候运维、安全可信等特性,增强了对云计算、人工智能等场景的支持,性能稳定性领先,生态完善,符合金融、政务、能源、交通、通信、教育、医疗等关键行业的应用要求。具备非常广泛的应用。 官方地址&…

C#关于文件剖析

一、概述 文件&#xff0c;具有永久存储及特定顺序的字节组成的一个有序、具有名称的集合&#xff1b; 流&#xff0c;提供一种向后备存储写入字节和从后备存储读取字节的方式&#xff1b; 读写文件和目录时可使用简单的API&#xff0c;也可使用先进的API提供更多的功能&am…

4G工业路由器智慧楼宇门禁无人值守、实时监控

门禁是我们日常生活中常见的基础设施&#xff0c;就像是现代社会智慧城市中的“门神”&#xff0c;在楼宇管理领域中普遍采用的安防卫士。4G工业路由器的物联网应用则为楼宇门禁管理带来了更加便捷和高效的解决方案。 在传统的楼宇门禁系统中&#xff0c;人员需要手动刷卡、输…

记录 | vscode设置自动换行

右上菜单栏 -> 查看 -> 打开自动换行 或者还有种方式&#xff0c;如下&#xff0c; 左下角小齿轮&#xff0c;点击设置 然后输入 Editor: Word Wrap &#xff0c;把开关打开为 on

超声波清洗机可以洗哪些东西、功能超全超声波清洗机推荐

超声波清洗机可以清洗的物品是比较多的&#xff0c;首先最经常看见的就是眼镜是交给超声波清洗机清洗的&#xff0c;说到这点&#xff0c;佩戴眼镜的朋友是一定要重视起眼镜清洗的&#xff01;眼镜长时间不清洗的话镜片以及眼镜支架缝隙中会堆积非常多细菌以及灰尘。所以一定要…

【Vue】element组件不显示问题

使用element组件但不显示 不显示的原因&#xff1a;&#xff08;未引入element-ui&#xff09; 首先在控制台输入 npm i element-ui 进行安装 安装完之后&#xff0c;再去main.js配置element-ui组件库 import ElementUI from element-ui import element-ui/lib/theme-chal…

【开源】基于Vue和SpringBoot的高校实验室管理系统

项目编号&#xff1a; S 015 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S015&#xff0c;文末获取源码。} 项目编号&#xff1a;S015&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实…

时光相册下载 时光相册停运

可以私信或加底部联系方式&#xff0c;小偿支持 很遗憾听到这个消息。时光相册是一个让用户分享和保存珍贵回忆的平台&#xff0c;但由于各种原因&#xff0c;它可能已经停止运营了。建议你尽快备份你的相册和保存重要照片和视频。同时&#xff0c;可以考虑使用其他相册服务来…

QT 中 多线程(备查)

基础 一个线程处理窗口事件&#xff0c;其他线程进行逻辑运算 在QT中使用多线程&#xff0c;需要额外注意的&#xff1a; 1&#xff09;默认的线程在Qt中称之为窗口线程&#xff0c;也叫主线程&#xff0c;负责窗口事件处理或者窗口控件数据的更新 2&#xff09;子线程负责后台…

Python插件 - 动态 简单账表 通过SQL存储过程输出列实现动态展示

第一步 新建一个简单账表加上表头标签 第二步 新建一个过滤框 第三步 修改过滤窗口标识 第四步 注册插件 python代码实现 import clr clr.AddReference("System") clr.AddReference("System.Core") clr.AddReference("Kingdee.BOS") clr.AddRe…

Python 对中文名称逐字按字母表进行排序并输出

使用场景 代码适用于需要对中文名称进行排序并规范化输出的情景&#xff0c;具体为处理一个包含中文姓名的文本文件&#xff0c;按姓名的拼音首字母进行排序&#xff0c;并以规范的格式输出。 排序规则&#xff1a; 将名称按照姓氏首字母A-Z的次序&#xff0c;进行排序&#x…