根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(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=⎝⎛r11r21r31r12r22r32r13r23r33⎠⎞
刚体旋转的旋转矩阵是由三个基本旋转矩阵
复合而成的。
2、欧拉角(Euler Angles)
欧拉角
来描述刚体在三维欧几里得空间
的取向
3、旋转矩阵转换为欧拉角的公式:
Z轴对应的欧拉角
θz=arctan2(−r31,r11)\theta_{z}=\arctan 2\left(-r_{31}, r_{11}\right) θz=arctan2(−r31,r11)
Y轴对应的欧拉角
θy=arctan2(−r31,r312+r332)\theta_{y}=\arctan 2\left(-r_{31}, \sqrt{r_{31}{ }^{2}+r_{33}{ }^{2}}\right) θy=arctan2(−r31,r312+r332)
X轴对应的欧拉角
θx=arctan2(−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++代码实现相关推荐
- 相机旋转矩阵求解三个姿态角
http://www.cnblogs.com/singlex/p/pose_estimation_1.html https://www.cnblogs.com/singlex/p/RotateMatr ...
- 车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及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. ...
- 相机标定(三)-相机成像模型
>>>文章索引<<< 相机标定(一)-原理及内参.外参 相机标定(二)-畸变校正,张正友标定法 相机标定(三)-相机成像模型 1 人眼&相机结构 1.1 类 ...
- 两种欧拉角与其对应的旋转矩阵求解
欧拉角定义 欧拉角(Euler Angle),由著名数学家莱昂哈德·欧拉(1707-1783)提出,故而得名.欧拉角旨在用三个角度来表示刚体在三维空间的旋转.这种表示方法经历了3个世纪,其实已经非常古 ...
- 利用MPU6050三轴加速度获取欧拉姿态角
最近用到了MPU6050进行姿态估计,现将其中MPU6050三轴加速度读数求解欧拉姿态角的推导过程记录如下: 首先将MPU6050固联的载体坐标系b系与导航坐标系n系重合.即将图1的姿态旋转至图2中的 ...
- 基恩士plc-EtherCAT三十一轴,控制案例程序
基恩士plc-EtherCAT三十一轴,控制案例程序(包含plc程序/人机界面/BOM表) ID:6914666466012375七中往事 以下内容不属于本博内容,仅仅是相关参考: 该套程序是电芯自动 ...
- 基于Kinect Azure的多相机数据采集(三)
基于Kinect Azure的多相机数据采集(三) 在基于Kinect Azure的多相机数据采集(一)和基于Kinect Azure的多相机数据采集(二)中,我们总结了用Kinect Azu ...
- 三轴磁力计解算姿态(四元数)
原理 根据地磁场向量在水平面上的投影来计算载体的偏航角,类似于加速度计解算姿态,不同在于磁场易受干扰,且只能得到偏航角. 方法 假设导航坐标系为东北天,载体坐标系为右前上. 初始载体坐标系和导航坐标系 ...
- 相机位姿求解——P3P问题
1.位姿求解是计算机视觉中经常遇到的,Perspective-n-Points, PnP(P3P)提供了一种解决方案,它是一种由3D-2D的位姿求解方式,即需要已知匹配的3D点和图像2D点.目前遇到的 ...
- 旋转矩阵求解欧拉角Python实现
旋转矩阵求解欧拉角Python实现 基本知识 绕静系与动系旋转 静系动系与左乘右乘 旋转矩阵连乘的两种理解 文件目录 实现方式 使用矩阵方程手动求解 SCIPY库求解 在线计算网站 总结 笔者在外实习 ...
最新文章
- SAP HU上面的'Obj.to Which HU Belongs'栏位初探
- cxf使用wsdl文件生成代码
- python模块之email: 电子邮件编码解码 (二、编码邮件)
- python常见错误-python初学者常见的错误
- 高质量程序设计指南c++/c语言(33)--函数指针
- 最基本的弹出窗口代码
- 毕业课题之------------图像的形态学滤波
- (网络编程)InetAddress(表示ip地址的类)相关使用
- Linux 2.6内核中新的锁机制--RCU [转]
- jUnit生命周期管理学习
- ABP前端使用阿里云angular2 UI框架NG-ZORRO分享
- 带旋treap概念及模板,带例题:普通平衡树
- 【LeetCode笔记】198. 打家劫舍(Java、动态规划)
- c语言指针访问 静态变量_使用C中的指针访问变量的值
- 计算机桌面有黑边怎么调整,电脑屏幕旁边有黑色框如何恢复_电脑两边黑边怎么还原-win7之家...
- AIX下sort命令简介及使用
- 北京计算机组织专家对,全球顶级专家齐聚北京 探讨计算机产业“大挑战”
- one邮箱服务器端口,oneinstack 设置远程访问,将端口对外开放
- System.Web.AspNetHostingPermission 类型的权限已失败
- 远控免杀专题文章(4)-Evasion模块免杀(VT免杀率12/71)