欧拉角顺序与转换

2023-05-16

更多转换见:
基于eigen实现
基于python实现
这里就记录下顺序:

运算是左乘,下面方式记作Z-Y-X顺序,先绕x轴roll,再绕y轴pitch,最后绕z轴yaw,即为RPY

c++版本:

// 转欧拉角
Eigen::Quaternionf q_;
q_ = Eigen::AngleAxisf(yaw, Eigen::Vector3f::UnitZ()) * 
     Eigen::AngleAxisf(pitch, Eigen::Vector3f::UnitY()) * 
     Eigen::AngleAxisf(roll, Eigen::Vector3f::UnitX());

// 转四元数
// euler_angles存储顺序是:yaw(z) pitch(y) roll(x)
Eigen::Matrix3d rotation_matrix
Eigen::Vector3d euler_angles = rotation_matrix.eulerAngles(2, 1, 0); 

Eigen的角度范围有点问题,

// 实验室自己的代码,返回的是[roll pitch yaw], 也是ZYX顺序
void get_euler_from_R(Vector<3> &e, const Matrix<3,3> &R) {
   float phi = atan2(R(2, 1), R(2, 2)); // roll
   float theta = asin(-R(2, 0));		// pitch
   float psi = atan2(R(1, 0), R(0, 0));	// yaw
   float pi = M_PI;

   if (fabs(theta - pi/2.0f) < 1.0e-3) {
       phi = 0.0f;
       psi = atan2(R(1, 2), R(0, 2));
   } else if (fabs(theta + pi/2.0f) < 1.0e-3) {
       phi = 0.0f;
       psi = atan2(-R(1, 2), -R(0, 2));
   }
   e(0) = phi;
   e(1) = theta;
   e(2) = psi;
}

推导:假设欧拉角yaw、pitch、roll的角度为alpha, beta, gamma,则对应先roll,后ptich,最后yaw的旋转可以计算如下:
在这里插入图片描述

python版本:

import numpy as np
import math
from scipy.spatial.transform import Rotation as R

# `Z-Y-X`顺序,先绕x轴roll,再绕y轴pitch,最后绕z轴yaw
# euler_angles存储顺序是:[yaw(z) pitch(y) roll(x)]
# 转欧拉角
Rotation = R.from_quat([x,y,z,w]) # Rotation只是一个旋转,不是矩阵也不是四元数
euler_angles = Rotation.as_euler('zyx', degrees=False)
# 转四元数
Rotation = R.from_euler('zxy', [yaw, pitch, roll], degrees=False)
rotation_matrix = Rotation.as_matrix()
quaternion = Rotation.as_quat()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

欧拉角顺序与转换 的相关文章

  • ROS中常见的msg消息类型

    文章目录 1 基本数据类型1 1 三维向量Vector3 msg1 2 标头Header msg1 3 四元数Quaternion msg1 4 空间中三维点Point msg 2 传感器数据类型2 1 Imu msg 3 机器人状态数据类
  • VIO标定工具kalibr和imu_utils的使用

    0 参考资料 Kalibr进行IMU 43 相机的标定 xff1a 这个步骤写的非常好 xff0c 应该是目前看到的最符合的步骤了 使用ROS功能包标定相机内参 Kalibr标定camera IMU详细步骤 xff1a 这篇博客里给出了它的
  • ros功能包安装

    正确指令 xff1a sudo apt get install ros kinetic dwa local planner 以后安装安装包 xff0c 用sudo apt get install ros kinetic 缺少的PACKAGE
  • vins-mono编译问题--rosrun launch问题

    launch is neither a launch file in package nor is a launch file name解决办法 cd catkin ws source devel setup bash catkin ws
  • 软件工程中的框架是什么?什么是框架?

    IT领域 软件工程中所说的框架是什么 xff1f 1 1 什么是框架 xff1f 软件框架 xff08 software framework xff09 的标准定义 xff1a 通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范
  • Docker容器中远程连接实现GUI图形显示的配置方法

    1 输入xhost 43 没有问题的话会提示 access control disabled clients can connect from any host 2 使用echo DISPLAY查看本地显示器localhost 会打印结果
  • HAL库 串口收发函数解析

    一 UART Receive IT 对于CubeMX生成的代码 xff0c USART1 IRQHandler void 函数为了提高中断效率采用了回调机制 xff08 业务代码可以等中断关闭了再去处理 xff0c 这样中断处理不会占用太多
  • c++调用python

    在我们的生活中 xff0c 如果我们想调用其他程序的话 xff0c 往往会需要一些额外的代码 xff0c 比如说我们要调用 python去执行某些函数 在我们使用 python的过程中 xff0c 为了能够调用其他程序 xff0c 我们往往
  • 基于simulink的svm-dtc-adrc控制建模与仿真

    目录 一 理论基础 二 核心程序 三 仿真结论 一 理论基础 永磁电机由于没有励磁绕组和励磁装置 xff0c 不消耗励磁功率 xff0c 对磁极设在转子的电机 如一般同步电机 还可省去滑环和电刷 随着永磁材料和控制技术的发展 xff0c 永
  • 关于自制openmv的一些建议

    从接触到openmv开始一直都想制作一块自己的openmv xff0c 包括从硬件 xff0c 到烧录程序 最开始制作的版本是openmv3 xff0c 其实openmv3并不是属于自己制作 xff0c 而是下载的硬件电路城开源的openm
  • vue3创建文件报“组件名称应该总是由多个单词组成“Component name “index“ should always be multi-word

    在项目根目录下的 eslintrc js 文件中添加 vue multi word component names off 没有该文件就创建一个 module span class token punctuation span export
  • STM32和ARM的区别?

    下面先看一张图 xff1a 这张图是我在意大利与法国合资的意法半导体公司 xff08 ST xff0c 世界几大半导体公司之一 xff09 的官网上看到的 这说明 xff0c STM32是意法半导体公司的产品 意法半导体 xff08 ST
  • OrangePi 5 Docker下安装OpenWRT作软路由(同样适用于树莓派等设备)

    OrangePi5 Docker下安装OpenWRT作软路由 xff08 同样适用于树莓派等设备 xff09 说明 本文的软路由作为家中的二级路由 xff0c 用一根网线连接主路由的LAN口和二级路由的WAN口 xff08 当主路由使用配置
  • kubernetes-----k8s入门详解

    目录 docker的编排工具 k8s的介绍 k8s的特性 pod的分类 service 网络 通信 认证与存储 插件 docker的编排工具 docker的第一类编排工具 xff08 docker三剑客 xff09 docker compo
  • ROS机械臂开发:Moveit + Gazebo仿真/Gazebo配置

    一 ROS中的控制器插件 ros control的功能 xff1a ROS为开发者提供的机器人控制中间件 包含一系列控制器接口 传动装置接口 硬件接口 控制器工具箱等等 可以帮助机器人应用功能包快速落地 xff0c 提高开发效率 ros c
  • 匿名飞控openmv寻色块解读

    作者 xff1a 不会写代码的菜鸟 时间 xff1a 2019 7 26 源码 xff1a 匿名TI板飞控源码 43 openmvH4 说明 xff1a 限于本人水平有限 xff0c 并不能写的很详细 xff0c 还望各位能够补充
  • 校验和的计算方法

    实验要求 编写一个计算机程序用来计算一个文件的16位效验和 最快速的方法是用一个32位的整数来存放这个和 记住要处理进位 xff08 例如 xff0c 超过16位的那些位 xff09 xff0c 把它们加到效验和中 要求 xff1a 1 x
  • MT7621路由器芯片/处理器参数介绍

    MT7621路由器芯片包括一个880 MHz MIPS 1004Kc CPU双核 xff0c 一个5端口10 100 1000交换机 PHY和一个RGMII 嵌入式高性能cpu可以很容易地处理高级应用程序 如路由 安全和VoIP等 MT76
  • 谈谈你对事件的传递链和响应链的理解

    一 xff1a 响应者链 UIResponser包括了各种Touch message 的处理 xff0c 比如开始 xff0c 移动 xff0c 停止等等 常见的 UIResponser 有 UIView及子类 xff0c UIViCont

随机推荐

  • CMake 引入第三方库

    CMake 引入第三方库 在 CMake 中 xff0c 如何引入第三方库是一个常见的问题 在本文中 xff0c 我们将介绍 CMake 中引入第三方库的不同方法 xff0c 以及它们的优缺点 1 使用 find package 命令 在
  • u-boot的启动模式(面试常考)

    交互模式 uboot启动之后 xff0c 在倒计时减到0之前按任意键 xff0c uboot会进入到交互模式 xff0c 此时可以输入各种uboot命令 和uboot进行交互 自启动模式 uboot启动之后 xff0c 在倒计时减到0之前不
  • vins-fusion代码理解

    代码通读了一遍做些总结 xff0c 肯定有很多理解错了的地方 xff0c 清晰起见详细程序都放到引用链接里 从rosNodeTest cpp开始 main函数 ros span class token operator span span
  • vins博客的一部分1

    文章目录 imu callbackimg callback imu callback 从话题中读入各个数据的t x y z g y r xff0c 存放到acc和gry中 span class token comment 从话题读入 spa
  • vins博客的一部分2

    sync process 对两个imgBuf里的图像进行双目时间匹配 xff08 通过判断双目图像时间之差 lt 3ms xff09 xff0c 扔掉匹配不到的老帧 span class token keyword double span
  • vins博客的一部分3

    FeatureTracker trackImage 包含了 xff1a 帧间光流法 区域mask 检测特征点 左右目光流法匹配 计算像素速度 画图 跟踪上一帧的特征点 如果已经有特征点 xff0c 就直接进行LK追踪 xff0c 新的特征点
  • vins博客的一部分4

    processMeasurements 取出数据 将 featureBuf中 xff0c 最早帧的feature取出 xff1a feature 61 featureBuf front 节点的接收IMU的消息再imu callback中被放
  • vins博客的一部分5

    目录 initFirstIMUPose xff08 xff09 processIMU propagate initFirstIMUPose xff08 xff09 得到IUM的Z与重力对齐的旋转矩阵 xff1a IMU开始很大可能不是水平放
  • vins博客的一部分6

    processImage 输入是本帧的特征点 id cam id xyz uv vxvy 包含了检测关键帧 估计外部参数 初始化 状态估计 划窗等等 检测关键帧 选择margin帧 addFeatureCheckParallax 检测和上一
  • vins博客的一部分7

    目录 initFramePoseByPnP frame count Ps Rs tic ric triangulate frame count Ps Rs tic ric initFramePoseByPnP frame count Ps
  • vins博客的一部分8

    目录 optimization slideWindow optimization 优化先验残差 重投影残差 预积分残差 xff08 即要拟合的目标是 xff0c 之前边缘化后的先验值 xff0c 前后帧之间的IMU的预积分值 xff0c 每
  • 以下为WindowsNT下32位 C++程序,请计算sizeof的值

    转帖地址 xff1a http hi baidu com hikeba blog item 68ad9f10a7dd8003213f2ecf html char str 61 34 hello 34 char p1 61 str int n
  • vins博客的一部分9

    目录 IMUFactor xff08 imu约束 xff09 ProjectionTwoFrameOneCamFactor xff08 视觉约束 xff09 marginalize 边缘化约束 IMUFactor xff08 imu约束 x
  • fiesta论文翻译和代码

    论文 体素信息结构 VIS Namemean符号position体素坐标posoccupancy占用概率occESDF到最近障碍物的欧几里得距离disClosest Obstacle Coordinate最近障碍物的体素坐标cocobser
  • ROS中四元数、欧拉角、旋转矩阵等格式转换

    未完 ROS接收到odometry格式消息 xff1a nav msgs span class token operator span Odometry pos msg 具有 xff1a pos msg span class token p
  • lio-sam中雅克比推导

    lio sam做的是scan map xff0c 点变到世界系下 xff0c 优化本帧在是世界系下的位姿 xff0c 和loam有所不同 符号 xff1a 本帧特征点云 xff08 相对机体系 xff09 P s c a
  • Xavier瑞泰载板烧录系统与CUDA环境安装

    实验室瑞泰载板的Xavier刷机过程 xff0c 不可用nvidia官方刷机方法 xff0c 以下部分基本和瑞泰教程类似 xff1a 下载文件 下载前 xff0c 需要注意版本对应关系 xff0c 这里安装L4T 32 4 3 和 JetP
  • xavier nx 安装realsense

    1 安装realsense viewer git clone https github com jetsonhacks installRealSenseSDK cd installRealSenseSDK sudo installLibre
  • 【草稿】已有ubuntu,安装win10遇到的问题记录

    磁盘分区 xff1a 把 home拆分一块安装win10 xff0c 需要在临时系统中分区 xff0c 不然已经挂载的磁盘会带锁 xff0c 没法拆分卷 xff1a 使用ubuntu启动盘启动系统 xff0c try Ubuntu with
  • 欧拉角顺序与转换

    更多转换见 xff1a 基于eigen实现 基于python实现 这里就记录下顺序 xff1a 运算是左乘 xff0c 下面方式记作Z Y X顺序 xff0c 先绕x轴roll 再绕y轴pitch 最后绕z轴yaw xff0c 即为RPY