3. UR机器人编程基础与脚本应用

UR机器人的编程体系由两条并行的路径构成:一条是面向现场快速部署的 Polyscope 图形化编程,另一条是面向复杂逻辑与外部集成的 URScript 脚本编程。理解这两条路径各自的能力边界与协作方式,是后续实现视觉引导抓取的前提。视觉引导抓取往往需要"图形化搭骨架、脚本填细节"的混合编程模式,因此本节从界面结构讲到脚本语法,再落到运动指令与抓取动作的完整实现。

Polyscope 编程界面与程序节点

Polyscope 是 UR 示教器上的操作界面,核心区域分为顶部状态栏、左侧程序树、右侧命令选项卡和底部控制栏。程序树以自上而下的顺序执行,每个条目称为一个"程序节点"。常用节点类型包括:运动节点(MoveJ、MoveL、MoveP、MoveC)、路点节点(Waypoint)、I/O 节点(Set、Wait)、逻辑节点(If、Loop、Assignment)以及脚本节点(Script)。程序树中的节点可以折叠、拖拽、复制,右键可插入"Before Start"和"After Start"等特殊位置。

流程控制主要依赖三类结构:If 条件判断用于根据数字输入或变量值分支;Loop 循环支持"固定次数"和"While 条件"两种模式;SubProgram 子程序用于封装重复动作。需要注意的是,Polyscope 的图形节点最终都会被翻译成 URScript 语句下发到控制器,因此图形化编程与脚本编程并非两套独立系统,而是同一执行引擎的两种输入方式。

URScript 脚本基础

URScript 是 UR 控制器的原生脚本语言,语法接近 Python,但运行在实时控制器上,不支持任意第三方库。基本要素包括:变量无需声明类型,直接赋值即可,如 offset = 0.05;支持 if...elif...else、while、for 循环;函数通过 def 定义,可带参数和返回值。

def pick_and_place(pick_pose, place_pose, grip_force):
  movel(pick_pose, a=1.2, v=0.25)
  set_tool_digital_out(0, True)
  sleep(0.3)
  movel(place_pose, a=1.2, v=0.25)
  set_tool_digital_out(0, False)
  sleep(0.2)
end

URScript 中常用的内置函数包括:movel()、movej()、movep() 用于运动;get_actual_tcp_pose() 读取当前 TCP 位姿;set_digital_out() 控制数字输出;sleep() 延时。位姿用 6 元素列表表示 [x, y, z, rx, ry, rz],其中位置单位为米,姿态为轴角(旋转向量)表示,单位为弧度。这一点与许多视觉系统输出的欧拉角不同,集成时需要做姿态格式转换。

URScript 中的位姿是"基坐标系下的 TCP 位姿",方向约定为旋转向量(Rodrigues 参数)。若视觉系统输出的是四元数或欧拉角,需先转换为旋转向量再传入 movel()。

运动指令与路点示教

四种运动指令的适用场景差异明显:MoveJ 关节空间插值,速度快、路径不可控,适合大范围空载移动;MoveL 直线插值,TCP 沿直线运动,适合接近、插入、涂胶等需要直线轨迹的场合;MoveP 在拐角处做圆滑过渡,适合连续轨迹;MoveC 圆弧运动,需给定中间点和终点。视觉抓取中最常用的是 MoveJ 做粗定位、MoveL 做精定位和插入。

路点示教有两种方式:一是手动拖动示教器上的"自由驱动"按钮,将机器人拖到目标位置后点击"示教"记录当前位姿;二是直接在脚本中写入位姿数值。对于视觉引导抓取,通常采用"基准路点 + 偏移量"的方式:先示教一个基准抓取位点,再根据视觉输出的偏移量在脚本中计算实际目标位姿。

base_pick = p[0.35, -0.12, 0.18, 3.14, 0.0, 0.0]
vision_offset = p[0.012, -0.008, 0.0, 0.0, 0.0, 0.0]
target = pose_trans(base_pick, vision_offset)
movel(target, a=1.0, v=0.15)

这里 pose_trans() 用于位姿变换,将视觉偏移量叠加到基准位姿上。注意偏移量的方向定义:若视觉系统输出的是基坐标系下的偏移,直接相加即可;若输出的是工具坐标系下的偏移,则需用 pose_trans() 做坐标变换。全文及图示均以基坐标系为参照,偏移量正方向与基坐标系 X、Y、Z 轴一致。

抓取动作编程

一个完整的抓取动作通常包含:接近点 → 抓取点 → 夹爪闭合 → 抬升 → 放置点 → 夹爪张开 → 退回。以两指电动夹爪为例,抓取力通过 set_tool_digital_out() 或模拟量输出控制,闭合等待时间需根据夹爪行程和速度设定,一般 0.2~0.5 秒。抓取点应比实际抓取位置略低 2~5 mm,确保夹爪充分接触工件。

下面这张图展示了从视觉输出到抓取执行的完整信号链与坐标变换关系,帮助理解各环节的数据流向和参数作用点。

视觉引导抓取:信号链与坐标变换 视觉系统 输出:像素坐标 + 深度 或 基坐标系偏移量 坐标转换 手眼标定矩阵 像素 → 基坐标系偏移 位姿计算 pose_trans(base, offset) 生成目标位姿 target 运动执行 MoveJ 接近 → MoveL 精定位 → 夹爪闭合 → MoveL 抬升 抓取动作分解(基坐标系,单位:米) ① 接近点 Z+0.10 上方 ② 抓取点 Z-0.003 补偿 ③ 夹爪闭合 力控 + 延时 0.3s ④ 抬升 Z+0.15 退回 ⑤ 放置 张开 + 退回 注:偏移量方向与基坐标系一致;抓取点 Z 向补偿 -3mm 确保夹爪充分接触

在实际编程中,建议将抓取动作封装为带参数的子程序,参数包括抓取位姿、放置位姿、夹爪力和延时时间。这样在更换工件或调整布局时,只需修改参数而无需重写逻辑。同时,应在关键节点插入 get_actual_tcp_pose() 读取实际位姿并与目标位姿比对,用于判断运动是否到位。若偏差超过阈值(例如 2 mm),可触发重试或报警。

URScript 运行在实时控制器上,sleep() 会阻塞程序执行,不宜在高速循环中频繁使用。夹爪等待建议用 wait_digital_input() 替代固定延时,以提高节拍稳定性。