什么是欧拉角和四元数

涉及机器人调度工作的一些基本概念整理理解

目录

  • 什么是欧拉角和四元数 ?
  • 相关工具网站
  • 相关工具代码

什么是欧拉角和四元数 ?

这里画了一张图,简明方便理解:
在这里插入图片描述
欧拉角 (Euler Angles) 是一种描述物体在三维空间旋转姿态的方法,涉及3个旋转角度:偏航(Yaw)、俯仰(Pitch)和滚转(Roll)。

欧拉角和四元数可以相互转换,
四元数 (Quaternion) 是用于描述三维旋转的一种数学工具,具有避免万向节锁(Gimbal Lock)的问题。
四元数由一个标量部分和一个矢量部分组成,通常表示为q=w+xi+yj+zk ,其中x,y,z ,w 是实数

再次大白话理解:
假设空间上的一个点 A点(X1,Y1,Z1) 现在开始要求 它先绕着X轴旋转90度,然后再绕着Y轴旋转30度,最后绕着Z轴旋转80度
那么此时用一组向量来表示A点当前的空间位置(X2,Y2,Z2),这组向量为: (滚转角Roll=90度,俯仰角Pitch=30度,偏航角Yaw=80度)

也就是说:
Roll=90 表示A点已经围绕X轴翻转了四分之一圈
Pitch=30 表示A点已经相对于水平面抬起30度
Yaw=80 表示A点从北向顺时针转至80度处

再来看下正负角度数值表示的含义,在右手坐标系中(如上图所示):
在这里插入图片描述

  • 当Pitch 正值时绕水平轴(通常为Y轴)顺时针旋转,例如飞机起飞上升;负值则逆时针旋转,例如飞机俯冲下降

  • 当Roll 正值时绕前进方向轴(通常为X轴)顺时针旋转,例如飞机右侧机翼下降,左侧机翼上升;负值则逆时针旋转,例如飞机左侧机翼下降,右侧机翼上升

  • 当Yaw 正值时绕垂直轴(通常为Z轴)顺时针旋转,例如飞机右转向;负值则逆时针旋转,例如飞机左转向

相关工具网站

四元数和欧拉角之间转换
https://quaternions.online/
在这里插入图片描述

相关工具代码

这里记录一下,方便后面参考:


import cn.hutool.core.util.NumberUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;/*** <p>* 四元数与欧拉角转换工具类* </p>** @author admin*/
@Slf4j
public class EulerAngleQuaternionConverterUtil {/*** <p>* 四元数转为欧拉角* </p>** @param q 四元数* @return {@link double[]} 欧拉角*/public static double[] quaternionToEulerAngles(Quaternion q) {// 规范化四元数,即使它已经是一个单位四元数,也确保绝对安全double qw = q.w, qx = q.x, qy = q.y, qz = q.z;double norm = Math.sqrt(qw * qw + qx * qx + qy * qy + qz * qz);// 防止除以零if (norm > 1e-6) {qw /= norm;qx /= norm;qy /= norm;qz /= norm;}// 计算欧拉角double roll = Math.atan2(2.0 * (qw * qx + qy * qz), 1.0 - 2.0 * (qx * qx + qy * qy));double pitch = Math.asin(2.0 * (qw * qy - qz * qx));double yaw = Math.atan2(2.0 * (qw * qz + qx * qy), 1.0 - 2.0 * (qy * qy + qz * qz));return new double[]{yaw, pitch, roll};}/*** <p>* 欧拉角 Yaw (偏航角) 转为 四元数* </p>** @param yaw   Yaw (偏航角) 单位:度* @param pitch Pitch (俯仰角) 单位:度* @param roll  Roll (翻滚角) 单位:度* @return {@link Quaternion} 四元数*/public static Quaternion yawToQuaternion(double yaw, double pitch, double roll) {// 将角度转换为弧度double cy = Math.cos(Math.toRadians(yaw) * 0.5);double sy = Math.sin(Math.toRadians(yaw) * 0.5);double cp = Math.cos(Math.toRadians(pitch) * 0.5);double sp = Math.sin(Math.toRadians(pitch) * 0.5);double cr = Math.cos(Math.toRadians(roll) * 0.5);double sr = Math.sin(Math.toRadians(roll) * 0.5);// 计算四元数的各个分量double w = cr * cp * cy + sr * sp * sy;double x = sr * cp * cy - cr * sp * sy;double y = cr * sp * cy + sr * cp * sy;double z = cr * cp * sy - sr * sp * cy;return new Quaternion(w, x, y, z);}@Data@NoArgsConstructor@AllArgsConstructorpublic static class Quaternion {private double w, x, y, z;}
}

顺便记录下在表示转向时除了角度还可能使用弧度表示转换量,弧度和角度之间的换算如下:

import java.math.BigDecimal;
import java.math.RoundingMode;/*** 角度弧度相互转换工具类** @author admin*/
public class AngleConverterUtil {/*** 将弧度值转换为度数** @param radians 弧度值* @return 对应的度数值, 保留4位小数*/public static double radiansToDegrees(double radians) {double degrees = Math.toDegrees(radians);return Double.parseDouble(String.format("%.4f", degrees));}/*** 将度数值转换为弧度值** @param degrees 度数值* @return 对应的弧度值, 保留4位小数*/public static double degreesToRadians(double degrees) {double radians = Math.toRadians(degrees);return Double.parseDouble(String.format("%.4f", radians));}
}

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

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

相关文章

关于几种卷积

1*1卷积 分组卷积&深度可分离卷积 空洞卷积、膨胀卷积 转置卷积 https://zhuanlan.zhihu.com/p/80041030 https://yinguobing.com/separable-convolution/#fn2 11的卷积可以理解为对通道进行加权&#xff0c;对于一个通道来说&#xff0c;每个像素点加权是一样的&am…

std::copy

std::copy 是 C 标准库中的一个算法&#xff0c;用于将一个序列中的元素复制到另一个位置。这个算法定义在 <algorithm> 头文件中。 --- 函数原型 std::copy 有几个不同的重载版本&#xff0c;但以下是最常用的两个&#xff1a; template <class InputIterator, c…

PyQt5实战——翻译的实现,第一次爬取微软翻译经验总结(八)

个人博客&#xff1a;苏三有春的博客 系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序…

【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!

数据集列表 帮忙采集开源数据集&#xff0c;包括YOLO格式数据集和Pascal VOC格式数据集&#xff0c;含图像原文件和标注文件&#xff0c;几百张到几千张不等&#xff0c;国内外公开数据集均可。 针对目标检测&#xff0c;YOLO系列模型训练&#xff0c;分类训练等。 部分数据…

Vue前端开发:元素动画效果之过渡动画

在Vue中&#xff0c;专门提供了一个名称为transition 的内置组件&#xff0c;来完成单个DOM元素的动画效果&#xff0c;该组件本身和它的顶层并不渲染动画效果&#xff0c;而只是将动画效果应用到被组件包裹的DOM元素上&#xff0c;代码实现的格式如下所示。 <transition&g…

【C/C++】strcmp函数的模拟实现

零.导言 之前我们学习了strcmp函数&#xff0c;不妨我们现在尝试模拟实现strcmp函数的功能。 一.实现strcmp函数的要点 strcmp函数是一种字符串函数&#xff0c;可以比较字符类型的数组&#xff0c;因此我们自定义的模拟函数需要两个char类型的指针参数&#xff1b;第一个字符…

ima.copilot:智慧因你而生

在数字化时代&#xff0c;信息的获取、处理和创作已经成为我们日常工作和学习中不可或缺的一部分。腾讯公司推出的ima.copilot&#xff08;简称ima&#xff09;正是为了满足这一需求&#xff0c;它是一款由腾讯混元大模型提供技术支持的智能工作台产品&#xff0c;旨在通过智能…

string类

1. 标准库中的string类 1.1 string类(了解) string - C Reference 在使用string类时&#xff0c;必须包含 # include头文件以及 using namespace std; 1.2 auto和范围for 1&#xff09;auto关键字 作为一个新的类型指示符来指示编译器&#xff0c;auto声明的变量必须由编…

元数据管理是如何在ETL过程中发挥作用的?

ETL&#xff08;抽取、转换和加载&#xff09;技术在现代大数据处理中起着至关重要的作用。ETL技术主要用于将不同来源、格式和结构的数据抽取到一个中心化的数据仓库&#xff0c;并进行转换和加载&#xff0c;进而提供一致、高质量的数据给数据分析和报告工具。然而&#xff0…

vscode Comment Translate 反应慢 加载中...

Comment Translate 版本&#xff1a;v2.3.3 你是不是疑惑切换了 Bing 源也无法使用还是加载中… 那么可能你切换Bing后没重启vscode 下面是切换成功后的插件日志&#xff0c;一定要重启vscode&#xff0c;只是禁用和启用插件不行的&#xff0c;另外google是没用的&#xff0c;用…

机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

如何搭建 ELK【elasticsearch+logstash+kibana】日志分析系统

一、为什么需要日志分析系统&#xff1f; 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷&#xff0c;性能安全性&#xff0c;从而及时采取措…

Android智能座驾,carlink场景截屏黑屏问题

背景 项目开发过程中&#xff0c;遇到如下问题&#xff1a; 【操作步骤】 1、建立导航音乐分屏 2、连接Carlink&#xff0c;车机端打开任意Carlink应用&#xff0c;点击音乐图标回到分屏 【结果】 页面会出现1s黑屏再显示分屏的情况 详细分析 比较怀疑是截屏的方法拿到的图片就…

Go语言的常用内置函数

文章目录 一、Strings包字符串处理包定义Strings包的基本用法Strconv包中常用函数 二、Time包三、Math包math包概述使用math包 四、随机数包&#xff08;rand&#xff09; 一、Strings包 字符串处理包定义 Strings包简介&#xff1a; 一般编程语言包含的字符串处理库功能区别…

Vue实战学习(2)(Vue快速入门(快速构建一个局部Vue项目))

目录 一、Vue快速入门。 &#xff08;1&#xff09;快速入门的案例需求。 &#xff08;2&#xff09;原生js解决。 &#xff08;3&#xff09;使用Vue解决。 1、准备一个html页面。且该页面需要引入Vue模块。 2、创建Vue程序的应用实例。 3、准备html元素&#xff08;如div&…

canal1.1.7使用canal-adapter进行mysql同步数据

重要的事情说前面&#xff0c;canal1.1.8需要jdk11以上&#xff0c;大家自行选择&#xff0c;我这由于项目原因只能使用1.1.7兼容版的 文章参考地址&#xff1a; canal 使用详解_canal使用-CSDN博客 使用canal.deployer-1.1.7和canal.adapter-1.1.7实现mysql数据同步_mysql更…

羽星股份引领连锁业数智化转型,厦门羽星科技公司逆势增长剑指纳斯达克

羽星股份引领连锁业数智化转型&#xff0c;厦门羽星科技公司逆势增长剑指纳斯达克 在消费降级的大环境下&#xff0c;许多企业面临严峻挑战。在消费降级背景下&#xff0c;消费者购买力下降&#xff0c;对价格敏感度提升&#xff0c;更加注重产品的性价比和实用性。这一趋势促使…

RabbitMQ应用

1. 7种工作模式介绍 1.1 Simple(简单模式) P: ⽣产者,也就是要发送消息的程序C: 消费者,消息的接收者Queue: 消息队列(图中⻩⾊背景部分)类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从 其中取出消息 特点: ⼀个⽣产者P&#xff0c;⼀个消费者C, 消息只能被消费…

从Java中使用new 关键字创建对象开始,深度剖析对象结构与存储

文章目录 1.对象结构2.扩展补充3.小结 1.对象结构 在介绍之前.先来看一个java高频面试题&#xff0c;new String(hello") 创建了几个对象&#xff1f; 1.这里分情况讨论&#xff0c;如果hello已经在常量池中存在&#xff0c;那么就是在堆中创建1个对象&#xff0c;并返回…

ThreadLocal 的原理和使用场景

1.ThreadLocal是什么 ThreadLocal 是 Java 提供的一个用于线程存储本地变量的类。它为每个线程提供独立的变量副本&#xff0c;确保变量在多线程环境下的线程安全。每个线程访问 ThreadLocal 时&#xff0c;都会有自己专属的变量副本&#xff0c;互不干扰&#xff0c;避免了并…