2. UR力控系统架构与通信接口
UR机器人的力控能力并不是一个孤立功能,而是由控制器内部的实时力控模块、机器人状态发布通道以及外部通信接口共同构成的完整体系。理解这套架构,是后续做柔顺装配参数整定、上位机集成和PLC联调的前提。本章从控制器内部功能模块出发,沿着力/力矩数据流一路讲到RTDE、Dashboard接口以及与上位机、PLC的集成方式。
一、控制器内部的力控功能模块
在UR控制柜(CB3/CB3.1及e-Series)中,与力控直接相关的功能模块可以分成四层:
- 伺服与关节力矩层:每个关节驱动器输出关节力矩,控制器通过动力学模型将其映射到TCP处的六维力/力矩(Fx、Fy、Fz、Tx、Ty、Tz)。这是力控的物理基础。
- 力/力矩传感器层:e-Series内置的FT传感器(或外置力传感器)提供原始六维力信号,采样率约500Hz~1kHz,经滤波、重力补偿和工具负载补偿后得到“净接触力”。
- 力控算法层:包括力模式(Force)、柔顺模式(Compliant)、力-位混合控制等。算法层接收目标力/刚度/阻尼参数,输出位置或速度修正量给轨迹规划器。
- 安全与限幅层:对力、力矩、TCP速度、功率进行实时限幅,触发保护性停止或回退,保证装配过程不损伤工件和机器人。
这四层在控制器内部以实时任务方式运行,周期通常在1~8ms量级。外部程序(URScript或上位机)只能通过接口修改参数和读取状态,不能直接干预实时环。
二、RTDE与Dashboard接口的分工
UR提供两类主要外部接口,用途截然不同:
| 接口 | 方向 | 典型周期 | 主要用途 |
|---|---|---|---|
| RTDE(Real-Time Data Exchange) | 双向 | 125Hz~500Hz | 实时读写力/力矩、TCP位姿、关节角、数字IO、力控参数 |
| Dashboard Server | 请求-响应 | 按需(秒级) | 加载程序、播放/暂停、查询机器人模式、设置用户角色 |
| Primary/Secondary Client | 双向 | 10Hz左右 | URScript下发、状态流、脚本级控制 |
做力控集成时,RTDE是主力通道:它支持“输入寄存器”和“输出寄存器”的订阅式配置,可以把actual_TCP_force、actual_TCP_pose、target_force等变量以固定周期推送给上位机,同时把上位机算出的力指令写回控制器。Dashboard则用于程序生命周期管理,例如在装配开始前加载force_assembly.urp,结束后停止程序。
三、力/力矩数据流
从传感器到上位机的完整数据流可以概括为:
- FT传感器采样原始六维力 → 控制器内部滤波与重力/负载补偿;
- 力控算法层计算净接触力,并与目标力比较,生成修正量;
- 修正量送入轨迹规划器,更新TCP目标位姿;
- 同时,
actual_TCP_force等变量被写入RTDE输出寄存器; - 上位机通过RTDE以125Hz读取,用于监控、记录或闭环修正;
- 上位机可将新的目标力/刚度写入RTDE输入寄存器,控制器在下一个实时周期生效。
这条链路的关键在于延迟:从传感器采样到上位机看到数据,典型延迟约8~20ms;从上位机写指令到机器人执行,再叠加一个控制周期。因此,上位机闭环适合做“慢修正”(如力阈值判断、装配阶段切换),而快速力跟踪必须交给控制器内部的力控算法。
四、与上位机或PLC的集成方式
实际项目中,力控集成通常有三种典型模式:
模式A:上位机主导(PC + RTDE)。上位机用Python的rtde_receive和rtde_control库建立连接,以125Hz读取actual_TCP_force,在装配插入阶段监测Fz是否超过阈值(例如15N),一旦超过就通过RTDE输入寄存器把目标力从20N降到10N,或触发阶段切换。这种模式灵活,适合研发和中小批量。
模式B:PLC主导(Profinet/EtherNet-IP)。UR控制器作为从站接入PLC,PLC通过现场总线读写UR的IO和寄存器。力数据需要先在UR程序中映射到模拟量输出或通过RTDE转发给网关。这种模式实时性受总线周期限制(通常4~10ms),适合产线级集成,但力控参数调整不如上位机灵活。
模式C:混合模式。PLC负责安全联锁、工位节拍和结果判定,上位机负责力数据记录和参数优化,两者通过OPC UA或共享数据库交换装配结果。这是目前汽车零部件装配线较常见的做法。
五、一个可参考的RTDE配置片段
下面是一个上位机读取力数据并写回目标力的最小示例(Python,ur_rtde库),参数为教学示例值:
import rtde_receive, rtde_control, time
rtde_r = rtde_receive.RTDEReceiveInterface("192.168.1.10")
rtde_c = rtde_control.RTDEControlInterface("192.168.1.10")
# 读取当前TCP力
force = rtde_r.getActualTCPForce() # [Fx,Fy,Fz,Tx,Ty,Tz]
print("Fz =", force[2])
# 写入目标力(示例:Z向目标力10N,刚度500N/m)
rtde_c.forceMode("tool0", [0,0,1,0,0,0], [0,0,10,0,0,0], 2, [500,500,500,50,50,50])
time.sleep(0.5)
rtde_c.forceModeStop()
运行后应观察到机器人沿Z向施加约10N的力,getActualTCPForce()的Fz读数在10N附近波动,波动幅度与刚度设置和接触面刚度有关。若Fz持续偏离目标值超过20%,应检查工具负载是否已正确设置、重力补偿是否生效。
总结来看,UR力控系统架构的核心是“控制器实时环负责快速力跟踪,RTDE负责实时数据交换,Dashboard负责程序管理,上位机/PLC负责慢速决策与集成”。把这条数据流和接口分工理清楚,后续的柔顺装配参数整定和异常排查就有了明确的着力点。