以前一直使用ros跟机械臂打交道,但在使用moveit控制机械臂运动的时候会出现一些卡顿现象,具体可参照这个网页,于是想通过ur指令直接来控制机械臂。
控制ur机械臂的指令有movel,movep,movej具体用处大家可以自己查查,这里我主要用的是movel,来控制机械臂的末端
HOST ='192.168.0.5' //ur机械臂ip地址,根据自己实际情况修改
PORT = 30003 //端口,根据自己实际情况修改
ADDR = (HOST,PORT)
robot = socket(AF_INET,SOCK_STREAM)
robot.connect(ADDR)
这里是ur端口的介绍,使用30003是因为可以通过接受urscript指令并返回机械臂当前信息来实时控制,这里是返回信息的解析
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参数,这是一个很有用的参数,主要是用来规定让你的机械臂多久内到达指定位置,控制器会根据你给的值来进行路径优化,当然如果你设置的速度加速度太小,时间又太短,就会有卡顿现象,所以时间短的话,请将速度加速度调大。
如果你连续发送两条运动指令,会发现机械臂并没有走到第一个目标位置,中途就改变运动轨迹移到第二个目标位置,为了避免这种情况的发生,应该在发送指令后判断是否到达目标位置,才可发送下一条指令
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()
这里是反馈信息的官方文档解释,因为不知道怎么修改下载积分,所以每积分的小伙伴可以去这里直接下载
欢迎大家指正与交流~~~~~