movels works

This commit is contained in:
Olivier R-D 2013-04-03 15:27:19 +02:00
parent c60db50c43
commit 83e2b7e164
2 changed files with 32 additions and 16 deletions

View File

@ -176,7 +176,7 @@ class ParserUtils(object):
self.logger.debug("Packet is not complete, advertised size is {0}, received size is {1}, type is {2}".format(psize, len(data), ptype)) self.logger.debug("Packet is not complete, advertised size is {0}, received size is {1}, type is {2}".format(psize, len(data), ptype))
return None return None
else: else:
self.logger.debug("data smaller than 5 bytes") #self.logger.debug("data smaller than 5 bytes")
return None return None
@ -185,11 +185,11 @@ class SecondaryMonitor(Thread):
""" """
Monitor data from secondary port and send programs to robot Monitor data from secondary port and send programs to robot
""" """
def __init__(self, host, logLevel=logging.WARN): def __init__(self, host, logLevel=logging.WARN, parserLogLevel=logging.WARN):
Thread.__init__(self) Thread.__init__(self)
self.logger = logging.getLogger(self.__class__.__name__) self.logger = logging.getLogger(self.__class__.__name__)
self.logger.setLevel(logLevel) self.logger.setLevel(logLevel)
self._parser = ParserUtils(logLevel) self._parser = ParserUtils(parserLogLevel)
self._s_secondary = None self._s_secondary = None
self._dict = {} self._dict = {}
self._dictLock = Lock() self._dictLock = Lock()
@ -213,7 +213,7 @@ class SecondaryMonitor(Thread):
""" """
with self._prog_queue_lock: with self._prog_queue_lock:
prog.strip() prog.strip()
self.logger.debug("Sending program: prog") self.logger.debug("Sending program: " + prog)
if type(prog) != bytes: if type(prog) != bytes:
prog = prog.encode() prog = prog.encode()
self._prog_queue.append(prog + b"\n") self._prog_queue.append(prog + b"\n")
@ -270,7 +270,7 @@ class SecondaryMonitor(Thread):
self._dataqueue = ans[1] self._dataqueue = ans[1]
return ans[0] return ans[0]
else: else:
self.logger.debug("Could not find packet in received data") #self.logger.debug("Could not find packet in received data")
tmp = self._s_secondary.recv(1024) tmp = self._s_secondary.recv(1024)
self._dataqueue += tmp self._dataqueue += tmp

View File

@ -51,7 +51,7 @@ class URRobot(object):
self.host = host self.host = host
self.logger.info("Opening secondary monitor socket") self.logger.info("Opening secondary monitor socket")
self.secmon = ursecmon.SecondaryMonitor(self.host, logLevel=logLevel) #data from robot at 10Hz self.secmon = ursecmon.SecondaryMonitor(self.host, logLevel=logLevel, parserLogLevel=logging.WARN) #data from robot at 10Hz
if useRTInterface: if useRTInterface:
self.logger.info("Opening real-time monitor socket") self.logger.info("Opening real-time monitor socket")
@ -62,6 +62,8 @@ class URRobot(object):
self.jointEpsilon = 0.05 # precision of joint movem used to wait for move completion self.jointEpsilon = 0.05 # precision of joint movem used to wait for move completion
self.linearEpsilon = 0.0005 # precision of linear movement, used to wait for move completion self.linearEpsilon = 0.0005 # precision of linear movement, used to wait for move completion
self.radialEpsilon = 0.05 # precision of radial movement, used to wait for move completion self.radialEpsilon = 0.05 # precision of radial movement, used to wait for move completion
#URScript is limited in the character length of floats it accepts
self.max_float_length = 6 # FIXME: check max length!!!
if useRTInterface: if useRTInterface:
self.rtmon.start() self.rtmon.start()
@ -212,7 +214,11 @@ class URRobot(object):
if relative: if relative:
l = self.getj() l = self.getj()
joints = [v + l[i] for i, v in enumerate(joints)] joints = [v + l[i] for i, v in enumerate(joints)]
joints = [round(j, self.max_float_length) for j in joints]
prog = "movej(%s, a=%s, v=%s)" % (list(joints), acc, vel) prog = "movej(%s, a=%s, v=%s)" % (list(joints), acc, vel)
joints.append(acc)
joints.append(vel)
prog = "movej([{},{},{},{},{},{}], a={}, v={})".format(*joints)
self.send_program(prog) self.send_program(prog)
if not wait: if not wait:
return None return None
@ -248,8 +254,11 @@ class URRobot(object):
if relative: if relative:
l = self.getl() l = self.getl()
tpose = [v + l[i] for i, v in enumerate(tpose)] tpose = [v + l[i] for i, v in enumerate(tpose)]
tpose = [round(i, 2) for i in tpose] tpose = [round(i, self.max_float_length) for i in tpose]
prog = "movel(p%s, a=%s, v=%s)" % (tpose, acc, vel) #prog = "movel(p%s, a=%s, v=%s)" % (tpose, acc, vel)
tpose.append(acc)
tpose.append(vel)
prog = "movel(p[{},{},{},{},{},{}], a={}, v={})".format(*tpose)
self.send_program(prog) self.send_program(prog)
if not wait: if not wait:
return None return None
@ -272,9 +281,9 @@ class URRobot(object):
Move Circular: Move to position (circular in tool-space) Move Circular: Move to position (circular in tool-space)
see UR documentation see UR documentation
""" """
pose = [round(i, 2) for i in pose] pose = [round(i, self.max_float_length) for i in pose]
pose_via = [round(i, 2) for i in pose_via] pose_via = [round(i, self.max_float_length) for i in pose_via]
pose_to = [round(i, 2) for i in pose_to] pose_to = [round(i, self.max_float_length) for i in pose_to]
prog = "movec(p%s, p%s, p%s, a=%s, v=%s)" % (pose, pose_via, pose_to, acc, vel) prog = "movec(p%s, p%s, p%s, a=%s, v=%s)" % (pose, pose_via, pose_to, acc, vel)
self.send_program(prog) self.send_program(prog)
if not wait: if not wait:
@ -283,7 +292,7 @@ class URRobot(object):
self.wait_for_move() self.wait_for_move()
return self.getl() return self.getl()
def movels(self, pose_list, acc, vel , radius, wait=True): def movels(self, pose_list, acc=0.01, vel=0.01 , radius=0.01, wait=True):
""" """
where pose_list is a list of pose. where pose_list is a list of pose.
several movel commands must be send as one program in order for radius blending to work. several movel commands must be send as one program in order for radius blending to work.
@ -292,12 +301,19 @@ class URRobot(object):
# can be implemented by sending a complete urscript program calling several movel in a row with a radius # can be implemented by sending a complete urscript program calling several movel in a row with a radius
header = "def myProg():\n" header = "def myProg():\n"
end = "end\n" end = "end\n"
template = "movel(p{}s, a={}, v={}, r={})\n" template = "movel(p[{},{},{},{},{},{}], a={}, v={}, r={})\n"
prog = header prog = header
for pose in pose_list: for idx, pose in enumerate(pose_list):
pose = [round(i, 2) for i in pose] pose = [round(i, self.max_float_length) for i in pose]
prog += template.format(pose, acc, vel, radius) pose.append(acc)
pose.append(vel)
if idx != (len(pose_list) -1 ):
pose.append(radius)
else:
pose.append(0)
prog += template.format(*pose)
prog += end prog += end
print(prog)
self.send_program(prog) self.send_program(prog)
if not wait: if not wait:
return None return None