UR机器人通讯接口总结
UR机器人公司的官网教程给出了UR机器人提供的通讯接口,如下图所示:
- Dashboard(29999) 接口是机器人人机界面进程负责维护和执行的一个端口。主要负责接收上位机指令,执行机器人初始化、加载程序、开始和暂停程序运行以及设置用户角色等操作,该接口主要应用在自动启动机器人,无示教器应用等场合。 接口接收上位机发送的Dashboard命令字符串,接收后,返回执行结果字符串。
- Primary& Secondary(30001& 30002) 接口由机器人控制进程维护和执行。开机后,机器人一直从这两个端口以10Hz频率对外发送机器人的状态信息。在接收到上位机发送的脚本指令字符串后会立即中断当前执行程序,然后运行接收到的脚本指令。一些具有返回值的脚本指令,其返回值并不会通过这两个端口返回,因为脚本的执行是在机器人控制进程中,其返回值只传递给该进程中的变量。
- Realtime (30003) 接口始终以125Hz的频率往外发送机器人的详细状态信息(位置,速度,关节电流,力矩等),同时也可以接收上位机发送的脚本指令并立即执行。
- RTDE (30004) 接口需由上位机进行配置,根据配置以125Hz的频率往外发送机器人的详细状态信息,机器人也只会接收配置的输入信息(IO,寄存器等)。与Realtime接口相比,RTDE接口不能接收脚本指令,只能接收配置好的输入信息;但是RTDE接口不会中断当前程序的执行,而且由于输入输出信息都是经过配置,传输的信息没有不需要的数据,可以按需启动和停止,能够大大降低对网络带宽的占用。
关于RTDE官方也给出了一个例程,但是似乎其中的连接实现是Socket实现的。(具体也没细看) - Socket 通讯是指机器人通过Socket相关脚本指令与上位机进行通讯的方式。
Socket接收的数据解析点击这篇博客
参考上述博客,本文提供了显示接收内容的Python代码:(需要其中特定内容可从字典中直接取出)
import socket
import struct
# import util
# import rtde
# import math
# import time
# import numpy as np
HOST = "xxx.xxx.xxx.xxx"
PORT = 30003
dic = {'MessageSize': 'i',
'Time': 'd',
'q target': '6d',
'qd target': '6d',
'qdd target': '6d',
'I target': '6d',
'M target': '6d',
'q actual': '6d',
'qd actual': '6d',
'I actual': '6d',
'I control': '6d',
'Tool vector actual': '6d',
'TCP speed actual': '6d',
'TCP force': '6d',
'Tool vector target': '6d',
'TCP speed target': '6d',
'Digital input bits': 'd',
'Motor temperatures': '6d',
'Controller Timer': 'd',
'Test value': 'd',
'Robot Mode': 'd',
'Joint Modes': '6d',
'Safety Mode': 'd',
'empty1': '6d',
'Tool Accelerometer values': '3d',
'empty2': '6d',
'Speed scaling': 'd',
'Linear momentum norm': 'd',
'SoftwareOnly': 'd',
'SoftwareOnly2': 'd',
'V main': 'd',
'V robot': 'd',
'I robot': 'd',
'V actual': '6d',
'Digital outputs': 'd',
'Program state': 'd',
'Elbow position': '3d',
'Elbow velocity': '3d'}
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.connect((HOST, PORT))
data = tcp_socket.recv(1108)
names = []
ii = range(len(dic))
for key, i in zip(dic, ii):
fmtsize = struct.calcsize(dic[key])
data1, data = data[0:fmtsize], data[fmtsize:]
fmt = "!"+dic[key]
names.append(struct.unpack(fmt, data1))
dic[key] = dic[key], struct.unpack(fmt, data1)
print(dic)
- XML-RPC通讯是一种通过XML格式传输结构化数据的协议,其优点在于传输的数据是结构化的,无需用户自己进行序列化和解析操作,例如从上位机传输float数据,机器人接收到后就已经是float类型了。目前XML-RPC库已支持多种语言,例如C++和Python。
- Modbus-TCP通讯既可以作为客户端也可以作为服务器。UR机器人作为客户端,只需配置好网络,然后使用相应的脚本即可。UR机器人作为服务器,可以提供机器人当前位置,速度等状态信息,也提供通用寄存器可用于互相通讯(例如相机将数据传输给机器人)。