学习笔记:UR5协作机器人正运动学计算

学习笔记:UR5协作机器人正运动学计算

实战练习:求UR5机器人末端坐标
UR5 机器人 DH 参数表

UR5 是工业界最经典的 6 自由度协作机器人。以下是其标准 DH 参数(注意:不同厂商或文献可能使用改进型 DH,即 MDH,这里展示标准 DH 以符合本文档 2 的定义)。

单位: d,a (毫米 mm), α,θ (弧度 rad)

关节 Joint (i) αi (Twist) ai (Link Length) di (Link Offset) θi (Range)
1 (Base) π/2 0 89.16 q1
2 () 0 -425.00 0 q2
3 (Elbow) 0 -392.25 0 q3
4 (Wrist 1) π/2 0 109.15 q4
5 (Wrist 2) −π/2 0 94.65 q5
6 (Wrist 3) 0 0 82.30 q6

练习题:计算 UR5 处于零位 (q=[0,0,0,0,0,0]) 时的末端坐标。

正运动学简介

正运动学 (Forward Kinematics) 解决的问题是:已知所有关节角度,计算机器人末端执行器的位姿。

从"关节空间"到"任务空间"

plain 复制代码
┌─────────────┐         正运动学          ┌─────────────┐
│   关节空间   │  ─────────────────────→  │   任务空间   │
│  (Joint     │                          │  (Cartesian │
│   Space)    │                          │   Space)    │
└─────────────┘                          └─────────────┘
                                                    
  • 关节1角度 θ₁                              • 末端X坐标
  • 关节2角度 θ₂                              • 末端Y坐标  
  • 关节3角度 θ₃                              • 末端Z坐标
  • 关节4角度 θ₄                              • 末端朝向(姿态)
       ...                                         ...
  • 每个关节建立一个坐标系,机械臂是"一串坐标系",串联结构。
  • 坐标系之间用齐次变换矩阵连接。
  • 计算末端位姿在哪里,就相当于从基座到末端,一路"转发"坐标

Denavit-Hartenberg (DH) 参数法是建立连杆坐标系的标准方法。

DH 参数详解 (标准型)

描述相邻两个连杆 i−1 和 i 之间的关系,仅需 4 个参数:

参数 符号 物理含义 测量基准
连杆长度 ai 沿 xi 轴,从 zi−1 到 zi 的距离 连杆本身结构
连杆扭角 αi 绕 xi 轴,从 zi−1 旋转到 zi 的角度 连杆本身结构
关节偏距 di 沿 zi−1 轴,从 xi−1 到 xi 的距离 关节变量 (移动副)
关节角度 θi 绕 zi−1 轴,从 xi−1 旋转到 xi 的角度 关节变量 (旋转副)

相邻连杆的变换矩阵公式为:

正运动学的计算:两步走

第一步:建立DH参数表
第二步:连乘齐次变换矩阵

每个关节对应一个变换矩阵:

plain 复制代码
        [ cosθ  -sinθcosα   sinθsinα   a·cosθ ]
i-1Ti = [ sinθ   cosθcosα  -cosθsinα   a·sinθ ]
        [  0       sinα       cosα       d    ]
        [  0        0          0         1    ]

正运动学公式

结果:4×4矩阵,包含末端的位置(右上3×1)和姿态(左上3×3)。

计算UR5协作机器人末端位姿

由UR5 机器人 DH 参数表可知

列名 符号 在 UR5 中的体现
αi (Twist) 连杆扭角 只有第1、4、5轴有扭转(π/2 或 -π/2),其他为0。决定 6 自由度
ai (Link Length) 连杆长度 第2、3轴有长度(-425mm, -392.25mm)。决定工作半径(约 800mm 臂长)
di (Link Offset) 连杆偏置 第1、4、5、6轴有偏置。6轴只是工具法兰的偏移
θi (Range) 关节角度 就是关节变量 q₁~q₆

由正运动学公式,我们需要先得到每个关节的齐次变换矩阵,最后进行连乘即可得到末端位姿。

Joint 2 (Shoulder) 为例,写出变换矩阵:

将表Shoulder的参数代入,

  • α₂ = 0, a₂ = -0.425, d₂ = 0, θ₂ = q₂
plain 复制代码
1T2 = [ cosq₂   -sinq₂·1   sinq₂·0   -0.425·cosq₂ ]
      [ sinq₂    cosq₂·1  -cosq₂·0   -0.425·sinq₂ ]
      [   0        0          1          0      ]
      [   0        0          0          1      ]

简化后:
1T2 = [ cosq₂   -sinq₂   0   -0.425·cosq₂ ]
      [ sinq₂    cosq₂   0   -0.425·sinq₂ ]
      [   0        0     1       0      ]
      [   0        0     0       1      ]
以下使用python代码进行计算
python 复制代码
import numpy as np

def dh_matrix(theta, d, a, alpha):
    """
    根据标准DH参数计算变换矩阵 T_{i-1, i}
    单位: 角度使用弧度, 长度使用米
    """
    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   ]
    ])

def forward_kinematics_UR5(joint_angles):
    """
    计算UR5机械臂的末端位置
    """
    theta1, theta2, theta3, theta4, theta5, theta6 = joint_angles
    a1, a2, a3, a4, a5, a6 = 0, -0.425, -0.39225, 0, 0, 0
    d1, d2, d3, d4, d5, d6 = 0.089159, 0, 0, 0.10915, 0.09465, 0.0823
    alpha1, alpha2, alpha3, alpha4, alpha5, alpha6 = np.pi/2, 0, 0, np.pi/2, -np.pi/2, 0
    
    # 连杆 1: frame 0 -> frame 1
    # theta=theta1, d=d1, a=a1, alpha=alpha1
    T_01 = dh_matrix(theta1, d1, a1, alpha1)
    
    # 连杆 2: frame 1 -> frame 2
    T_12 = dh_matrix(theta2, d2, a2, alpha2)

    # 连杆 3: frame 2 -> frame 3
    T_23 = dh_matrix(theta3, d3, a3, alpha3)

    # 连杆 4: frame 3 -> frame 4
    T_34 = dh_matrix(theta4, d4, a4, alpha4)

    # 连杆 5: frame 4 -> frame 5
    T_45 = dh_matrix(theta5, d5, a5, alpha5)

    # 连杆 6: frame 5 -> frame 6
    T_56 = dh_matrix(theta6, d6, a6, alpha6)

    # 总变换矩阵
    T_06 = T_01 @ T_12 @ T_23 @ T_34 @ T_45 @ T_56

    return T_06



# --- 验证 ---

q_case = [0, 0, 0, 0, 0, 0]  # 全零关节角
T_final = forward_kinematics_UR5(q_case)
pos_final = T_final[:3, 3]



print(f"输入关节角: {np.degrees(q_case)}")
print(f"计算出的末端位置 (x, y, z): {np.round(pos_final, 4)}")

运行后得到的结果为:

shell 复制代码
输入关节角: [0. 0. 0. 0. 0. 0.]
计算出的末端位置 (x, y, z): [-0.8172 -0.1914 -0.0055]
相关推荐
LightYoungLee2 小时前
大模型(七)Agent AI学习笔记
人工智能·笔记·学习
星轨初途2 小时前
C++ 类和对象(下):初始化列表、static 成员与编译器优化深度剖析
android·开发语言·c++·经验分享·笔记
努力的lpp2 小时前
小迪安全课程第五节复习笔记:渗透测试命令与反弹连接技术
笔记·安全
进阶的猪2 小时前
Linux 学习笔记
linux·笔记·学习
chushiyunen2 小时前
BM25稀疏检索算法笔记
笔记·算法·c#
chushiyunen2 小时前
prompt提示词工程笔记
笔记·prompt
hanlin032 小时前
刷题笔记:力扣第6题-Z字形变换
笔记·算法·leetcode
一个人旅程~3 小时前
虚数与量子迷踪
经验分享·笔记·微信·电脑·量子计算
智者知已应修善业11 小时前
【proteus中lm339电压滞回比较器达到三角波转换成方波】2023-4-13
驱动开发·经验分享·笔记·硬件架构·proteus·硬件工程