以UR5机器人为例,通过30003,30004端口实现不同的控制需求。本篇文章先针对30003端口。
1、通过socket与UR控制器建立通信连接
import socket
import struct
import math
import numpy as np
HOST = "192.168.2.23" # The remote host
PORT = 30003 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
2、解析30003端口的数据
30003端口为Realtime端口,UR5达到125hz,UR5e为500hz。端口数据的定义规则可参考UR官方Excel文档,截图如下。
UR5,版本为5.2,字节数共有1108个,首先,将字节所表示的名称和字节类型放入字典中:
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'}
按照字典中的格式解析,解析之后将解析的数据再放入字典中,代码如下:
data = s.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(names)
print(dic)
查看解析效果:查看6个关节“q actual”(关节角度值,弧度表示):
弧度转角度后,print。
a=dic["q actual"]
a2=np.array(a[1])
print(a2*180/math.pi)
结果如下:
[ -91.71335427 -98.9555408 -126.22260227 -46.29498985 91.3924979 -1.77616916]
本实验通过URsim模拟UR5,测试了可行性。URsim与上位机通信链接可参考如下:
https://download.csdn.net/download/seing128/11143127