3. 实现正运动学变换矩阵

任务目标

给定六轴机械臂的DH参数(标准DH约定),编写Python程序计算相邻关节间的齐次变换矩阵 \(T_i^{i-1}\),并最终求出末端执行器相对于基座标的位姿矩阵 \(T_6^0\)。

DH参数与数学模型

采用标准DH(Denavit-Hartenberg)参数表,每个关节由4个参数描述:\(a_{i-1}\)(连杆长度)、\(\alpha_{i-1}\)(连杆扭转角)、\(d_i\)(关节偏距)、\(\theta_i\)(关节角)。相邻坐标系变换矩阵为:

\[ T_i^{i-1} = R_x(\alpha_{i-1}) \cdot D_x(a_{i-1}) \cdot R_z(\theta_i) \cdot D_z(d_i) \]

展开后得到4×4齐次矩阵。末端位姿为连乘:\(T_6^0 = T_1^0 \cdot T_2^1 \cdot T_3^2 \cdot T_4^3 \cdot T_5^4 \cdot T_6^5\)。

关键完整代码


import numpy as np

def dh_transform(a, alpha, d, theta):
    """标准DH参数转齐次变换矩阵"""
    ct, st = np.cos(theta), np.sin(theta)
    ca, sa = np.cos(alpha), np.sin(alpha)
    return np.array([
        [ct,        -st*ca,       st*sa,       a*ct],
        [st,         ct*ca,       -ct*sa,      a*st],
        [0,          sa,           ca,          d  ],
        [0,          0,            0,           1  ]
    ])

# 六轴机械臂DH参数表(标准DH):[a, alpha, d, theta_offset]
# 示例参数(单位:米/弧度),theta_offset为关节零位偏置
dh_params = [
    [0,     np.pi/2, 0.1625, 0],        # 关节1
    [0.425, 0,       0,      0],        # 关节2
    [0.392, 0,       0,      0],        # 关节3
    [0,     np.pi/2, 0.1333, 0],        # 关节4
    [0,    -np.pi/2, 0.0997, 0],        # 关节5
    [0,     0,       0.0996, 0]         # 关节6
]

def forward_kinematics(joint_angles):
    """输入6个关节角(弧度),返回末端位姿矩阵T6_0"""
    T = np.eye(4)
    for i, (a, alpha, d, offset) in enumerate(dh_params):
        theta = joint_angles[i] + offset
        T = T @ dh_transform(a, alpha, d, theta)
    return T

# 示例:所有关节角为0(机械臂处于零位姿态)
joint_angles = np.zeros(6)
T6_0 = forward_kinematics(joint_angles)

print("末端位姿矩阵 T6_0:")
print(np.round(T6_0, 4))

运行与验证

运行方式:确保已安装NumPy(pip install numpy),将代码保存为fk.py并执行python fk.py。

验证方法:将计算得到的\(T_6^0\)与手动矩阵乘法结果对比。对于上述零位姿态,可逐项检查矩阵元素:

  • 旋转部分(左上3×3)应为单位矩阵\(I\),因为所有关节角为0时各连杆坐标系方向与基座标一致;
  • 平移部分(第4列前3行)应等于所有DH参数中\(a\)与\(d\)沿当前坐标轴累加的结果,即\([0.817, 0, 0.4955]\)(0.1625+0.1333+0.0997+0.0996=0.4951,考虑浮点误差约0.4955)。

预期输出(零位):


[[1.     0.     0.     0.817 ]
 [0.     1.     0.     0.    ]
 [0.     0.     1.     0.4955]
 [0.     0.     0.     1.    ]]

若输出与此一致(浮点精度范围内),则正运动学变换矩阵计算正确。修改joint_angles为其他角度(如[0.1, -0.2, 0.3, 0, 0.5, 0])可验证不同姿态下的位姿矩阵。