C++求欧拉角(eigen库中暴露的一些问题)

不同顺序欧拉角转旋转矩阵对照公式

在这里插入图片描述

eigen库求欧拉角公式

分别试验eigen库自带的matrix.eulerAngles()函数,与根据上述公式推导的两种方法求欧拉角
eigen库求得欧拉角的范围一定是 x − > r o l l x->roll x>roll方向在 [ 0 , π ] [0,π] [0,π]之间, y − > p i t c h y->pitch y>pitch方向在 [ − π , π ] [-π,π] [π,π]之间, z − > y a w z->yaw z>yaw方向在 [ − π , π ] [-π,π] [π,π]之间,优先会保证 x − > r o l l x->roll x>roll方向处于 [ 0 , π ] [0,π] [0,π]之间,才回去算别的角度。

以下代码验证:


#include <iostream>
#include <cmath>
#include <Eigen/Dense>Quaterniond q(0.704,-0.708,0.05,0.002)//定义一个四元数;Matrix3d m = q.toRotationMatrix();//四元数转旋转矩阵;cout << q << endl;cout << m << endl;Quaterniond q1(m);//旋转矩阵转四元数,验证下四元数是否和原来输入的四元数一致cout << q1 << endl;cout << "XYZ------------" << endl;Vector3d v=m.eulerAngles(0,1,2);//旋转矩阵转欧拉角,以XYZ为旋转方向cout << v << endl;cout << "ZYX------------" << endl;Vector3d v1=m.eulerAngles(2,1,0);//旋转矩阵转欧拉角,以ZYX为旋转方向cout << v1 << endl;Vector3d v2;

输出的结果为

-0.708i + 0.05j + 0.002k + 0.704//四元数0.994992 -0.073616  0.067568
-0.067984 -0.002536  0.997064
-0.073232 -0.996664 -0.007528//旋转矩阵
-0.70756i + 0.049969j + 0.00199876k + 0.704437//四元数
XYZ------------//先转x1.56325//x roll3.07397//y pitch
-3.06774//z yaw
ZYX------------//先转z
3.07337// z yaw
3.06825//y pitch
1.56324//x roll

可以看到以上两种旋转顺序情况下用eigen库自带的matrix.eulerAngles()函数会使得z yaw,y pitch方向上计算的欧拉角数值增大,不利于机器人做角度控制,原本机器人可能朝反方向转很小的一个角度,可能现在需要转很大一圈。

用公式推导编写的代码:

//接着上面代码段补充运行即可
double sy=sqrt(m(0,0) * m(0,0) +  m(0,1) * m(0,1));if (sy>0.00001)//判断万向锁奇异{v2(0) = std::atan2(-m(1, 2), m(2, 2));v2(1) = std::atan2(m(0, 2), sy);v2(2) = std::atan2(-m(0, 1), m(0, 0));}else//奇异{v2(0) = 0;v2(1) = std::atan2(m(0, 2), sy);v2(2) = std::atan2(-m(1, 0), m(2, 0));}
cout << "XYZ------------" << endl;
cout << v2 << endl;if (sy>0.00001)//判断万向锁奇异{v2(0) = std::atan2(m(2, 1), m(2, 2));v2(1) = std::atan2(m(2, 0), sy);v2(2) = std::atan2(-m(1, 0), m(0, 0));}else//奇异{v2(0) = std::atan2(-m(1, 2), m(1, 1));;v2(1) = std::atan2(m(2, 0), sy);v2(2) = 0;}
cout << "ZYX------------" << endl;
cout << v2 << endl;

输出结果:

XYZ-------------1.57835//x
0.0676197//y0.073852//z
ZYX-------------1.57835  //注意这里还是x,与`eigen`库自带的`matrix.eulerAngles()`出来的顺序不一样
-0.07326860.0682201//注意这里还是z

这里角度明显小很多,两种不同的方法的结果可以通过加减π得到,但是XYZ、ZYX两种不同顺序下的结果还不一样

因此建议直接用公式推导出来的方法。

参考:
https://zhuanlan.zhihu.com/p/85108850
https://blog.csdn.net/u011906844/article/details/121863578
https://blog.csdn.net/zhuoqingjoking97298/article/details/122259409
https://blog.csdn.net/WillWinston/article/details/125746107

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

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

相关文章

面试经典150题——Day22

文章目录 一、题目二、题解 一、题目 6. Zigzag Conversion The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility) P A H N A P L S I I G …

HarmonyOS 音频通话开发指导

常用的音频通话模式包括 VOIP 通话和蜂窝通话。 ● VOIP 通话&#xff1a;VOIP&#xff08;Voice over Internet Protocol&#xff09;通话是指基于互联网协议&#xff08;IP&#xff09;进行通讯的一种语音通话技术。VOIP 通话会将通话信息打包成数据包&#xff0c;通过网络进…

【算法题】割后面积最大的蛋糕

题目&#xff1a; 矩形蛋糕的高度为 h 且宽度为 w&#xff0c;给你两个整数数组 horizontalCuts 和 verticalCuts&#xff0c;其中&#xff1a; horizontalCuts[i] 是从矩形蛋糕顶部到第 i 个水平切口的距离 verticalCuts[j] 是从矩形蛋糕的左侧到第 j 个竖直切口的距离 请你…

TypeScript中的declare关键字

declare关键字 1. 简介 declare关键字用来告诉编译器&#xff0c;某个类型是存在的&#xff0c;可以在当前文件中使用。 作用&#xff1a;就是让当前文件可以使用其他文件声明的类型。比如&#xff0c;自己的脚本使用外部库定义的函数&#xff0c;编译器会因为不知道外部函数…

tinymce输入框怎么限制只输入空格或者回车时不能提交

项目场景&#xff1a; 项目相关背景&#xff1a; tinymce输入框只输入空格或者回车时提交的空数据毫无意义&#xff0c;所以需要限制一下 无意义的输入&#xff1a; 解决方案&#xff1a; 因为tinymce输入框传到后端的数据是代码形式&#xff0c;所以不能直接.trem&#…

Linux find 文件目录搜索工具

目录 前言 基本用法 查找文件通配符匹配 查找文件并打印到标准输出 查找文件并删除 根据文件大小查找 根据文件修改时间查找 查找空文件或目录 查找文件类型 前言 find是一个在Linux系统中非常强大和灵活的文件搜索工具。它用于在文件系统中查找文件和目录&#xff0…

各类统计模型R语言的详细使用教程-R语言的线性回归使用教程

各类统计模型R语言的详细使用教程-R语言的线性回归使用教程 前言R语言的线性回归代码示例回归诊断误差项正态qq图内学生化残差外学生化残差线性关系异常值的发现、处理帽子矩阵的方法DFFITS 准则Cook统计量COVRATIO准则多重共线性summaryKlein判别法特征根法条件指数法方差膨胀…

测试用例的设计方法(全):等价类划分方法

一.方法简介 1.定义 是把所有可能的输入数据,即程序的输入域划分成若干部分&#xff08;子集&#xff09;,然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。 2.划分等价类&#xff1a; 等价类是指某个输入域的…

给新手程序员的建议

专注于干净的代码、清晰的流程和有条不紊的调试。 优化开发环境和流程以消除摩擦非常重要。选择像 VSCode 这样的集成开发环境&#xff0c;并在开始项目前花时间学习其功能。以描述性的方式命名变量和函数&#xff0c;而不是使用缩写。应将表达式分解成较小的可读部分并分配给…

当数据库遇上深度学习:AI DataLoader 助力因子管理模型训练全流程

深度学习模型有能力自动发现变量之间的关系&#xff0c;而这些关系通常是不可见的&#xff0c;这使得深度学习可以挖掘新的因子和规律&#xff0c;为量化投资策略提供更多可能性。在传统的量化策略开发流程中&#xff0c;通常会使用 Python 或第三方工具生成因子&#xff0c;并…

SpringBoot整合MyBatis-Plus详解(二)

文章目录 SpringBoot整合MyBatis-Plus详解&#xff08;二&#xff09;MyBatis-Plus简介条件构造器和常用接口⭐Wrapper介绍QueryWrapper&#xff08;Mapper接口提供的&#xff09;和QueryChainWrapper&#xff08;Service接口提供的&#xff09;案例1&#xff1a;组装查询条件案…

Unity报错:Microsoft Visual C# Compiler version

Unity报错:Microsoft Visual C# Compiler version 问题解决方案总结 问题 Microsoft Visual C# Compiler version 2.9.1.65535 (9d34608e) Copyright © Microsoft Corporation 切换版本或者使用老项目的时候可能会出现这个报错&#xff0c;这个报错就是项目设置的问题 …

【HarmonyOS】元服务卡片展示动态数据,并定点更新卡片数据

【关键字】 元服务卡片、卡片展示动态数据、更新卡片数据 【写在前面】 本篇文章主要介绍开发元服务卡片时&#xff0c;如何实现卡片中动态显示数据功能&#xff0c;并实现定时数据刷新。本篇文章通过实现定时刷新卡片中日期数据为例&#xff0c;讲述展示动态数据与更新数据功…

C++前缀和算法的应用:从栈中取出 K 个硬币的最大面值和 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 一张桌子上总共有 n 个硬币 栈 。每个栈有 正整数 个带面值的硬币。 每一次操作中&#xff0c;你可以从任意一个栈的 顶部 取出 1 个硬币&#xff0c;从栈中移除…

深入探究ASEMI肖特基二极管MBR60100PT的材质

编辑-Z 在电子零件领域中&#xff0c;肖特基二极管MBR60100PT因其出色的性能和广泛的应用而显得尤为关键。理解其材质不仅有助于我们深入理解其运作原理&#xff0c;也有助于我们做出更合适的电子设计。那么&#xff0c;肖特基二极管MBR60100PT是什么材质呢? 首先&#xff0c…

前端面试基础题——12

1.什么是Vuex&#xff1f; 2.为什么浏览器不能读取 JSX&#xff1f; 3.什么是JSX&#xff1f; 4.当你调用 setState 的时候&#xff0c;发生了什么事&#xff1f; 5.React组件生命周期的阶段是什么&#xff1f; 6.React 中 refs 的作用是什么&#xff1f; 7.类组件(Class…

电厂数据可视化三维大屏展示平台加强企业安全防范

园区可视化大屏是一种新型的信息化手段&#xff0c;能够将园区内各项数据信息以图像的形式直观呈现在大屏幕上&#xff0c;便于管理员和员工进行实时监控、分析和决策。本文将从以下几个方面介绍园区可视化大屏的作用和应用。 VR数字孪生园区系统是通过将实际园区的各种数据和信…

Vue 父子组件传参、插槽

setup 函数中有两个主要的参数&#xff1a;props、context 。 props 用于接收父组件传递过来的数据&#xff0c;父传子。 context 指的是 setup 的上下文&#xff0c;它有三个属性&#xff1a;attrs、slots、emit 。 attrs 用于&#xff1a;当父组件传递过来的数据&#xff…

网络协议--BOOTP:引导程序协议

16.1 引言 在第5章我们介绍了一个无盘系统&#xff0c;它在不知道自身IP地址的情况下&#xff0c;在进行系统引导时能够通过RARP来获取它的IP地址。然而使用RARP有两个问题&#xff1a;&#xff08;1&#xff09;IP地址是返回的唯一结果&#xff1b;&#xff08;2&#xff09;…

python文件打包分发方法

python文件打包分发方法 python文件打包发布方法&#xff0c;适用于将开发的python文件进行模块化&#xff0c;并分发。可以安装在本地的python环境中。 文章目录 python文件打包分发方法前言一、文件组织二、setuptools分发操作三、注意事项 前言 我有三个python文件&#x…