转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换


由于在平时总是或多或少的遇到平移旋转的问题,每次都是现查资料,然后查了忘,忘了继续查,这次弄明白之后干脆写一篇文章,给人方便同时于己方便,后续如有扩充或变动也方便添加。

1. 转换矩阵、平移矩阵、旋转矩阵之间的关系

假设有两个向量 a 1 = ( x 1 , y 1 , z 1 ) a_1 = (x_1, y_1, z_1) a1=(x1,y1,z1) a 2 = ( x 2 , y 2 , z 2 ) a_2 = (x_2, y_2, z_2) a2=(x2,y2,z2),它们的转换关系为:

a 1 = R ∗ a 2 + T a_1 = R * a_2 + T a1=Ra2+T
这里 R R R就是它的旋转矩阵 T T T就是它的平移矩阵。使用齐次方式表示如下:

( a 1 1 ) = ( R T 0 1 ) ∗ ( a 2 1 ) \begin{pmatrix} a_1\\ 1 \end{pmatrix}= \begin{pmatrix} R&T\\ 0&1 \end{pmatrix}* \begin{pmatrix} a_2\\1 \end{pmatrix} (a11)=(R0T1)(a21)
使用元素值替换后,表示如下:
( x 1 y 1 z 1 1 ) = ( r 11 r 12 r 13 t 1 r 21 r 22 r 23 t 2 r 31 r 32 r 33 t 3 0 0 0 1 ) ∗ ( x 2 y 3 z 2 1 ) \begin{pmatrix} x_1\\y_1\\z_1\\1 \end{pmatrix}= \begin{pmatrix} r_{11}&r_{12}&r_{13}&t_{1}\\ r_{21}&r_{22}&r_{23}&t_{2}\\ r_{31}&r_{32}&r_{33}&t_{3}\\ 0&0&0&1 \end{pmatrix}* \begin{pmatrix} x_2\\y_3\\z_2\\1 \end{pmatrix} x1y1z11 = r11r21r310r12r22r320r13r23r330t1t2t31 x2y3z21
在仿射变换中的转换矩阵表示先线性变换再平移。在这里转换矩阵表示如下:
转换矩阵 = ( r 11 r 12 r 13 t 1 r 21 r 22 r 23 t 2 r 31 r 32 r 33 t 3 0 0 0 1 ) 转换矩阵= \begin{pmatrix} r_{11}&r_{12}&r_{13}&t_{1}\\ r_{21}&r_{22}&r_{23}&t_{2}\\ r_{31}&r_{32}&r_{33}&t_{3}\\ 0&0&0&1 \end{pmatrix} 转换矩阵= r11r21r310r12r22r320r13r23r330t1t2t31
平移矩阵表示如下:
平移矩阵 T = ( t 1 t 2 t 3 ) 平移矩阵T=\begin{pmatrix} t_{1}\\ t_{2}\\ t_{3}\\ \end{pmatrix} 平移矩阵T= t1t2t3
旋转矩阵表示如下:
旋转矩阵 R = ( r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ) 旋转矩阵R=\begin{pmatrix} r_{11}&r_{12}&r_{13}\\ r_{21}&r_{22}&r_{23}\\ r_{31}&r_{32}&r_{33} \end{pmatrix} 旋转矩阵R= r11r21r31r12r22r32r13r23r33

2. 缩放变换、平移变换和旋转变换

如果理解以上知识点之后,缩放变换、平移变换和旋转变换的特殊情况也迎刃而解。

  • 缩放变换

缩放变换只是在尺度上进行改变,所以它的变换形式如下:

在这里插入图片描述

  • 平移变换

平移变换的时候,角度不发生改变,也就是旋转矩阵R为单位矩阵,所以它的变换形式如下:

在这里插入图片描述

  • 旋转变换

当空间内的物体绕着 x 轴,y 轴或者 z 轴旋转的时候,变换矩阵为:

在这里插入图片描述
对于一般性的旋转问题,可以用简单的旋转描述复杂的旋转。用 x 轴,y 轴和 z 轴上的旋转来定义旋转:

在这里插入图片描述

这三个角就被称作欧拉角(Euler angles)。

2. python实现旋转矩阵、四元数、欧拉角互相转化

在应用中,我们往往会遇到旋转矩阵、四元数和欧拉角之间的互相转换,在这里,我们只使用python代码来实现它们之间互相转换。

from scipy.spatial.transform import Rotation as R

def quaternion2euler(quaternion):
    r = R.from_quat(quaternion)
    euler = r.as_euler('xyz', degrees=True)
    return euler

def euler2quaternion(euler):
    r = R.from_euler('xyz', euler, degrees=True)
    quaternion = r.as_quat()
    return quaternion

def euler2rotation(euler):
    r = R.from_euler('xyz', euler, degrees=True)
    rotation_matrix = r.as_matrix()
    return rotation_matrix

def quaternion2rotation_matrix(quaternion):
    r = R.from_quat(quaternion)
    rotation_matrix = r.as_matrix()
    return rotation_matrix

def rotation_matrix2euler(rotation_matrix):
    r = R.from_matrix(rotation_matrix)
    euler = r.as_euler('xyz', degrees=True)
    return euler
    

def rotation_matrix2quaternion(rotation_matrix):
    r = R.from_matrix(rotation_matrix)
    quaternion = r.as_quat()
    return quaternion

if __name__ == '__main__':
    # 四元数=>欧拉角
    quaternion = [0.71934025092983234, -1.876085535681999e-06, -3.274841213980097e-08, -0.69465790385533299]
    euler = quaternion2euler(quaternion) # [-9.20000743e+01  1.52039496e-04 -1.52039496e-04]
    print(f'euler: {euler}')
    
    # 四元数=>旋转矩阵
    rotation_matrix = quaternion2rotation_matrix(quaternion)
    print(f'rotation_matrix: {rotation_matrix}')
    
    # 欧拉角=>四元数
    quaternion = euler2quaternion(euler)
    print(f'quaternion: {quaternion}') # [-7.19340251e-01  1.87608554e-06  3.27484122e-08  6.94657904e-01]
    
    # 欧拉角=>旋转矩阵
    rotation_matrix = euler2rotation(euler)
    print(f'rotation_matrix: {rotation_matrix}')
    
    # 旋转矩阵=>欧拉角
    euler = rotation_matrix2euler(rotation_matrix)
    print(f'euler: {euler}')
    
    # 旋转矩阵=>四元数
    quaternion = rotation_matrix2quaternion(rotation_matrix)
    print(f'quaternion: {quaternion}')
### 将目标检测预测坐标转换为真实世界坐标的计算方法 为了实现从目标检测模型预测的二维图像坐标到实际场景中三维真实坐标的转换,通常涉及以下几个方面: #### 1. 图像坐标系与相机坐标系的关系 图像上的每一个像素位置可以被映射至摄像机所处的空间内某一点。这种映射依赖于内外参数矩阵,其中外参描述的是摄像头相对于固定的世界坐标系统的姿态(即旋转平移),而内参则包含了焦距、主点偏移等因素。 对于给定的一组平移向量\(T=[t_x, t_y, t_z]\),其具体数值取决于设备安装的位置差异;例如,在某些应用场景下可能有特定的距离设定如\(x=134\text{ mm}\), \(y=132\text{ mm}\), \(z=200\text{ mm}\)[^3]。 #### 2. 坐标变换过程概述 当已知物体在图片中的投影位置时,可以通过逆透视变换将其恢复成对应的真实空间位置。此过程中涉及到的关键步骤包括但不限于: - **去畸变**:修正由镜头引起的几何失真; - **解算深度信息**:利用双目视觉或多视图几何原理获取距离数据; - **应用外部参数**:考虑摄像装置的姿态变化影响。 #### 3. 计算公式说明 假设有一个简单的针孔相机模型,并且已经得到了准确的内部和外部校准参数,则可按照如下方式完成转换操作: 设图像上某特征点P'=(u,v)对应的归一化平面坐标为(p,q),那么该点的实际坐标(X,Y,Z)可通过下面的方程求得: \[ \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=K[R|T]\cdot \begin{bmatrix} X/Z\\ Y/Z\\ 1 \end{bmatrix}, \] 这里\(K\)代表内参矩阵,它决定了如何将理想化的光线方向映射到具体的传感器网格之上;\(R\)是一个正交阵列用来表达旋转角度的变化情况;最后部分则是之前提到过的平移分量\(T\)。 进一步简化上述关系式得到最终用于反推真实坐标的表达形式: \[ Z=\frac{f}{d}(u-u_0)+Z_c,\quad X=\frac{(u-u_0)}{f}Z,\quad Y=\frac{(v-v_0)}{f}Z.\] 这里的\(f\)指的是有效焦距,(u₀,v₀)为中心点坐标,\(d\)表示深度值,\(Z_c\)是沿光轴方向的一个常数项[^2]。 另外需要注意的是如果存在复杂的姿态调整需求的话还需要引入四元数来进行更加精确的角度表述[^4]。 ```python import numpy as np def image_to_world(u, v, depth, K, R, T): """ Convert an image point to a world coordinate. Parameters: u (float): Image column index. v (float): Image row index. depth (float): Depth value at the given pixel location. K (numpy.ndarray): Camera intrinsic matrix of shape (3, 3). R (numpy.ndarray): Rotation matrix from camera frame to world frame of shape (3, 3). T (numpy.ndarray): Translation vector from camera origin to world origin of length 3. Returns: tuple: A triple containing the corresponding real-world coordinates (X, Y, Z). """ # Compute normalized device coordinates inv_K = np.linalg.inv(K) ndc = inv_K @ np.array([u, v, 1]) # Scale by depth and apply extrinsics transformation xyz_cam = depth * ndc / ndc[-1] XYZ_wld = R.T @ (xyz_cam - T) return tuple(XYZ_wld.tolist()) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非晚非晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值