4. UR Force Mode编程基础

UR 的 Force Mode(力模式)不是一条“打开力控”的开关,而是一组协同工作的脚本指令:force_mode() 负责进入力控并定义任务坐标系、期望力/力矩与约束轴;force_mode_set_gain() 调整力控回路的刚度与阻尼;force_mode_set_damping() 单独修正阻尼;end_force_mode() 退出力控;force_mode_set_max_joint_speed() 限制力控期间关节速度;force_mode_set_max_tcp_speed() 限制 TCP 速度。理解这些指令的参数语义,是写出安全、可复现柔顺装配程序的前提。

4.1 force_mode 的参数结构

典型调用形式如下:

force_mode(task_frame, selection_vector, wrench, type, limits)

五个参数各有明确职责:

  • task_frame:任务坐标系位姿(pose),力控的“方向”全部相对它定义。装配场景常把 Z 轴指向插入方向,原点放在工件接触面附近。
  • selection_vector:6 元素数组,对应 task_frame 的 [x, y, z, rx, ry, rz]。1 表示该轴受“力/力矩控制”,0 表示该轴受“位置控制”。例如 [0,0,1,0,0,0] 表示只在 Z 向做力控,其余五轴仍走位置。
  • wrench:6 元素数组,给出各轴期望力/力矩,单位 N 与 N·m。只有 selection_vector 为 1 的轴才生效。
  • type:力控参考系类型,常用 force_mode_type.base(相对基座)或 force_mode_type.tcp(相对工具)。
  • limits:6 元素数组,限制各轴速度或偏差,防止力控轴失控。

一个典型的轴孔装配进入段可以写成:

force_mode(p[0,0,0.1,0,0,0], [0,0,1,0,0,0],
           [0,0,-15,0,0,0], force_mode_type.base,
           [0.1,0.1,0.05,0.2,0.2,0.2])

含义是:在任务坐标系 Z 向施加 -15 N(压向工件),Z 向速度上限 0.05 m/s,其余轴保持位置控制并限制速度。注意力的正负号必须与 task_frame 的 Z 轴方向一致,方向定义错误会导致机器人“顶开”而不是“压入”。

4.2 增益与阻尼:force_mode_set_gain

force_mode_set_gain(gain) 设置力控回路的比例增益,取值范围通常为 0~2,默认约 0.5。增益越大,机器人对力偏差响应越快、越“硬”,但过高会引起振荡;增益越小越柔顺,但跟踪期望力变慢。对于刚性金属件压装,可先用 0.3~0.5 起步;对于易碎或弹性工件,宜降到 0.1~0.3。

force_mode_set_damping(damping) 设置阻尼,范围 0~1,默认约 0.1。阻尼用于抑制振荡,与增益配合:增益提高时适当提高阻尼,可让系统更快稳定而不抖动。调试顺序建议“先定 selection_vector 与 wrench,再调 gain,最后用 damping 压振”。

4.3 速度限制与安全配置

力控期间机器人仍会运动,因此必须限制速度:

  • force_mode_set_max_joint_speed(speed):限制关节速度(rad/s),防止力控轴带动整臂快速摆动。
  • force_mode_set_max_tcp_speed(speed):限制 TCP 速度(m/s),对装配插入更直观。

安全配置还包括:在 force_mode() 前用 set_payload() 正确设置负载,否则力控基准错误;用 set_tcp() 设置工具中心点;在力控段前后用 end_force_mode() 明确退出;配合 freedrive_mode() 或 protective_stop 做异常保护。力控不是替代安全评估,而是需要在安全配置下使用的能力。

4.4 脚本程序结构

一个完整的力控装配脚本通常遵循“准备—进入—保持—退出—复位”的结构:

set_tcp(p[0,0,0.15,0,0,0])
set_payload(1.2, [0,0,0.05,0,0,0])
movej(approach, a=1.2, v=0.25)

force_mode_set_gain(0.4)
force_mode_set_damping(0.15)
force_mode_set_max_tcp_speed(0.05)

force_mode(p[0,0,0.1,0,0,0], [0,0,1,0,0,0],
           [0,0,-15,0,0,0], force_mode_type.base,
           [0.1,0.1,0.05,0.2,0.2,0.2])

# 保持力控,等待插入到位或力/位置条件满足
wait(0.5)
end_force_mode()

movej(retract, a=1.2, v=0.25)

结构要点:进入力控前完成坐标系、负载、TCP 设置;力控段内只做必要的等待或条件判断;退出后恢复位置控制再抬升。若在力控段内直接调用 movel 等位置指令,可能因力控与位置控制冲突导致异常,应避免。

4.5 参数与安全关系总览

下面的 SVG 以“参数—作用—安全约束”的关系图形式,把本节核心指令与参数组织在一起,便于对照记忆。

UR Force Mode 指令集与参数关系 力控指令集 force_mode() 进入力控 / 定义任务 force_mode_set_gain() 刚度 / 响应速度 force_mode_set_damping() 抑制振荡 set_max_joint_speed() 关节速度上限 set_max_tcp_speed() TCP 速度上限 end_force_mode() 退出力控 / 恢复位置 set_tcp / set_payload 前置 force_mode 核心参数 task_frame 任务坐标系,定义力方向 selection_vector 1=力控轴,0=位置轴 wrench 期望力/力矩,单位 N / N·m type base / tcp 参考系 limits 各轴速度/偏差限制 gain / damping 0~2 / 0~1,先增益后阻尼 刚性件 0.3~0.5,易碎件 0.1~0.3 安全配置要点 正确设置 TCP 力控基准与工具一致 正确设置负载 set_payload 影响力基准 限制速度 joint / TCP 双上限 明确退出 end_force_mode 后再移动 避免力控段内位置指令 防止控制冲突 异常保护 protective_stop / freedrive 力控不替代安全评估 调试顺序:task_frame → selection_vector → wrench → gain → damping → 速度限制 → 退出与复位

4.6 常见参数错误与判断

实际编程中,几类错误最常出现:一是 selection_vector 与 wrench 不匹配,例如选了 Z 轴力控却把力写在 X 分量上,结果机器人“不动”或“乱动”;二是力的正负号与 task_frame 方向相反,表现为机器人远离工件而非压入;三是 gain 过大导致接触瞬间抖动,可通过降低 gain 或提高 damping 观察是否改善;四是忘记 end_force_mode(),后续位置运动异常。判断方法很直接:先看力控轴是否按预期方向运动,再看接触后力是否稳定在设定值附近,最后看退出后能否正常恢复位置控制。

建议在首次调试时把 force_mode_set_max_tcp_speed() 设得较小(如 0.03 m/s),并让机器人从距离工件 5~10 mm 处开始力控,观察接触瞬间的力变化,再逐步调整 gain 与 damping。

掌握以上指令、参数与安全配置后,就可以在 UR 脚本中构建可复现的柔顺装配动作。下一阶段将结合具体装配任务,讨论力控参数如何随工件材料、配合公差与插入深度进行整定。