目录
欧拉角介绍
旋转矩阵公式推导
旋转顺序
内旋/外旋
欧拉角介绍
欧拉角:
横滚:roll(绕X轴旋转);
俯仰:pitch(绕Y轴旋转);
偏航(也称航向角):yaw(绕Z轴旋转)。
旋转矩阵公式推导
旋转符合右手定则。假设旋转轴顺序为zyx,分别对应yaw(γ)、pitch(β)、roll(α),则旋转矩阵表示为:
旋转矩阵的推导资料很多了,此处不加赘述。
本文章主要针对旋转顺序和内旋/外旋做明确的解释。
旋转顺序
旋转顺序可以是任意设置的。但常见的默认顺序是zyx,对应yaw,pitch,roll。尤其是在做INS/GPS全局局部数据互相转化时。
内旋/外旋
import numpy as np
from scipy.spatial.transform import Rotation as Rot
point = np.array([1,0,0])
rpy = np.array([0, np.pi/4, np.pi/2])
##################### 内旋
# 内旋@need_trans_point = 对n坐标系中的点进行活动坐标旋转后(将n系中的点转到b系中后)(也就是b坐标系中的点)在n坐标系下的位置,用ZYX,ypr,此中need_trans_point表示在n系下的初始位置。和下面一个意思。
# 内旋@need_trans_point = b坐标系中的点在n坐标系下的位置,用ZYX,ypr,此中need_trans_point表示在b系下的初始位置
# 内旋.T@need_trans_point = n坐标系中的点在b坐标系下的位置,用ZYX,ypr,此中need_trans_point表示在n系下的初始位置
nx=Rot.from_euler('ZYX', rpy[::-1], degrees=False).as_matrix() ## 注意:zyx需要对应yaw,pitch,roll。
nx1=Rot.from_euler('xyz', rpy, degrees=False).as_matrix() ## 每种特定顺序的外旋等价于其相反顺序的内旋。结果和上面等价
##################### 外旋
# 外旋@need_trans_point = 对原坐标系中的点进行固定坐标旋转后在原坐标系下的位置,用zyx,ypr,此中need_trans_point表示在n系下的初始位置
# 外旋.T@need_trans_point = 原坐标系中的点在经固定坐标旋转后的新坐标系下的位置,用zyx,ypr
wx=Rot.from_euler('zyx', rpy[::-1], degrees=False).as_matrix()
wx1=Rot.from_euler('XYZ', rpy, degrees=False).as_matrix()
print(wx@point, wx1@point, nx@point, nx1@point, )
print(wx.T@point, wx1.T@point, nx.T@point, nx1.T@point,)
解释:以上代码以scipy,rotation为工具。其中,'ZYX'大写为内旋,'zyx'小写时为外旋(具体参照下面官方说明)。
可查看scipy文档有关rotation说明:
https://www.osgeo.cn/scipy/reference/generated/scipy.spatial.transform.Rotation.from_euler.htmlhttps://www.osgeo.cn/scipy/reference/generated/scipy.spatial.transform.Rotation.from_euler.html