289 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			289 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python
 | |
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| import sys, urx, math, time, math3d
 | |
| 
 | |
| IP = "129.241.187.119"
 | |
| #JOINTS_HOME = [5*math.pi/4, -3*math.pi/4, -3*math.pi/4, -math.pi/2, 3*math.pi/2, math.pi]
 | |
| #JOINTS_HOME = [math.pi/4, -3*math.pi/4, -3*math.pi/4, -math.pi/2, 3*math.pi/2, math.pi]
 | |
| JOINTS_HOME = [0, -3*math.pi/4, -3*math.pi/4, -math.pi/2, -math.pi/2, math.pi]
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| class RobotInitException(Exception):
 | |
|     pass
 | |
| 
 | |
| class UR5TestController(object):
 | |
| 
 | |
|     def __init__(self, ip, joint_init=None):
 | |
|         self.vel = 0.1
 | |
|         self.acc = 1.0
 | |
| 
 | |
|         try:
 | |
|             self.robot = urx.Robot(ip, useRTInterface=False)
 | |
|             if joint_init:
 | |
|                 self.robot.movej(joint_init, acc=0.1, vel=0.5, radius=0, wait=True, relative=False)
 | |
|             self.pose = self.robot.getl()
 | |
|         except Exception, e:
 | |
|             raise RobotInitException('Robot initiation failed: %s' % str(e))
 | |
|     
 | |
|     def test_csys(self, quadrant):
 | |
|         theta_c = math.pi*quadrant/2
 | |
|         pose = self.robot.getl()
 | |
|         
 | |
|         csys = math3d.Transform()
 | |
|         csys.orient.rotate_zb(theta_c)
 | |
|         self.robot.set_csys("csys", csys)
 | |
|         self.robot.movel(pose, acc=0.1, vel=0.5, radius=0, wait=True, relative=False)
 | |
| 
 | |
|         trans_base = self.robot.get_transform()
 | |
| 
 | |
| 
 | |
|         trans = math3d.Transform(trans_base) #deep copy
 | |
|         pos = pose[0:3]
 | |
|         trans.pos = math3d.Vector(pos[0]+0.1, pos[1], pos[2])
 | |
|         trans.orient.rotate_zb(math.pi/4)
 | |
| 
 | |
|         self.robot.movel(trans.pose_vector.tolist(), acc=0.1, vel=0.5, radius=0, wait=True, relative=False)
 | |
| 
 | |
| 
 | |
|     def table_quadrant_test(self, quadrant):
 | |
|         # quadrant = {0..3}
 | |
|         theta_c = math.pi*quadrant/2
 | |
|         r = 0.6
 | |
| 
 | |
|         joints0 = [theta_c, -3*math.pi/4, -3*math.pi/4, -math.pi/2, -math.pi/2, math.pi]
 | |
|         self.robot.movej(joints0, acc=0.1, vel=0.5, radius=0, wait=True, relative=False)
 | |
|         pose = self.robot.getl()
 | |
|         pose[0] = r*math.cos(theta_c)
 | |
|         pose[1] = r*math.sin(theta_c)
 | |
|         pose[2] = 0
 | |
|         self.robot.movel(pose, acc=0.1, vel=0.5, radius=0, wait=True, relative=False)
 | |
|         print ('q %.1f: ' % quadrant) + str([('%.3f' % i) for i in self.robot.getl()])
 | |
|         time.sleep(1)
 | |
| 
 | |
|     def table_end_poses(self):
 | |
|         joints0 = [0, -3*math.pi/4, -3*math.pi/4, -math.pi/2, -math.pi/2, math.pi]
 | |
|         self.robot.movej(joints0, acc=0.1, vel=0.5, radius=0, wait=True, relative=False)
 | |
|         print 'pose: ' + str(self.robot.getl())
 | |
|         time.sleep(1)
 | |
|         joints1 = [33*math.pi/16, -3*math.pi/4, -3*math.pi/4, -math.pi/2, 27*math.pi/16, math.pi]
 | |
|         self.robot.movej(joints1, acc=0.1, vel=0.5, radius=0, wait=True, relative=False)
 | |
|         print 'pose: ' + str(self.robot.getl())
 | |
| 
 | |
|     def table_quadrant_test2(self, quadrant):
 | |
|         # quadrant = {0..3}
 | |
|         theta_c = math.pi*quadrant/2
 | |
|         r = 0.6
 | |
| 
 | |
|         pose = self.robot.getl()
 | |
|         pose[0] = r*math.cos(theta_c)
 | |
|         pose[1] = r*math.sin(theta_c)
 | |
|         self.robot.movel(pose, acc=0.1, vel=0.5, radius=0, wait=True, relative=False)
 | |
|         print 'pose: ' + str(self.robot.getl())
 | |
|         time.sleep(1)
 | |
| 
 | |
| 
 | |
|     def test_circ_pose(self):
 | |
|         theta_via = math.pi*2.75/2
 | |
|         pose0 = [-0.424, -0.424, -0.097, -0.729, -1.761, 1.760]
 | |
|         posevia = [0.6*math.cos(theta_via), 0.6*math.sin(theta_via), -0.097, 0, 0, 0]
 | |
|         pose1 = [0.000, -0.600, -0.097, 0.000, 2.221, -2.221]
 | |
|         #pose1 = [0.424, -0.424, -0.097, -0.729, 1.760, -1.759]
 | |
| 
 | |
|         self.robot.movel(pose0, acc=0.1, vel=0.5, radius=0, wait=True, relative=False)
 | |
|         print 'Starting circular move...'
 | |
|         self.robot.movec(posevia, pose1, acc=0.1, vel=0.1, radius=0.1, wait=True)
 | |
|         time.sleep(1)
 | |
|         self.robot.movel(pose1, acc=0.1, vel=0.1, radius=0, wait=True)
 | |
|         
 | |
| 
 | |
|     def test_circ_pose2(self):
 | |
|         pose0 = [-0.424, -0.424, -0.097, -0.729, -1.761, 1.760]
 | |
|         posevia = [0.424, -0.424, -0.097, -0.729, 1.760, -1.759]
 | |
|         #posevia = [0.000, -0.600, -0.097, 0.000, 2.221, -2.221]
 | |
|         pose1 = [0.424, 0.424, -0.097, -1.482, 0.614, -0.613]
 | |
|         #pose1 = [0.424, -0.424, -0.097, -0.729, 1.760, -1.759]
 | |
| 
 | |
|         self.robot.movel(pose0, acc=0.1, vel=0.5, radius=0, wait=True, relative=False)
 | |
|         print 'Starting circular move...'
 | |
|         self.robot.movec(posevia, pose1, acc=0.1, vel=0.1, radius=0, wait=True)
 | |
|         time.sleep(1)
 | |
|         self.robot.movel(pose1, acc=0.1, vel=0.1, radius=0, wait=True)
 | |
| 
 | |
|     def test_axes(self, axis):
 | |
|         dist = 0.6
 | |
| 	pose = self.robot.getl()
 | |
| 	pose[0] = dist
 | |
|         pose[1] = dist	
 | |
| 
 | |
|         if axis == 'x':
 | |
|             pose[1] = 0
 | |
|             #pose[2] = 0
 | |
| 
 | |
|             _theta = math.pi/2
 | |
|             pose[3] = math.pi/2
 | |
|             pose[4] = math.pi
 | |
|             pose[5] = 0
 | |
| #pose:[0.5921354182317952, 0.00589012470721734, -0.0973002219692428, -1.4823549412900907, 0.614936708121804, -0.6137840711781131]
 | |
| 
 | |
|         elif axis == 'y':
 | |
|             pose[0] = 0	
 | |
|         self.robot.movel(pose, acc=0.1, vel=0.1, wait=True)
 | |
|         print 'pose: ' + str(self.robot.getl())
 | |
|         time.sleep(2)
 | |
| 	
 | |
| 
 | |
|     def test_circ(self):
 | |
|         pose0 = self.robot.getl()
 | |
|         pose1 = [i for i in pose0]
 | |
|         posevia = [i for i in pose0]
 | |
| 
 | |
|         r = 0.4
 | |
|         t0 = 9*math.pi/8
 | |
|         t1 = 13*math.pi/8
 | |
|         tvia = t0 + (t1-t0) / 2
 | |
| 
 | |
|         pose0[0] = r*math.cos(t0)
 | |
|         pose0[1] = r*math.sin(t0)
 | |
|         self.robot.movel(pose0, acc=0.1, vel=0.1, wait=True)
 | |
|         
 | |
|         print 'pose: ' + str(pose0)
 | |
|         print 'starting circular move'
 | |
|         posevia[0] = r*math.cos(tvia)
 | |
|         posevia[1] = r*math.sin(tvia)
 | |
|         pose1[0] = r*math.cos(t1)
 | |
|         pose1[1] = r*math.sin(t1)
 | |
|         self.robot.movec(posevia, pose1, acc=0.1, vel=0.1, wait=True)
 | |
|         print 'pose: ' + str(pose1)
 | |
| 
 | |
| 
 | |
|     def test_speedl(self):
 | |
| 
 | |
|         n = 100
 | |
|         vel = 0.08
 | |
|         dtheta = 4*math.pi/n
 | |
|         vels = [(-vel*math.sin(i*dtheta), vel*math.cos(i*dtheta), 0, 0, 0, 0)
 | |
|                  for i in range(n)]
 | |
| 
 | |
|         dt = 0.3
 | |
|         for v in vels:
 | |
|             self.robot.speedl(v, 0.7, dt)
 | |
|             time.sleep(dt)
 | |
| 
 | |
|     def test_movel(self):
 | |
|         n = 10
 | |
|         dt = 0.5
 | |
| 
 | |
|         pose = self.robot.getl()
 | |
|         pose[0] -= 0.1*math.sin(0)
 | |
|         pose[1] += 0.1*math.cos(1)
 | |
|         self.robot.movel(pose, acc=0.1, vel=0.1, radius=0, wait=False)
 | |
|         time.sleep(dt)
 | |
|         for i in range(1, n):
 | |
|             pose = self.robot.getl()
 | |
|             pose[0] -= math.sin(math.pi*i/n)
 | |
|             pose[1] += math.cos(math.pi*i/n)
 | |
|             self.robot.movel(pose, acc=1, vel=0.1, radius=0.1, wait=False)
 | |
|             time.sleep(dt)
 | |
|         self.robot.stopl(0.2)
 | |
| 
 | |
| 
 | |
|     def test_servoj(self):
 | |
|         j0 = self.robot.getj()
 | |
|         dtheta = math.pi/4
 | |
|         j_incr = [dtheta]*6
 | |
| 
 | |
|         j = [i+math.pi/3 for i in j0]
 | |
|         prog = "servoj([{},{},{},{},{},{}])".format(*j)
 | |
|         self.robot.send_program(prog)        
 | |
|         time.sleep(2)
 | |
|         return
 | |
| 
 | |
|         j = j0
 | |
|         for i in range(10):
 | |
|             j = map(sum, zip(j, j_incr))
 | |
|             prog = "servoj([{},{},{},{},{},{}])".format(*j)
 | |
|             self.robot.send_program(prog)
 | |
|             time.sleep(0.5)
 | |
| 
 | |
| 
 | |
|     def velocity_control(self):
 | |
|         if vels == None:
 | |
|             n = 20
 | |
|             vel = 0.05
 | |
|             dtheta = math.pi/n
 | |
|             vels = [(-vel*math.sin(i*dtheta), vel*math.cos(i*dtheta), 0, 0, 0, 0)
 | |
|                      for i in range(n)]
 | |
| 
 | |
|     def test_circle(self):
 | |
|         pass
 | |
| 
 | |
| 
 | |
|     def follow_path(self, path):
 | |
|         pass
 | |
| 
 | |
| 
 | |
|     def move(self, vec):
 | |
|         # check internal states
 | |
|         # update pose etc
 | |
|         self.pose = self.robot.getl()
 | |
|         self.pose[0] += vec[0]
 | |
|         self.pose[1] += vec[1]
 | |
|         self.pose[2] += vec[2]
 | |
| 
 | |
|         if sum(map(abs, vec)) > 0:
 | |
|             self.robot.movel(self.pose, acc=self.acc, vel=self.vel, radius=0.1, wait=False)
 | |
|         else:
 | |
|             self.robot.stopl(self.stop_acc)
 | |
| 
 | |
|     def get_tcp_force(self):
 | |
|         return self.robot.get_tcp_force(wait=False)
 | |
| 
 | |
|     def get_2dvec_out(self):
 | |
|         # Vector outwards from the robot in (x, y) coordinates
 | |
|         theta_d = 0.02
 | |
|         j1 = self.robot.getj()
 | |
|         j2 = [theta+theta_d if i==1 else theta for i,theta in enumerate(j1)]
 | |
|         p1 = self.robot.getl()
 | |
| 
 | |
|         # Make a small move outwards and inwards
 | |
|         self.robot.movej(j2, acc=0.1, vel=0.5, radius=0, wait=True)
 | |
|         p2 = self.robot.getl()
 | |
|         self.robot.movej(j1, acc=0.1, vel=0.5, radius=0, wait=True)
 | |
|         return (p1[0]-p2[0], p1[1]-p2[1])
 | |
| 
 | |
|     def cleanup(self):
 | |
|         self.robot.cleanup()
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     controller = None
 | |
|     try:
 | |
|         controller = UR5TestController(IP, joint_init=JOINTS_HOME)
 | |
|         controller.test_csys(1)
 | |
|         #controller.test_circ_pose()
 | |
|         #controller.test_circ_pose2()
 | |
|         #controller.table_end_poses()
 | |
|         #controller.table_quadrant_test(0)
 | |
|         #controller.table_quadrant_test(0)
 | |
|         #controller.table_quadrant_test(0.5)
 | |
|         #controller.table_quadrant_test(1)
 | |
|         #controller.table_quadrant_test(1.5)
 | |
|         #controller.table_quadrant_test(2)
 | |
|         #controller.table_quadrant_test(2.5)
 | |
|         #controller.table_quadrant_test(3)
 | |
|         #controller.table_quadrant_test(3.5)
 | |
|         #controller.test_circ()
 | |
|         #controller.test_axes('x')
 | |
|         #controller.test_axes('dummy')
 | |
|         #controller.test_axes('y')
 | |
|         #controller.test_speedl()
 | |
|         #controller.test_servoj()
 | |
|         #controller.test_movel()
 | |
|     except Exception, e:
 | |
|         print e
 | |
| 
 | |
|     if controller:
 | |
|         controller.cleanup()
 |