UR机器人通信--上位机通信(python)

一、通信socket

socket()函数

Python 中,我们用 socket()函数来创建套接字,语法格式如下:

socket.socket([family[, type[, proto]]])

参数

  • family: 套接字家族可以使AF_UNIX或者AF_INET
  • type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAMSOCK_DGRAM
  • protocol: 一般不填默认为0.

 

二、ur接口(30001&30002)

Primary & Secondary 接口由机器人控制进程维护和执行的端口。 开机后,机器人
一直从这两个端口以 10Hz 频率对外发送机器人的状态信息(机器人位置, IO,运行状
态等), 除此之外 Primary 端口还会发送一些全局变量更新等信息。因此如果需要编写
上位机在线编程以及运行监视, 例如编写一个类似示教器界面的上位机程序时可以使
Primary 端口(当然对于加载程序,运行程序等操作需要使用 Dashboard29999
接口)。
Primary & Secondary 接口在接收到上位机发送的脚本指令(脚本指令下载) 字符
串后会立即中断当前执行程序(如果机器人正在运行), 然后运行接收到的脚本指令
值得提醒的是,一些具有返回值的脚本指令,其返回值并不会通过这两个端口返回,因
为脚本的执行是在机器人控制进程中,其返回值只传递给该进程中的变量。
如果想一次性发送一段程序给机器人,需要将发送的程序按照如下格式发送:

_________________________________________

def functionName():
脚本指令
脚本指令
脚本指令
#对于函数或者 while 等结构语句
#需注意同层次具有相同缩进
脚本指令
……
end

**********************************************************

 

sec functionName():
非运动脚本指令
非运动脚本指令
非运动脚本指令
#对于函数或者 while 等结构语句
#需注意同层次具有相同缩进
非运动脚本指令
……
end

_______________________________________________

实际发送字符串(缩进用空格,换行用\n):
“def functionName():\n 脚本指令\n 脚本指令\n ……\nend\n “
“sec functionName():\n 脚本指令\n 脚本指令\n ……\nend\n “

________________________________________________

三、move 命令

移动命令分为moveJ、movel等,这两个是比较常见的,只是移动方式不同,J是指移动两点之间时按最快原则,路线不一定是直线,而L的话,则两点间移动必须是直线的;命令内部,带p关键字的是坐标移动,输入的内容为坐标值:

     movej(p[239.7/1000, -54/1000, 336/1000, 2.18, -2.235, 0], a = 0.1, v = 0.1)

由于其xyz单位为米,所以如果输入示教器相同的数据时,需要除以1000转换成米。

不带p时候,表示为轴移动,控制的是各个轴的角度
      movej([d2r(-14),d2r(-64),d2r(-114),d2r(-94),d2r(87),d2r(158)],a=0.5, v=0.5)
 其中d2r()为ur的脚本,把输入角度转换为弧度,因为这个接口的参数是弧度。

四、发送指令控制机器人

import socket
target_ip = ("169.254.5.2" , 30001)
print("start")
sk = socket.socket()
sk.connect(target_ip)
send_data1 = 'def svt():\n movej(p[0.4,0.4,0.4,3.14,-1.57,1.57],a=1.4, v=1.05, t=0, r=0)\nend\n'
sk.send(send_data1.encode('utf8'))
print("end")
sk.close()

 

posted on 2019-08-06 10:53  coofe  阅读(3547)  评论(3编辑  收藏  举报