通过socket通讯控制ur机械臂

通过socket通讯控制ur机械臂

    • 1.socket客户端(连接机械臂)
    • 2.控制机械臂运动(发送控制指令)
    • 3. 实时

以前一直使用ros跟机械臂打交道,但在使用moveit控制机械臂运动的时候会出现一些卡顿现象,具体可参照这个网页,于是想通过ur指令直接来控制机械臂。

控制ur机械臂的指令有movel,movep,movej具体用处大家可以自己查查,这里我主要用的是movel,来控制机械臂的末端

1.socket客户端(连接机械臂)

HOST ='192.168.0.5'   //ur机械臂ip地址,根据自己实际情况修改
PORT = 30003			//端口,根据自己实际情况修改
ADDR = (HOST,PORT)
robot = socket(AF_INET,SOCK_STREAM)  
robot.connect(ADDR)

这里是ur端口的介绍,使用30003是因为可以通过接受urscript指令并返回机械臂当前信息来实时控制,这里是返回信息的解析

2.控制机械臂运动(发送控制指令)

str_command = "movel(p[%(x)s,%(y)s,%(z)s,%(rx)s,%(ry)s,%(rz)s],a=%(a)s,v=%(v)s,t=%(t)s)" %{'x':x,'y':y,'z':z,'rx':rx,'ry':ry,'rz':rz,'a':a,'v':v,'t':t}
robot.send(str_command + "\n")

这里需要注意的是一开我并没有使用控制指令中的t参数,这是一个很有用的参数,主要是用来规定让你的机械臂多久内到达指定位置,控制器会根据你给的值来进行路径优化,当然如果你设置的速度加速度太小,时间又太短,就会有卡顿现象,所以时间短的话,请将速度加速度调大。

3. 实时

如果你连续发送两条运动指令,会发现机械臂并没有走到第一个目标位置,中途就改变运动轨迹移到第二个目标位置,为了避免这种情况的发生,应该在发送指令后判断是否到达目标位置,才可发送下一条指令

while (True):
       try: 
           time.sleep(0.001)
           packet_1  = robot.recv(4)
           packet_2  = robot.recv(8)
           packet_3  = robot.recv(48)
           packet_4  = robot.recv(48)
           packet_5  = robot.recv(48)
           packet_6  = robot.recv(48)
           packet_7  = robot.recv(48) 
           packet_8  = robot.recv(48)
           packet_9  = robot.recv(48)
           packet_10 = robot.recv(48)
           packet_11 = robot.recv(48)
           
           #获取末端当前x坐标
           packet_12 = robot.recv(8)
           packet_12 = packet_12.encode("hex") #convert the data from \x hex notation to plain hex
           mx = str(packet_12)
           mx = struct.unpack('!d', packet_12.decode('hex'))[0]
           print "mx = ", round(mx ,4)
           
           #获取末端当前y坐标
           packet_13 = robot.recv(8)
           packet_13 = packet_13.encode("hex") #convert the data from \x hex notation to plain hex
           my = str(packet_13)
           my = struct.unpack('!d', packet_13.decode('hex'))[0]
           print "my = ", round(my ,4)
 		   
 		   #获取末端当前y坐标
           packet_14 = robot.recv(8)
           packet_14 = packet_14.encode("hex") #convert the data from \x hex notation to plain hex
           mz = str(packet_14)
           mz = struct.unpack('!d', packet_14.decode('hex'))[0]
           print "mz = ", round(mz ,4)
           
           #获取末端当前rx坐标
           packet_15 = robot.recv(8)
           packet_15 = packet_15.encode("hex") #convert the data from \x hex notation to plain hex
           mrx = str(packet_15)
           mrx = struct.unpack('!d', packet_15.decode('hex'))[0]
           print "mrx = ", round(mrx,3)
           
           #获取末端当前ry坐标
           packet_16 = robot.recv(8)
           packet_16 = packet_16.encode("hex") #convert the data from \x hex notation to plain hex
           mry = str(packet_16)
           mry = struct.unpack('!d', packet_16.decode('hex'))[0]
           print "mry = ", round(mry,3)
           
           #获取末端当前rz坐标
           packet_17 = robot.recv(8)
           packet_17 = packet_17.encode("hex") #convert the data from \x hex notation to plain hex
           mrz = str(packet_17)
           mrz = struct.unpack('!d', packet_17.decode('hex'))[0]
           print "mrz = ", round(mrz,3)

		   #精度控制,根据情况设置 toler_dist 
           if abs(round(mx,4) - round(x,4)) < toler_dist and abs(round(my,4) - round(y,4)) < toler_dist and abs(round(mz,4) - round(z,4)) < toler_dist:
               break

		   #注意:因为这里并没有把robot反馈的所有字节都获取,所以在进行下一次判断时应该关闭socket然后重新连接
           robot.close()
           # initRobot函数就是第一部分socket客户端的内容
           initRobot() 

这里是反馈信息的官方文档解释,因为不知道怎么修改下载积分,所以每积分的小伙伴可以去这里直接下载

欢迎大家指正与交流~~~~~

你可能感兴趣的:(机械臂)