欧拉角转为旋转矩阵

外旋是固定坐标系,内旋是动态坐标系。外旋和内旋具有等价性。

固定坐标系依次绕xyz轴旋转,旋转矩阵

 动态坐标系依次绕zyx轴旋转,旋转矩阵

numpy和scipy计算对比

import numpy as np
from numpy import sin, cos, pi	# 抑制科学计数法,小数点后保留后4位
np.set_printoptions(precision=4, suppress=True)
def euler_to_rotation_matrix(roll=0, pitch=0, yaw=0):"""欧拉角转为旋转矩阵动态坐标系,内旋矩阵依次zyx旋转固定坐标系,外旋顺序依次是xyzroll, pitch, yaw,绕xyz轴旋转的弧度"""gamma, beta, alpha = roll , pitch, yawsin_gamma = sin(gamma)sin_beta = sin(beta)sin_alpha = sin(alpha)cos_gamma = cos(gamma)cos_beta = cos(beta)cos_alpha = cos(alpha)r11 = cos_alpha * cos_betar12 = cos_alpha * sin_beta * sin_gamma - sin_alpha * cos_gamma r13 = cos_alpha * sin_beta *  cos_gamma + sin_alpha * sin_gammar21 = sin_alpha * cos_betar22 = sin_alpha * sin_beta * sin_gamma + cos_alpha * cos_gammar23 = sin_alpha * sin_beta * cos_gamma - cos_alpha * sin_gammar31 = -sin_betar32 = cos_beta * sin_gammar33 = cos_beta * cos_gammamatrix =  np.array([[r11, r12, r13],[r21, r22, r23],[r31, r32, r33]])return matrixfrom scipy.spatial.transform import Rotation as R
def test1():roll = pi / 2pitch = 2 * pi / 3yaw = pi / 4print(f"roll: {roll}, pitch: {pitch}, yaw: {yaw}")print("-----------Custom method-------------")rmat = euler_to_rotation_matrix(roll, pitch, yaw)print(f"rmat: \n{rmat}")print("-----------scipy method1--------------")rot = R.from_euler('xyz', [roll, pitch, yaw], degrees=False) # xyz小写是外旋print(f"rot: \n{rot.as_matrix()}")   print( np.allclose(rmat, rot.as_matrix(), atol=1e-4) )print("-----------scipy method2--------------")rot2 = R.from_euler('ZYX', [yaw, pitch, roll], degrees=False)  # ZYX大写是内旋print(f"rot2: \n{rot2.as_matrix()}")print( np.allclose(rmat, rot2.as_matrix(), atol=1e-4) )   # Truetest1()
roll: 1.5707963267948966, pitch: 2.0943951023931953, yaw: 0.7853981633974483
-----------Custom method------------- 
rmat: 
[[-0.3536  0.6124  0.7071][-0.3536  0.6124 -0.7071][-0.866  -0.5    -0.    ]]
-----------scipy method1--------------
rot: 
[[-0.3536  0.6124  0.7071][-0.3536  0.6124 -0.7071][-0.866  -0.5    -0.    ]]
True
-----------scipy method2--------------
rot2: 
[[-0.3536  0.6124  0.7071][-0.3536  0.6124 -0.7071][-0.866  -0.5    -0.    ]]
True

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

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

相关文章

【AI学习笔记】Coze平台实现生成小红书热门多图笔记

背景前摇&原视频教程: 最近总是在小红书上刷到多图组成的养生小妙招、效率提升小tips、退休奶奶疗愈语录等等这样的图文笔记,而且人物图像一眼就是AI画的。 当时我以为这个排版和文字是人工的,就让AI保持角色一致性画了下图,…

如何选择自动化编程平台

从事自动化行业的工作者都知道,做PLC编程需要PLC编程软件,做HMI可视化需要HMI编程软件,做SCADA需要SCADA编程软件,做DCS需要DCS软件,做仿真调试需要仿真软件。这些软件有国外的、国内的,有传统自动化厂商开…

Bug 背后的隐藏剧情

Bug 背后的隐藏剧情 flyfish 1. 「bug」:70多年前那只被拍进史书的飞蛾 故事原型:1947年哈佛实验室的「昆虫命案」 1947年的计算机长啥样?像一间教室那么大,塞满了几万根继电器(类似老式开关)&#xff…

如何将通话记录从Android传输到Android

“如何将通话记录从 Android 转移到 Android?我换了一部新的 Android 手机,想要将通话记录复制到其中。”您需要将通话记录从 Android 传输到 Android 是一种常见的情况,因为通话记录是手机上最重要的数据之一。幸运的是,如果您从…

Android 云手机横屏模式下真机键盘遮挡输入框问题处理

一、背景 打开横屏应用,点击云机EditText输入框,输入框被键盘遮挡,如下图: 未打开键盘状态: 点击第二个输入框,键盘遮挡了输入框: 二、解决方案(推荐第三中方案,博主采用的也是第三种方案) 博主这里整理了三种方案:…

进程IO之 进程

一、进程相关概念 1.什么是进程 程序:静态的,编译好的可执行文件,存放在磁盘中的指令和数据的集合 进程:动态的,是程序的一次执行过程,是独立的可调度的任务 2.进程的特点 (1)对…

Condition源码解读(二)

本章我们继续将Condition的最后一个方法signal方法,如果前面没有看过的可以点击LockSupport与Condition解析来看看Condition解读的前半部分。 signal方法: public final void signal() {if (!AbstractQueuedLongSynchronizer.this.isHeldExclusively())…

股票收益率的计算

首先,需要从 Tushare.pro 注册一个账号并调用其API获取股票日线数据(具体操作请查看官网)。 以通过调用tushare获取股票000001(平安银行)的股票数据为例,这里不设置日期,那么默认获取Tushare提供的所有历史数据。也可…

《算法笔记》13.2小节——专题扩展->树状数组(BIT) 问题 D: 数列-训练套题T10T3

数列(sequence.pas/c/cpp) - 问题描述 一个简单的数列问题&#xff1a;给定一个长度为n的数列&#xff0c;求这样的三个元素ai, aj, ak的个数&#xff0c;满足ai < aj > ak&#xff0c;且i < j < k。 - 输入数据 第一行是一个整数n(n < 50000)。 第二行n个整…

C# Windows Forms应用程序-001

目录 项目概述 主要组件及功能 类定义 控件声明 构造函数 Dispose 方法 InitializeComponents 方法 控件配置详解 Button 控件 (button1) TextBox 控件 (textBox1) GroupBox 控件 (groupBox1) Label 控件 (label1 至 label5) OpenFileDialog 控件 (openFileDialog1…

2025.5.28总结

今日工作&#xff1a;最近进入了项目的关键节点&#xff0c;要求每人每天提两单&#xff0c;今天周三&#xff0c;下班前只提了一个单。下午开了一场需求服务验收会&#xff0c;我演示了自己验收的那个需求&#xff0c;然后讲的不是很好。当初再构造数据时请教了一个人&#xf…

Transformer核心技术解析LCPO方法:精准控制推理长度的新突破

原创文章1FFN前馈网络与激活函数技术解析&#xff1a;Transformer模型中的关键模块2Transformer掩码技术全解析&#xff1a;分类、原理与应用场景3【大模型技术】Attention注意力机制详解一4Transformer模型中位置编码&#xff08;Positional Embedding&#xff09;技术全解析(…

在 WSL 中安装 JetBrains Toolbox:完整指南

JetBrains Toolbox 是一个非常实用的工具&#xff0c;它可以帮助开发者轻松管理 JetBrains 的各种开发工具&#xff0c;如 IntelliJ IDEA、PyCharm、WebStorm 等。通过它&#xff0c;你可以快速安装、更新和管理这些工具&#xff0c;极大地提高了开发效率。而在 WSL 环境中安装…

ZooKeeper 命令操作

文章目录 Zookeeper 数据模型Zookeeper 服务端常用命令Zookeeper 客户端常用命令 Zookeeper 数据模型 ZooKeeper 是一个树形目录服务,其数据模型和Unix的文件系统目录树很类似&#xff0c;拥有一个层次化结构。这里面的每一个节点都被称为&#xff1a; ZNode&#xff0c;每个节…

Turf.js:前端地理空间分析的瑞士军刀

在Web开发中,地理空间数据处理已成为许多应用的核心需求。从地图可视化到位置服务,再到复杂的数据分析,前端开发者需要强大的工具来处理这些任务。Turf.js 作为一款轻量级、模块化的地理空间分析库,凭借其丰富的功能和易用性,成为前端开发者的得力助手。本文将深入探讨 Tu…

大模型微调

使用 Ollama 微调大语言模型&#xff08;如 LLaMA、Mistral、Gemma 等&#xff09;主要是围绕 LoRA&#xff08;Low-Rank Adaptation&#xff09;或者 QLoRA 等轻量级微调技术进行的。Ollama 本身是一个部署和运行本地大语言模型的平台&#xff0c;但其微调能力有限&#xff0c…

《自动驾驶轨迹规划实战:Lattice Planner实现避障路径生成(附可运行Python代码)》—— 零基础实现基于离散优化的避障路径规划

《自动驾驶轨迹规划实战&#xff1a;Lattice Planner实现避障路径生成&#xff08;附可运行Python代码&#xff09;》 —— 零基础实现基于离散优化的避障路径规划 一、为什么Lattice Planner成为自动驾驶的核心算法&#xff1f; 在自动驾驶的路径规划领域&#xff0c;Lattice…

切换到旧提交,同时保证当前修改不丢失

在 Git 中&#xff0c;可以通过以下几种方式切换到之前的提交&#xff0c;同时保留当前的提交&#xff08;即不丢失工作进度&#xff09;&#xff1a; 1. 使用 git checkout 创建临时分离头指针&#xff08;推荐用于查看&#xff09; git checkout <commit-hash>这会让…

zookeeper 操作总结

zookeeper 中的节点类型 节点类型命令选项说明‌持久节点‌无选项&#xff08;默认&#xff09;永久存在&#xff0c;除非手动删除。‌临时节点‌-e与客户端会话绑定&#xff0c;会话结束自动删除&#xff08;‌不能有子节点‌&#xff09;。‌顺序节点‌-s节点名自动追加递增…

nova14 ultra,是如何防住80°C热水和10000KPa水压冲击的?

暴雨突袭&#xff0c;手忙脚乱护住背包&#xff0c;却担心手机被雨水浸湿&#xff1b;泳池里想记录美好时刻&#xff0c;却担心手机掉入水中 &#xff1b;厨房里充满了高温水汽&#xff0c;近距离拍摄美食瞬间&#xff0c;手机屏幕花屏&#xff0c;让人失去了对美食的兴趣…… …