系列文章目录
第一章 (已实现)基于Python语音控制(讯飞星火)UR机器人精确动作之获取UR机器人位置
第二章 (已实现)基于Python语音控制(讯飞星火)UR机器人精确动作之控制UR机器人精确运动
文章目录
前言
优傲机器人(Universal Robots)作为世界上第一款协作机器人,因其安全性、灵活性和易用性在工厂自动化的各类场景中得到广泛应用;更因其系统开发开放性在集成产品、教学科研和应用生态等领域占据优势。本文利用Python平台语音控制UR机器人,通过特定词语激活机器人运动功能,实现机器人前、后、左、右、上、下、绕X,绕Y、绕Z轴的准确运动。在本章节中,详细描述通过Python中通过socket通信获取机器人当前的工具TCP的坐标(x,y,z,rx,ry,rz,从而使得机器人实时更新当前位置,从而达到按照语音指令进行动作。
一、各种软硬版本
python:3.11版本
UR机器人:UR10系列
二、机器人实时端口3003通讯
想要实时获取机器人位置、速度、加速度等信息,要如何实现呢? 优傲机器人系统中有几类端口可以实现此功能:低频端口(30001 & 30002)、实时端口(30003)和定制端口(30004)
低频端口(30001 & 30002)以10Hz的频率向客户端发送固定格式的数据,机器人示教器和控制器间的通讯即通过此端口;
实时端口(30003)以最高125Hz(CB系列)或500Hz(E系列)向客户端发送固定格式的数据;
定制端口(30004)以定制化的频率(最高125Hz或500Hz)向客户端发送定制化的数据。
在本文中,只讲述如何对3003端口进行获取UR机器人的信息:
30003端口信息也由标头+内容组成,但该端口只有一个数据包,因此标头中只有数据包长度,无类型变量,以下为数据解析:
二、使用步骤
1.引入库
代码如下:
import socket
import struct # 数据解析用到
2.和机器人建立Socket连接
代码如下(示例):
HOST = '192.168.100.20' # ur机械臂ip地址,根据自己实际情况修改,在机器人端修改
PORT = 30003 # 端口,必须是30003
robot = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
robot.connect((HOST, PORT))
3.构造所有状态字的字典,从机器人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'}
data = robot.recv(1108) #从机器人30003获取所有的数据
names = []
#构造新的字典 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)
4.选取需要用到的机器人状态字
代码如下
在此项目中只需要获取当前TCP的位置,即name字典中Tool vector actual的数值
pose=dic['Tool vector actual'][1] #获取当前的机器人坐标
print("robot tcp is at: ", pose)
robot.close()
5.完整代码
import socket
import struct # 数据解析用到
def get_pose():
HOST = '192.168.100.20' # ur机械臂ip地址,根据自己实际情况修改
PORT = 30003 # 端口,必须是30003
robot = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
robot.connect((HOST, PORT))
#构造字典,前面为机器人的状态描述,后面根据上面数据解析图得到的数据类型
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 = robot.recv(1108) #从机器人30003获取所有的数据
names = []
#构造新的字典 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)
pose=dic['Tool vector actual'][1] #获取当前的机器人坐标
print("robot tcp is at: ", pose)
robot.close()
return pose
总结
本文只是基于Python语音控制(讯飞星火)UR机器人精确动作项目的第一步,获取机器人的实时位置,主要参考文章如下,在接下来为实现项目最终的成功,将继续更新其他技术,敬请期待,由于水平有限,不足之处请谅解。