第一章 (已实现)基于Python语音控制(讯飞星火)UR机器人精确动作之获取UR机器人位置

系列文章目录

第一章 (已实现)基于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机器人精确动作项目的第一步,获取机器人的实时位置,主要参考文章如下,在接下来为实现项目最终的成功,将继续更新其他技术,敬请期待,由于水平有限,不足之处请谅解。

UR机器人C语言和Python编程控制

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值