3. 欧拉角表示姿态

任务目标

本案例实现动平台姿态的ZYX欧拉角表示法,并编写将欧拉角(绕Z轴偏航ψ、绕Y轴俯仰θ、绕X轴滚转φ)转换为旋转矩阵的函数。该旋转矩阵用于后续Stewart平台正运动学中描述动平台相对于基座的姿态。

ZYX欧拉角定义

ZYX欧拉角采用外旋(绕固定坐标系旋转)方式,旋转顺序为:先绕Z轴旋转ψ(偏航),再绕Y轴旋转θ(俯仰),最后绕X轴旋转φ(滚转)。对应的旋转矩阵为:

R = Rz(ψ) · Ry(θ) · Rx(φ)

其中各基本旋转矩阵为:

Rz(ψ) = [cosψ  -sinψ  0;  sinψ  cosψ  0;  0  0  1]
Ry(θ) = [cosθ   0      sinθ;  0     1    0;  -sinθ  0  cosθ]
Rx(φ) = [1      0      0;  0  cosφ  -sinφ;  0  sinφ  cosφ]

Python实现


import numpy as np

def euler_zyx_to_rotation_matrix(psi, theta, phi):
    """
    将ZYX欧拉角转换为旋转矩阵(外旋,绕固定轴)
    
    参数:
        psi   : 偏航角,绕Z轴旋转(弧度)
        theta : 俯仰角,绕Y轴旋转(弧度)
        phi   : 滚转角,绕X轴旋转(弧度)
    
    返回:
        3x3 numpy数组,表示旋转矩阵R = Rz(psi) @ Ry(theta) @ Rx(phi)
    """
    cz, sz = np.cos(psi), np.sin(psi)
    cy, sy = np.cos(theta), np.sin(theta)
    cx, sx = np.cos(phi), np.sin(phi)
    
    Rz = np.array([[cz, -sz, 0],
                   [sz,  cz, 0],
                   [0,   0,  1]])
    
    Ry = np.array([[cy,  0, sy],
                   [0,   1,  0],
                   [-sy, 0, cy]])
    
    Rx = np.array([[1,  0,   0],
                   [0,  cx, -sx],
                   [0,  sx,  cx]])
    
    return Rz @ Ry @ Rx

# 最小验证示例
if __name__ == "__main__":
    # 测试1: 零角度应得到单位矩阵
    R_zero = euler_zyx_to_rotation_matrix(0, 0, 0)
    print("零角度结果:\n", R_zero)
    print("是否为单位矩阵:", np.allclose(R_zero, np.eye(3)))
    
    # 测试2: 仅绕Z轴旋转90度(π/2)
    R_z90 = euler_zyx_to_rotation_matrix(np.pi/2, 0, 0)
    expected_z = np.array([[0, -1, 0], [1, 0, 0], [0, 0, 1]])
    print("\n仅偏航90°结果:\n", R_z90)
    print("与预期一致:", np.allclose(R_z90, expected_z))
    
    # 测试3: 验证旋转矩阵正交性 R^T @ R = I
    R_test = euler_zyx_to_rotation_matrix(0.3, -0.5, 0.8)
    ortho_check = R_test.T @ R_test
    print("\n正交性检查 R^T·R:\n", ortho_check)
    print("是否为单位矩阵:", np.allclose(ortho_check, np.eye(3)))

运行与验证

运行方式:将上述代码保存为 euler_zyx.py,在终端执行 python euler_zyx.py。

验证方法:

  • 零角度输入应输出单位矩阵,验证函数基本正确性;
  • 仅偏航90°时,结果应与绕Z轴旋转90°的标准矩阵一致;
  • 任意角度下,旋转矩阵应满足正交性(RTR = I),行列式为1。

预期输出:三个测试均打印 True,且输出的矩阵数值与上述理论值一致。

关键说明

  • 本函数采用外旋(固定轴)定义,与内旋(绕自身轴)的ZYX欧拉角矩阵形式不同,使用时需明确约定;
  • 角度单位均为弧度,若输入角度为度需先转换;
  • 该旋转矩阵将基座坐标映射到动平台坐标,即 p_platform = R @ p_base,后续正运动学中用于计算动平台铰点位置。