deep cleanup, probably broken

This commit is contained in:
Olivier R-D 2013-03-23 19:17:32 +01:00
parent 0c309a99dd
commit f8532d36b9
2 changed files with 62 additions and 119 deletions

View File

@ -297,7 +297,6 @@ class SecondaryMonitor(Thread):
with self._dictLock: with self._dictLock:
return self._dict.copy() return self._dict.copy()
def getJointData(self, wait=False): def getJointData(self, wait=False):
if wait: if wait:
self.wait() self.wait()

View File

@ -40,7 +40,7 @@ class URRobot(object):
programs are send to port 3002 programs are send to port 3002
data is read from secondary interface(10Hz?) and real-time interface(125Hz) (called Matlab interface in documentation) data is read from secondary interface(10Hz?) and real-time interface(125Hz) (called Matlab interface in documentation)
Since parsing the RT interface uses som CPU, and does not support all robots versions, it is disabled by default Since parsing the RT interface uses som CPU, and does not support all robots versions, it is disabled by default
The RT interfaces is only used for the getForce related methods The RT interfaces is only used for the get_force related methods
Rmq: A program sent to the robot i executed immendiatly and any running program is stopped Rmq: A program sent to the robot i executed immendiatly and any running program is stopped
""" """
def __init__(self, host, useRTInterface=False, logLevel=logging.WARN): def __init__(self, host, useRTInterface=False, logLevel=logging.WARN):
@ -75,28 +75,28 @@ class URRobot(object):
def __str__(self): def __str__(self):
return self.__repr__() return self.__repr__()
def isRunning(self): # legacy def is_running(self): # legacy
return self.secmon.running return self.secmon.running
def isProgramRunning(self): def is_program_running(self):
return self.secmon.isProgramRunning() return self.secmon.is_program_running()
def sendProgram(self, prog): def send_program(self, prog):
self.secmon.sendProgram(prog) self.secmon.send_program(prog)
def getTCPForce(self, wait=True): def get_tcp_force(self, wait=True):
""" """
return measured force in TCP return measured force in TCP
if wait==True, waits for next packet before returning if wait==True, waits for next packet before returning
""" """
return self.rtmon.getTCFForce(wait) return self.rtmon.getTCFForce(wait)
def getForce(self, wait=True): def get_force(self, wait=True):
""" """
length of force vector returned by getTCPForce length of force vector returned by get_tcp_force
if wait==True, waits for next packet before returning if wait==True, waits for next packet before returning
""" """
tcpf = self.getTCPForce( wait) tcpf = self.get_tcp_force( wait)
force = 0 force = 0
for i in tcpf: for i in tcpf:
force += i**2 force += i**2
@ -108,7 +108,7 @@ class URRobot(object):
""" """
self.movej(self.start_pose) self.movej(self.start_pose)
def setTcp(self, x=0, y=0, z=0, a=0, b=0, c=0): def set_tcp(self, x=0, y=0, z=0, a=0, b=0, c=0):
""" """
""" """
if type(x) in (list, tuple): if type(x) in (list, tuple):
@ -119,30 +119,30 @@ class URRobot(object):
else: else:
arg = (x, y, z, a, b, c) arg = (x, y, z, a, b, c)
prog = "set_tcp(p[%s, %s, %s, %s, %s, %s])" % arg prog = "set_tcp(p[%s, %s, %s, %s, %s, %s])" % arg
self.secmon.sendProgram(prog) self.secmon.send_program(prog)
def setPayload(self, weight): def set_payload(self, weight):
""" """
set payload in Kg set payload in Kg
""" """
prog = "set_payload(%s)" % weight prog = "set_payload(%s)" % weight
self.secmon.sendProgram(prog) self.secmon.send_program(prog)
def setGravity(self, vector): def set_gravity(self, vector):
""" """
set direction of gravity set direction of gravity
""" """
prog = "set_gravity(%s)" % list(vector) prog = "set_gravity(%s)" % list(vector)
self.secmon.sendProgram(prog) self.secmon.send_program(prog)
def sendMessage(self, msg): def send_message(self, msg):
""" """
send message to the GUI log tab on the robot controller send message to the GUI log tab on the robot controller
""" """
prog = "textmsg(%s)" % msg prog = "textmsg(%s)" % msg
self.secmon.sendProgram(prog) self.secmon.send_program(prog)
def setDigitalOut(self, output, val): def set_digital_out(self, output, val):
""" """
set digital output. val is a bool set digital output. val is a bool
""" """
@ -150,9 +150,9 @@ class URRobot(object):
val = "True" val = "True"
else: else:
val = "False" val = "False"
self.secmon.sendProgram('digital_out[%s]=%s' % (output, val)) self.secmon.send_program('digital_out[%s]=%s' % (output, val))
def getAnalogInputs(self): def get_analog_inputs(self):
""" """
get analog input get analog input
""" """
@ -160,21 +160,21 @@ class URRobot(object):
return data["MasterBoardData"]["analogInput0"], data["MasterBoardData"]["analogInput1"] return data["MasterBoardData"]["analogInput0"], data["MasterBoardData"]["analogInput1"]
def getAnalogInput(self, nb): def get_analog_in(self, nb):
""" """
get analog input get analog input
""" """
data = self.secmon.getAllData() data = self.secmon.getAllData()
return data["MasterBoardData"]["analogInput" + str(nb)] return data["MasterBoardData"]["analogInput" + str(nb)]
def getDigitalInputBits(self): def get_digital_inBits(self):
""" """
get digital output get digital output
""" """
data = self.secmon.getAllData() data = self.secmon.getAllData()
return data["MasterBoardData"]["digitalInputBits"] return data["MasterBoardData"]["digitalInputBits"]
def getDigitalInput(self, nb): def get_digital_in(self, nb):
""" """
get digital output get digital output
""" """
@ -203,20 +203,14 @@ class URRobot(object):
set analog output, val is a float set analog output, val is a float
""" """
prog = "set_analog_output(%s, %s)" % (output, val) prog = "set_analog_output(%s, %s)" % (output, val)
self.secmon.sendProgram(prog) self.secmon.send_program(prog)
def setToolVoltage(self, val): def setToolVoltage(self, val):
""" """
set voltage to be delivered to the tool, val is 0, 12 or 24 set voltage to be delivered to the tool, val is 0, 12 or 24
""" """
prog = "set_tool_voltage(%s)" % (val) prog = "set_tool_voltage(%s)" % (val)
self.secmon.sendProgram(prog) self.secmon.send_program(prog)
def movejrel(self, joints, acc=0.1, vel=0.05, wait=True):
"""
relative joint move
"""
self.movej(joints, acc, vel, wait, relative=True)
def movej(self, joints, acc=0.1, vel=0.05, wait=True, relative=False): def movej(self, joints, acc=0.1, vel=0.05, wait=True, relative=False):
""" """
@ -226,18 +220,27 @@ class URRobot(object):
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)]
prog = "movej(%s, a=%s, v=%s)" % (list(joints), acc, vel) prog = "movej(%s, a=%s, v=%s)" % (list(joints), acc, vel)
self.sendProgram(prog) self.send_program(prog)
if not wait: if not wait:
return None return None
else: else:
time.sleep(0.05)# it is important to sleep since robot may takes a while to get into running state self.wait_for_move()
while True: return self.getj()
if not self.isRunning():
raise RobotException("Robot stopped")
currentjoints = self.getj(wait=True)
if self._eq(currentjoints, joints) and not self.secmon.isProgramRunning():
return currentjoints
def wait_for_move(self):
time.sleep(0.05)# it is important to sleep since robot may takes a while to get into running state
while True:
if not self.is_running():
raise RobotException("Robot stopped")
jts = self.secmon.getJointData(wait=True)
finished = True
for i in range(0, 6):
if abs(jts["q_actual%s"%i] - jts["q_targets%s"%i]) > self.radialEpsilon:
finished = False
break
if finished and not self.secmon.is_program_running():
return
def getj(self, wait=False): def getj(self, wait=False):
""" """
get joints position get joints position
@ -245,13 +248,6 @@ class URRobot(object):
jts = self.secmon.getJointData(wait) jts = self.secmon.getJointData(wait)
return [jts["q_actual0"], jts["q_actual1"], jts["q_actual2"], jts["q_actual3"], jts["q_actual4"], jts["q_actual5"]] return [jts["q_actual0"], jts["q_actual1"], jts["q_actual2"], jts["q_actual3"], jts["q_actual4"], jts["q_actual5"]]
def movelrel(self, tpose, acc=0.01, vel=0.01, wait=True):
"""
relative linear move
"""
return self.movel(tpose, acc, vel, wait, relative=True)
def movel(self, tpose, acc=0.01, vel=0.01, wait=True, relative=False): def movel(self, tpose, acc=0.01, vel=0.01, wait=True, relative=False):
""" """
linear move linear move
@ -261,17 +257,12 @@ class URRobot(object):
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, 2) 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)
self.sendProgram(prog) self.send_program(prog)
if not wait: if not wait:
return None return None
else: else:
time.sleep(0.05)# it is important to sleep since robot may takes a while to get into running state self.wait_for_move()
while True: return self.getl()
if not self.isRunning():
raise RobotException("Robot stopped")
pose = self.getl(wait=True)
if self._eqpose(pose, tpose) and not self.secmon.isProgramRunning():
return pose
def getl(self, wait=False): def getl(self, wait=False):
""" """
@ -292,10 +283,10 @@ class URRobot(object):
raise NotImplementedError raise NotImplementedError
def stopl(self, acc = 0.5): def stopl(self, acc = 0.5):
self.sendProgram("stopl(%s)" % acc) self.send_program("stopl(%s)" % acc)
def stopj(self, acc = 1.5): def stopj(self, acc = 1.5):
self.sendProgram("stopj(%s)" % acc) self.send_program("stopj(%s)" % acc)
def stop(self): def stop(self):
self.stopj() self.stopj()
@ -333,31 +324,26 @@ class URRobot(object):
def set_freedrive(self, val): def set_freedrive(self, val):
if val: if val:
self.sendProgram("set robotmode freedrive") self.send_program("set robotmode freedrive")
else: else:
self.sendProgram("set robotmode run") self.send_program("set robotmode run")
def set_simulation(self, val): def set_simulation(self, val):
if val: if val:
self.sendProgram("set sim") self.send_program("set sim")
else: else:
self.sendProgram("set real") self.send_program("set real")
class Robot(object): class Robot(URRobot):
""" """
Generic Python interface to an industrial robot. Generic Python interface to an industrial robot.
Compare to the URRobot class, this class adds the possibilty to work directly with matrices Compare to the URRobot class, this class adds the possibilty to work directly with matrices
and includes support for calibrating the robot coordinate system and includes support for calibrating the robot coordinate system
and style portet to PEP 8
""" """
def __init__(self, host, useRTInterface=False, logLevel = logging.WARN): def __init__(self, host, useRTInterface=False, logLevel = logging.WARN):
self.robot = URRobot(host, useRTInterface, logLevel=logLevel) URRobot.__init__(self, host, useRTInterface, logLevel=logLevel)
self.logger = logging.getLogger(self.__class__.__name__)
if len(logging.root.handlers) == 0: #dirty hack
logging.basicConfig()
self.logger.setLevel(logLevel)
self.default_linear_acceleration = 0.01 self.default_linear_acceleration = 0.01
self.default_linear_velocity = 0.01 self.default_linear_velocity = 0.01
@ -365,10 +351,10 @@ class Robot(object):
self.inverse = self.calibration.inverse() self.inverse = self.calibration.inverse()
self.tracker = None self.tracker = None
def set_tcp(self, tcp): def set_tcp(self, x=0, y=0, z=0, a=0, b=0, c=0):
if type(tcp) == math3d.Transform: if type(x) == math3d.Transform:
tcp = tcp.pose_vector x = x.pose_vector
self.robot.setTcp(tcp) URRobot.set_tcp(self, x, y, z, a, b, c)
def set_calibration_matrix(self, matrix): def set_calibration_matrix(self, matrix):
self.calibration = matrix self.calibration = matrix
@ -393,16 +379,13 @@ class Robot(object):
trans = math3d.Transform(self.get_orientation(), math3d.Vector(vect)) trans = math3d.Transform(self.get_orientation(), math3d.Vector(vect))
return self.apply_transform(trans, acc, vel, wait) return self.apply_transform(trans, acc, vel, wait)
def stop(self):
self.robot.stop()
def apply_transform(self, trans, acc=None, vel=None, wait=True): def apply_transform(self, trans, acc=None, vel=None, wait=True):
if not acc: if not acc:
acc = self.default_linear_acceleration acc = self.default_linear_acceleration
if not vel: if not vel:
vel = self.default_linear_velocity vel = self.default_linear_velocity
t = self.calibration * trans t = self.calibration * trans
pose = self.robot.movel(t.pose_vector, acc, vel, wait) pose = URRobot.movel(self, t.pose_vector, acc, vel, wait)
if pose: #movel does not return anything when wait is False if pose: #movel does not return anything when wait is False
return self.inverse * math3d.Transform(pose) return self.inverse * math3d.Transform(pose)
@ -421,7 +404,7 @@ class Robot(object):
return self.apply_transform(pose * trans, acc, vel, wait) return self.apply_transform(pose * trans, acc, vel, wait)
def get_transform(self, wait=False): def get_transform(self, wait=False):
pose = self.robot.getl(wait) pose = URRobot.getl(self, wait)
trans = self.inverse * math3d.Transform(pose) trans = self.inverse * math3d.Transform(pose)
return trans return trans
@ -454,55 +437,16 @@ class Robot(object):
t = self.get_transform(wait) t = self.get_transform(wait)
return t.pose_vector return t.pose_vector
def is_running(self):
return self.robot.isRunning()
def is_program_running(self):
return self.robot.isProgramRunning()
def set_payload(self, weight):
return self.robot.setPayload(weight)
def set_gravity(self, vector): def set_gravity(self, vector):
if type(vector) == math3d.Vector: if type(vector) == math3d.Vector:
vector = vector.list vector = vector.list
return self.robot.setGravity(vector) return URRobot.set_gravity(self, vector)
def set_digital_out(self, output, val):
return self.robot.setDigitalOut(output, val)
def get_digital_out(self, nb):
self.robot.getDigitalOutput(nb)
def get_digital_in(self, nb):
return self.robot.getDigitalInput(nb)
def get_analog_in(self, nb):
return self.robot.getAnalogInput(nb)
def set_freedrive(self, val):
self.robot.set_freedrive(val)
def set_simulation(self, val):
self.robot.set_simulation(val)
def movej(self, joints, acc=0.1, vel=0.05, wait=True, relative=False):
"""
wrapper around the movej command in URRobot
"""
self.robot.movej(joints, acc, vel, wait, relative)
def getj(self, wait=False):
return self.robot.getj(wait)
def cleanup(self):
self.robot.cleanup()
def get_tracker(self): def get_tracker(self):
""" """
return an object able to track robot move for logging return an object able to track robot move for logging
""" """
t = tracker.Tracker(self.robot.host) t = tracker.Tracker(self.host)
t.set_calibration_matrix(self.calibration) t.set_calibration_matrix(self.calibration)
return t return t