根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现

  • 1 旋转矩阵转换为欧拉角(Euler Angles)
  • 2 欧拉角转换为旋转矩阵

相机标定过程中,我们会得到一个3x3旋转矩阵,下面是我们把旋转矩阵欧拉角之间的相互转换:

1 旋转矩阵转换为欧拉角(Euler Angles)

1、旋转矩阵是一个3x3的矩阵,如下:

R=(r11r12r13r21r22r23r31r32r33)R=\left(\begin{array}{ccc} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{array}\right) R=⎝⎛​r11​r21​r31​​r12​r22​r32​​r13​r23​r33​​⎠⎞​

刚体旋转的旋转矩阵是由三个基本旋转矩阵复合而成的。

2、欧拉角(Euler Angles)

欧拉角来描述刚体在三维欧几里得空间取向

3、旋转矩阵转换为欧拉角的公式:

  • Z轴对应的欧拉角

θz=arctan⁡2(−r31,r11)\theta_{z}=\arctan 2\left(-r_{31}, r_{11}\right) θz​=arctan2(−r31​,r11​)

  • Y轴对应的欧拉角

θy=arctan⁡2(−r31,r312+r332)\theta_{y}=\arctan 2\left(-r_{31}, \sqrt{r_{31}{ }^{2}+r_{33}{ }^{2}}\right) θy​=arctan2(−r31​,r31​2+r33​2​)

  • X轴对应的欧拉角

θx=arctan⁡2(−r32,r33)\theta_{x}=\arctan 2\left(-r_{32}, r_{33}\right) θx​=arctan2(−r32​,r33​)

注意:

上面公式计算测的欧拉角是弧度制

上面公式的意思是,相机坐标系想要转到与世界坐标系完全平行(即xcx_cxc​平行于xwx_wxw​,ycy_cyc​平行于ywy_wyw​,zcz_czc​平行于zwz_wzw​,且他们的方向都是相同的),需要旋转3次,设原始相机坐标系C0

  • 1、C0绕其z轴旋转,得到新的坐标系C1;

  • 2、C1绕其y轴旋转,得到新的坐标系C2(注意旋转轴为C1的y轴,而非C0的y轴);

  • 3、C2绕其x轴旋转,得到新的坐标系C3。此时C3与世界坐标系W完全平行。

特别注意:旋转顺序为z y x,切记不能调换

4、python实现:旋转矩阵转换为欧拉角

import numpy as nprotate_matrix = [[-0.0174524064372832, -0.999847695156391, 0.0],[0.308969929589947, -0.00539309018185907, -0.951056516295153],[0.950911665781176, -0.0165982248672099, 0.309016994374948]]RM = np.array(rotate_matrix)# 旋转矩阵到欧拉角(弧度值)
def rotateMatrixToEulerAngles(R):theta_z = np.arctan2(RM[1, 0], RM[0, 0])theta_y = np.arctan2(-1 * RM[2, 0], np.sqrt(RM[2, 1] * RM[2, 1] + RM[2, 2] * RM[2, 2]))theta_x = np.arctan2(RM[2, 1], RM[2, 2])print(f"Euler angles:\ntheta_x: {theta_x}\ntheta_y: {theta_y}\ntheta_z: {theta_z}")return theta_x, theta_y, theta_z# 旋转矩阵到欧拉角(角度制)
def rotateMatrixToEulerAngles2(R):theta_z = np.arctan2(RM[1, 0], RM[0, 0]) / np.pi * 180theta_y = np.arctan2(-1 * RM[2, 0], np.sqrt(RM[2, 1] * RM[2, 1] + RM[2, 2] * RM[2, 2])) / np.pi * 180theta_x = np.arctan2(RM[2, 1], RM[2, 2]) / np.pi * 180print(f"Euler angles:\ntheta_x: {theta_x}\ntheta_y: {theta_y}\ntheta_z: {theta_z}")return theta_x, theta_y, theta_zif __name__ == '__main__':rotateMatrixToEulerAngles(RM)rotateMatrixToEulerAngles2(RM)

输出结果如下:

Euler angles:
theta_x: -0.05366141770874149
theta_y: -1.2561686529408898
theta_z: 1.6272221428848495
Euler angles:
theta_x: -3.0745727573994635
theta_y: -71.97316217014685
theta_z: 93.23296111753567

5、C++实现:旋转矩阵转换为欧拉角


//计算出相机坐标系的三轴旋转欧拉角,旋转后可以转出世界坐标系。
//旋转顺序为z、y、x
const double PI = 3.141592653;
double thetaz = atan2(r21, r11) / PI * 180;
double thetay = atan2(-1 * r31, sqrt(r32*r32 + r33*r33)) / PI * 180;
double thetax = atan2(r32, r33) / PI * 180;

2 欧拉角转换为旋转矩阵

欧拉角转换为旋转矩阵,就是沿XYZ三个轴进行旋转,参考旋转矩阵

1、利用上面生成的弧度值的欧拉角,再转换为旋转矩阵

# 欧拉角转换为旋转矩阵
# 输入为欧拉角为 弧度制
# euler_angles = [-0.05366141770874149, -1.2561686529408898, 1.6272221428848495]
def eulerAnglesToRotationMatrix(theta):R_x = np.array([[1, 0, 0],[0, np.cos(theta[0]), -np.sin(theta[0])],[0, np.sin(theta[0]), np.cos(theta[0])]])R_y = np.array([[np.cos(theta[1]), 0, np.sin(theta[1])],[0, 1, 0],[-np.sin(theta[1]), 0, np.cos(theta[1])]])R_z = np.array([[np.cos(theta[2]), -np.sin(theta[2]), 0],[np.sin(theta[2]), np.cos(theta[2]), 0],[0, 0, 1]])R = np.dot(R_z, np.dot(R_y, R_x))print(f"Rotate matrix:\n{R}")return Rif __name__ == '__main__':euler_angles = [-0.05366141770874149, -1.2561686529408898, 1.6272221428848495]eulerAnglesToRotationMatrix(euler_angles)

输出结果:

Rotate matrix:
[[-1.74524064e-02 -9.99847695e-01 -7.38075162e-16][ 3.08969930e-01 -5.39309018e-03 -9.51056516e-01][ 9.50911666e-01 -1.65982249e-02  3.09016994e-01]]

参考:https://www.cnblogs.com/singlex/p/RotateMatrix2Euler.html
参考:https://zhuanlan.zhihu.com/p/259999988
参考:https://blog.csdn.net/qq_15642411/article/details/83583695

根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现相关推荐

  1. 相机旋转矩阵求解三个姿态角

    http://www.cnblogs.com/singlex/p/pose_estimation_1.html https://www.cnblogs.com/singlex/p/RotateMatr ...

  2. 车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现

    目录 1 概述 2 原理 2.1 旋转矩阵 2.1.1 绕x轴旋转 2.1.2 绕y轴旋转 2.1.3 绕z轴旋转 2.2 欧拉角 2.2.1 基本思想 2.2.2 欧拉角的缺点 2.3 四元数 2. ...

  3. 相机标定(三)-相机成像模型

    >>>文章索引<<< 相机标定(一)-原理及内参.外参 相机标定(二)-畸变校正,张正友标定法 相机标定(三)-相机成像模型 1 人眼&相机结构 1.1 类 ...

  4. 两种欧拉角与其对应的旋转矩阵求解

    欧拉角定义 欧拉角(Euler Angle),由著名数学家莱昂哈德·欧拉(1707-1783)提出,故而得名.欧拉角旨在用三个角度来表示刚体在三维空间的旋转.这种表示方法经历了3个世纪,其实已经非常古 ...

  5. 利用MPU6050三轴加速度获取欧拉姿态角

    最近用到了MPU6050进行姿态估计,现将其中MPU6050三轴加速度读数求解欧拉姿态角的推导过程记录如下: 首先将MPU6050固联的载体坐标系b系与导航坐标系n系重合.即将图1的姿态旋转至图2中的 ...

  6. 基恩士plc-EtherCAT三十一轴,控制案例程序

    基恩士plc-EtherCAT三十一轴,控制案例程序(包含plc程序/人机界面/BOM表) ID:6914666466012375七中往事 以下内容不属于本博内容,仅仅是相关参考: 该套程序是电芯自动 ...

  7. 基于Kinect Azure的多相机数据采集(三)

    基于Kinect Azure的多相机数据采集(三)     在基于Kinect Azure的多相机数据采集(一)和基于Kinect Azure的多相机数据采集(二)中,我们总结了用Kinect Azu ...

  8. 三轴磁力计解算姿态(四元数)

    原理 根据地磁场向量在水平面上的投影来计算载体的偏航角,类似于加速度计解算姿态,不同在于磁场易受干扰,且只能得到偏航角. 方法 假设导航坐标系为东北天,载体坐标系为右前上. 初始载体坐标系和导航坐标系 ...

  9. 相机位姿求解——P3P问题

    1.位姿求解是计算机视觉中经常遇到的,Perspective-n-Points, PnP(P3P)提供了一种解决方案,它是一种由3D-2D的位姿求解方式,即需要已知匹配的3D点和图像2D点.目前遇到的 ...

  10. 旋转矩阵求解欧拉角Python实现

    旋转矩阵求解欧拉角Python实现 基本知识 绕静系与动系旋转 静系动系与左乘右乘 旋转矩阵连乘的两种理解 文件目录 实现方式 使用矩阵方程手动求解 SCIPY库求解 在线计算网站 总结 笔者在外实习 ...

最新文章

  1. SAP HU上面的'Obj.to Which HU Belongs'栏位初探
  2. cxf使用wsdl文件生成代码
  3. python模块之email: 电子邮件编码解码 (二、编码邮件)
  4. python常见错误-python初学者常见的错误
  5. 高质量程序设计指南c++/c语言(33)--函数指针
  6. 最基本的弹出窗口代码
  7. 毕业课题之------------图像的形态学滤波
  8. (网络编程)InetAddress(表示ip地址的类)相关使用
  9. Linux 2.6内核中新的锁机制--RCU [转]
  10. jUnit生命周期管理学习
  11. ABP前端使用阿里云angular2 UI框架NG-ZORRO分享
  12. 带旋treap概念及模板,带例题:普通平衡树
  13. 【LeetCode笔记】198. 打家劫舍(Java、动态规划)
  14. c语言指针访问 静态变量_使用C中的指针访问变量的值
  15. 计算机桌面有黑边怎么调整,电脑屏幕旁边有黑色框如何恢复_电脑两边黑边怎么还原-win7之家...
  16. AIX下sort命令简介及使用
  17. 北京计算机组织专家对,全球顶级专家齐聚北京 探讨计算机产业“大挑战”
  18. one邮箱服务器端口,oneinstack 设置远程访问,将端口对外开放
  19. System.Web.AspNetHostingPermission 类型的权限已失败
  20. 远控免杀专题文章(4)-Evasion模块免杀(VT免杀率12/71)

热门文章

  1. UWB定位技术原理图解
  2. JavaScript TypeScript 学习总结
  3. Excel改变照片底色,设置为白色
  4. 2019年8月 华为鸿蒙,华为2019年开发者大会将于8月9日举行,期待鸿蒙吗?
  5. 想学一门技术,学java有前途吗?
  6. volume的含义_volume是什么意思
  7. Java中实体类名称后缀VO,DTO的含义
  8. 音乐Npc弹窗 c#
  9. 关闭app服务器系统,ios12系统服务哪些关掉
  10. 保存书店每日交易记录程序设计