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

news2025/1/12 18:07:03

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

在这里插入图片描述

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------------//先转x
 1.56325//x roll
 3.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//y
 0.073852//z
ZYX------------
  -1.57835  //注意这里还是x,与`eigen`库自带的`matrix.eulerAngles()`出来的顺序不一样
-0.0732686
 0.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.coloradmin.cn/o/1137335.html

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

相关文章

argparse模块介绍

argparse是一个Python模块&#xff1a;命令行选项、参数和子命令解析器。argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义了所需的参数&#xff0c;而 argparse 将找出如何从 sys.argv &#xff08;命令行&#xff09;中解析这些参数。argparse 模块还会自动生成…

实时数仓-Hologres介绍与架构

本文是向大家介绍Hologres是一款实时HSAP产品&#xff0c;隶属阿里自研大数据品牌MaxCompute&#xff0c;兼容 PostgreSQL 生态、支持MaxCompute数据直接查询&#xff0c;支持实时写入实时查询&#xff0c;实时离线联邦分析&#xff0c;低成本、高时效、快速构筑企业实时数据仓…

笔记本电脑识别不了刻录机,由于设备驱动程序的前一个实例仍在内存中,windows 无法加载这个硬件的设备驱动程序。 (代码 38)

目录 1 问题2 解决 1 问题 笔记本电脑识别不了刻录机&#xff0c;由于设备驱动程序的前一个实例仍在内存中&#xff0c;windows 无法加载这个硬件的设备驱动程序。 (代码 38) 笔记本电脑插入刻录机&#xff0c;一直识别不了&#xff1b; 右边点击属性 这里展示 由于设备驱动…

powerdesigner逆向mysql与pg生成er图

一、逆向mysql数据库 官网下载mysql的ODBC(开放数据库互连) 选择自己对应版本&#xff0c;我的power designer是32位的&#xff0c;需要选择32的ODBC进行下载&#xff0c;不然power designer会监测不到。 双击exe文件&#xff0c;安装ODBC 这个比较简单&#xff0c;就不阐述了…

nu1l-死亡ping命令攻略

book-nu1l docker 虚拟化技术 把传统的虚拟机堪称容器 依赖镜像启动容器&#xff0c;镜像可以理解为模板克隆的虚拟机&#xff0c;删除容器&#xff0c;对镜像没有影响 镜像在云端 本地要使用某个镜像&#xff0c;根据地址&#xff0c;直接从云端拉取 基本命令 # 查看系统…

day14_集合

今日内容 零、 复习昨日 一、集合框架体系 二、Collection 三、泛型 四、迭代 五、List(ArrayList、LinkedList) 零、 复习 throw和throws什么区别 throwthrows位置方法里面方法签名上怎么写throw 异常对象throws异常类名(多个)作用真正抛出异常对象声明抛出的异常类型 运行时…

【开发篇】一、处理函数:定时器与定时服务

文章目录 1、基本处理函数2、定时器和定时服务3、KeyedProcessFunction下演示定时器4、process重获取当前watermark 前面API篇完结&#xff0c;对数据的转换、聚合、窗口等&#xff0c;都是基于DataStream的&#xff0c;称DataStreamAPI&#xff0c;如图&#xff1a; 在Flink…

【Linux08-进程信号】信号的一生……

今天&#xff0c;带来Linux下进程信号的讲解。文中不足错漏之处望请斧正&#xff01; 是什么 生活中的信号 例子: 红绿灯来电铃声老妈倒数321叫我起床外卖小哥叫我下楼拿外卖 理解: 过程&#xff1a;收到信号 → 分析信号 → 产生信号对应的行为信号不一定会被立即处理&…

Flutter——最详细(Scaffold)使用教程

Scaffold简介 相当于界面的主体&#xff08;类似于安卓最外层PhoneWindow&#xff09;&#xff0c;组件的展示都必须依附于它。 使用场景&#xff1a; 每一个界面都是脚手架&#xff0c;通过它来进行架构实现&#xff0c;优美的布局效果。 属性作用appBar顶部的标题栏body显示整…

Qwt QwtPlotMarker标记类详解

1.概述 QwtPlotMarker类是Qwt绘图库中用于在图表上绘制标记的类。标记可以是垂直或水平线、直线、文本或箭头等。它可用于标记某个特定的位置、绘制参考线或注释信息。 以下是类继承关系图&#xff1a; 2.常用方法 设置标记的坐标。传入x和y坐标值&#xff0c;标记将被放置在…

红黑树--讲解以及详细实现过程

目录 红黑树理解红黑树概念红黑树性质 红黑树实现红黑树图解基础结构实现插入实现 红黑树理解 红黑树概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个…

六零导航页SQL注入漏洞复现(CVE-2023-45951)

0x01 产品简介 LyLme Spage&#xff08;六零导航页&#xff09;是中国六零&#xff08;LyLme&#xff09;开源的一个导航页面。致力于简洁高效无广告的上网导航和搜索入口&#xff0c;支持后台添加链接、自定义搜索引擎&#xff0c;沉淀最具价值链接&#xff0c;全站无商业推广…

前端(二十五)——前端实现 OCR 图文识别的详细步骤与示例代码

&#x1f601;博主&#xff1a;小猫娃来啦 &#x1f601;文章核心&#xff1a;前端实现 OCR 图文识别的详细步骤与示例代码 文章目录 简介确定使用的 OCR API创建前端界面添加图像上传功能发送识别请求和处理识别结果完善代码添加注释结论附录 简介 在现代应用程序中&#xff…

如何选择向量数据库|Weaviate Cloud v.s. Zilliz Cloud

随着以 Milvus 为代表的向量数据库在 AI 产业界越来越受欢迎&#xff0c;传统数据库和检索系统也开始在快速集成专门的向量检索插件方面展开角逐。 例如 Weaviate 推出开源向量数据库&#xff0c;凭借其易用、开发者友好、上手快速、API 文档齐全等特点脱颖而出。同样&#xff…

使用AOP切面实现日志记录功能

系列文章 1.SpringBoot整合RabbitMQ并实现消息发送与接收 2. 解析JSON格式参数 & 修改对象的key 3. VUE整合Echarts实现简单的数据可视化 4. Java中运用BigDecimal对字符串的数值进行加减乘除等操作 5. List&#xff1c;HashMap&#xff1c;String,String&#xff1e;&…

【Javascript】函数(变量作用域)

变量&#xff1a;全局变量&#xff0c;局部变量 全局变量 挂载到window对象上的 var a全局变量;console.log(a);var a全局变量;console.log(window.a);var a全局变量;在控制台里输入a也能打印a的值 局部变量 函数体内部声明的变量 var a全局变量;function test(){var b局部…

软考高级之系统架构师系列之UP、RUP、4+1视图、JAD、JRP、RAD

概述 软件工程是一个很庞杂的系统工程&#xff0c;而我们面对的软件需求也很复杂&#xff1a; 面对不同规模&#xff08;复杂度&#xff0c;模块量&#xff0c;用户量&#xff0c;开发周期等等&#xff09;的软件项目&#xff0c;人员储备不尽不同的开发团队也会采用不同的软…

数据可视化在行业解决方案中的实践应用 ——华为云Astro Canvas大屏开发研究及指南

本文主要探讨华为云Astro Canvas在数据可视化大屏开发中的应用及效果。首先阐述Astro Canvas的基本概念、功能和特性说明&#xff0c;接着集中分析展示其在教育、金融、交通行业等不同领域实际应用案例&#xff1b;之后&#xff0c;详细介绍使用该工具进行大屏图表创建的开发指…

22年下半年上午题

计算机指令集 cpu的构成 存储器 决策表 原型模型 白盒测试 活动图 构件图 半圆是需接口&#xff0c;满圆是供接口&#xff0c;上图有小错误。 故障类型 b-树 排序算法复杂度 二分查找平均比较次数 成功查找比较平均次数 失败查找平均比较次数 如有 OSI 模型层次对应典型机器…

Vue+ElementUI项目打包部署到Ubuntu服务器中

1、修改config/index.js中的assetsPublicPath: /,修改为assetsPublicPath: ./ assetsPublicPath: ./2、在build/utils.js中增加publicPath: ../../ publicPath: ../../3、打开终端&#xff0c;在根目录下执行npm run build进行打包&#xff0c;打包成功后会生成dist npm run…