svenzva_kinematics.py
Go to the documentation of this file.
1 import numpy
2 from math import cos, sin
3 import time
4 
5 
7 
8  NUM_JOINTS = 6
9  ERROR_BAD_FORMAT = -1
10  ERROR_NO_CONVERGE = -2
11  ERROR_SINGULAR = -3
12 
13  def __init__(self):
14  self.data = []
15  self.NUM_JOINTS = 6
16  self.T = numpy.zeros(shape=(6,6))
17  self.det = 1.0
18  """
19  Solves the analytical jacobian given the joint position array q_ar
20  Returns a numerical jacobian matrix
21  """
22  def solve_jacobian(self,q_ar):
23  if not isinstance(q_ar, numpy.ndarray) or len(q_ar) != self.NUM_JOINTS:
24  return SvenzvaKinematics.ERROR_BAD_FORMAT
25 
26  q1 = q_ar[0]
27  q2 = q_ar[1]
28  q3 = q_ar[2]
29  q4 = q_ar[3]
30  q5 = q_ar[4]
31  q6 = q_ar[5]
32  start = time.time()
33 
34  self.T[0][0] = sin(q1)*(-6.025E-3)-cos(q1)*cos(q2)*7.378496964862803E-19+cos(q1)*sin(q2)*2.662502E-1-cos(q4)*sin(q1)*2.31625E-2+sin(q1)*sin(q3)*2.743843197132029E-17-sin(q1)*sin(q4)*sin(q5)*1.4014E-1-cos(q1)*cos(q2)*cos(q4)*2.836588148525057E-18-cos(q1)*cos(q2)*sin(q3)*2.240518E-1+cos(q1)*cos(q3)*sin(q2)*2.240518E-1+cos(q3)*sin(q1)*sin(q4)*2.836588148525057E-18+cos(q5)*sin(q1)*sin(q3)*1.716220024325101E-17-cos(q1)*cos(q2)*cos(q3)*sin(q4)*2.31625E-2-cos(q1)*cos(q2)*cos(q5)*sin(q3)*1.4014E-1+cos(q1)*cos(q3)*cos(q5)*sin(q2)*1.4014E-1-cos(q1)*cos(q2)*sin(q4)*sin(q5)*1.716220024325101E-17-cos(q3)*cos(q4)*sin(q1)*sin(q5)*1.716220024325101E-17-cos(q1)*sin(q2)*sin(q3)*sin(q4)*2.31625E-2+cos(q1)*cos(q2)*cos(q3)*cos(q4)*sin(q5)*1.4014E-1+cos(q1)*cos(q4)*sin(q2)*sin(q3)*sin(q5)*1.4014E-1;
35  self.T[0][1] = sin(q1)*(cos(q2)*4.320156490763342E36+sin(q2)*1.197229581605184E19+cos(q2)*cos(q3)*3.635448304028355E36+cos(q4)*sin(q2)*4.60262741641993E19+sin(q2)*sin(q3)*3.635448304028355E36+sin(q2)*sin(q4)*sin(q5)*2.784726200268058E20+cos(q2)*cos(q3)*cos(q5)*2.273901505484596E36-cos(q2)*sin(q3)*sin(q4)*3.758330499556655E35+cos(q3)*sin(q2)*sin(q4)*3.758330499556655E35+cos(q5)*sin(q2)*sin(q3)*2.273901505484596E36+cos(q2)*cos(q4)*sin(q3)*sin(q5)*2.273901505484596E36-cos(q3)*cos(q4)*sin(q2)*sin(q5)*2.273901505484596E36)*6.162975822039155E-38;
36  self.T[0][2] = cos(q1)*cos(q3)*(-2.743843197132029E-17)-sin(q1)*sin(q2)*sin(q3)*2.240518E-1-cos(q1)*cos(q3)*cos(q5)*1.716220024325101E-17-cos(q2)*cos(q3)*sin(q1)*2.240518E-1+cos(q1)*sin(q3)*sin(q4)*2.836588148525057E-18-cos(q2)*cos(q3)*cos(q5)*sin(q1)*1.4014E-1-cos(q1)*cos(q4)*sin(q3)*sin(q5)*1.716220024325101E-17+cos(q2)*sin(q1)*sin(q3)*sin(q4)*2.31625E-2-cos(q3)*sin(q1)*sin(q2)*sin(q4)*2.31625E-2-cos(q5)*sin(q1)*sin(q2)*sin(q3)*1.4014E-1-cos(q2)*cos(q4)*sin(q1)*sin(q3)*sin(q5)*1.4014E-1+cos(q3)*cos(q4)*sin(q1)*sin(q2)*sin(q5)*1.4014E-1;
37  self.T[0][3] = cos(q1)*sin(q4)*(-2.31625E-2)-cos(q1)*cos(q3)*cos(q4)*2.836588148525057E-18+cos(q1)*cos(q4)*sin(q5)*1.4014E-1+cos(q2)*sin(q1)*sin(q4)*2.836588148525057E-18-cos(q2)*cos(q3)*cos(q4)*sin(q1)*2.31625E-2-cos(q2)*cos(q4)*sin(q1)*sin(q5)*1.716220024325101E-17-cos(q1)*cos(q3)*sin(q4)*sin(q5)*1.716220024325101E-17-cos(q4)*sin(q1)*sin(q2)*sin(q3)*2.31625E-2-cos(q2)*cos(q3)*sin(q1)*sin(q4)*sin(q5)*1.4014E-1-sin(q1)*sin(q2)*sin(q3)*sin(q4)*sin(q5)*1.4014E-1;
38  self.T[0][4] = cos(q1)*cos(q5)*sin(q4)*1.4014E-1+cos(q1)*sin(q3)*sin(q5)*1.716220024325101E-17+cos(q1)*cos(q3)*cos(q4)*cos(q5)*1.716220024325101E-17-cos(q2)*cos(q5)*sin(q1)*sin(q4)*1.716220024325101E-17+cos(q2)*sin(q1)*sin(q3)*sin(q5)*1.4014E-1-cos(q3)*sin(q1)*sin(q2)*sin(q5)*1.4014E-1+cos(q2)*cos(q3)*cos(q4)*cos(q5)*sin(q1)*1.4014E-1+cos(q4)*cos(q5)*sin(q1)*sin(q2)*sin(q3)*1.4014E-1;
39  self.T[1][0] = cos(q1)*6.025E-3+cos(q1)*cos(q4)*2.31625E-2-cos(q2)*sin(q1)*7.378496964862803E-19-cos(q1)*sin(q3)*2.743843197132029E-17+sin(q1)*sin(q2)*2.662502E-1-cos(q2)*cos(q4)*sin(q1)*2.836588148525057E-18-cos(q1)*cos(q3)*sin(q4)*2.836588148525057E-18-cos(q1)*cos(q5)*sin(q3)*1.716220024325101E-17-cos(q2)*sin(q1)*sin(q3)*2.240518E-1+cos(q3)*sin(q1)*sin(q2)*2.240518E-1+cos(q1)*sin(q4)*sin(q5)*1.4014E-1+cos(q1)*cos(q3)*cos(q4)*sin(q5)*1.716220024325101E-17-cos(q2)*cos(q3)*sin(q1)*sin(q4)*2.31625E-2-cos(q2)*cos(q5)*sin(q1)*sin(q3)*1.4014E-1+cos(q3)*cos(q5)*sin(q1)*sin(q2)*1.4014E-1-cos(q2)*sin(q1)*sin(q4)*sin(q5)*1.716220024325101E-17-sin(q1)*sin(q2)*sin(q3)*sin(q4)*2.31625E-2+cos(q2)*cos(q3)*cos(q4)*sin(q1)*sin(q5)*1.4014E-1+cos(q4)*sin(q1)*sin(q2)*sin(q3)*sin(q5)*1.4014E-1;
40  self.T[1][1] = cos(q1)*(cos(q2)*4.320156490763342E36+sin(q2)*1.197229581605184E19+cos(q2)*cos(q3)*3.635448304028355E36+cos(q4)*sin(q2)*4.60262741641993E19+sin(q2)*sin(q3)*3.635448304028355E36+sin(q2)*sin(q4)*sin(q5)*2.784726200268058E20+cos(q2)*cos(q3)*cos(q5)*2.273901505484596E36-cos(q2)*sin(q3)*sin(q4)*3.758330499556655E35+cos(q3)*sin(q2)*sin(q4)*3.758330499556655E35+cos(q5)*sin(q2)*sin(q3)*2.273901505484596E36+cos(q2)*cos(q4)*sin(q3)*sin(q5)*2.273901505484596E36-cos(q3)*cos(q4)*sin(q2)*sin(q5)*2.273901505484596E36)*(-6.162975822039155E-38);
41  self.T[1][2] = cos(q3)*sin(q1)*(-2.743843197132029E-17)+sin(q1)*sin(q3)*sin(q4)*2.836588148525057E-18+cos(q1)*cos(q2)*cos(q3)*2.240518E-1-cos(q3)*cos(q5)*sin(q1)*1.716220024325101E-17+cos(q1)*sin(q2)*sin(q3)*2.240518E-1+cos(q1)*cos(q2)*cos(q3)*cos(q5)*1.4014E-1-cos(q1)*cos(q2)*sin(q3)*sin(q4)*2.31625E-2+cos(q1)*cos(q3)*sin(q2)*sin(q4)*2.31625E-2+cos(q1)*cos(q5)*sin(q2)*sin(q3)*1.4014E-1-cos(q4)*sin(q1)*sin(q3)*sin(q5)*1.716220024325101E-17+cos(q1)*cos(q2)*cos(q4)*sin(q3)*sin(q5)*1.4014E-1-cos(q1)*cos(q3)*cos(q4)*sin(q2)*sin(q5)*1.4014E-1;
42  self.T[1][3] = sin(q1)*sin(q4)*(-2.31625E-2)-cos(q1)*cos(q2)*sin(q4)*2.836588148525057E-18-cos(q3)*cos(q4)*sin(q1)*2.836588148525057E-18+cos(q4)*sin(q1)*sin(q5)*1.4014E-1+cos(q1)*cos(q2)*cos(q3)*cos(q4)*2.31625E-2+cos(q1)*cos(q2)*cos(q4)*sin(q5)*1.716220024325101E-17+cos(q1)*cos(q4)*sin(q2)*sin(q3)*2.31625E-2-cos(q3)*sin(q1)*sin(q4)*sin(q5)*1.716220024325101E-17+cos(q1)*cos(q2)*cos(q3)*sin(q4)*sin(q5)*1.4014E-1+cos(q1)*sin(q2)*sin(q3)*sin(q4)*sin(q5)*1.4014E-1;
43  self.T[1][4] = sin(q1)*sin(q3)*sin(q5)*1.716220024325101E-17+cos(q5)*sin(q1)*sin(q4)*1.4014E-1+cos(q1)*cos(q2)*cos(q5)*sin(q4)*1.716220024325101E-17+cos(q3)*cos(q4)*cos(q5)*sin(q1)*1.716220024325101E-17-cos(q1)*cos(q2)*sin(q3)*sin(q5)*1.4014E-1+cos(q1)*cos(q3)*sin(q2)*sin(q5)*1.4014E-1-cos(q1)*cos(q2)*cos(q3)*cos(q4)*cos(q5)*1.4014E-1-cos(q1)*cos(q4)*cos(q5)*sin(q2)*sin(q3)*1.4014E-1;
44  self.T[2][1] = cos(q2)*(-7.378496964862803E-19)+sin(q2)*2.662502E-1-cos(q2)*cos(q4)*2.836588148525057E-18-cos(q2)*sin(q3)*2.240518E-1+cos(q3)*sin(q2)*2.240518E-1-sin(q2)*sin(q3)*sin(q4)*2.31625E-2-cos(q2)*cos(q3)*sin(q4)*2.31625E-2-cos(q2)*cos(q5)*sin(q3)*1.4014E-1+cos(q3)*cos(q5)*sin(q2)*1.4014E-1-cos(q2)*sin(q4)*sin(q5)*1.716220024325101E-17+cos(q2)*cos(q3)*cos(q4)*sin(q5)*1.4014E-1+cos(q4)*sin(q2)*sin(q3)*sin(q5)*1.4014E-1;
45  self.T[2][2] = cos(q2)*sin(q3)*2.240518E-1-cos(q3)*sin(q2)*2.240518E-1+sin(q2)*sin(q3)*sin(q4)*2.31625E-2+cos(q2)*cos(q3)*sin(q4)*2.31625E-2+cos(q2)*cos(q5)*sin(q3)*1.4014E-1-cos(q3)*cos(q5)*sin(q2)*1.4014E-1-cos(q2)*cos(q3)*cos(q4)*sin(q5)*1.4014E-1-cos(q4)*sin(q2)*sin(q3)*sin(q5)*1.4014E-1;
46  self.T[2][3] = sin(q2)*sin(q4)*2.836588148525057E-18+cos(q2)*cos(q4)*sin(q3)*2.31625E-2-cos(q3)*cos(q4)*sin(q2)*2.31625E-2-cos(q4)*sin(q2)*sin(q5)*1.716220024325101E-17+cos(q2)*sin(q3)*sin(q4)*sin(q5)*1.4014E-1-cos(q3)*sin(q2)*sin(q4)*sin(q5)*1.4014E-1;
47  self.T[2][4] = sin(q2)*sin(q3)*sin(q5)*1.4014E-1+cos(q2)*cos(q3)*sin(q5)*1.4014E-1-cos(q5)*sin(q2)*sin(q4)*1.716220024325101E-17-cos(q2)*cos(q4)*cos(q5)*sin(q3)*1.4014E-1+cos(q3)*cos(q4)*cos(q5)*sin(q2)*1.4014E-1;
48  self.T[3][1] = -cos(q1);
49  self.T[3][2] = cos(q1)-cos(q2)*sin(q1)*1.224646799147353E-16;
50  self.T[3][3] = cos(q1)*sin(q3)*1.224646799147353E-16+cos(q2)*sin(q1)*sin(q3)-cos(q3)*sin(q1)*sin(q2);
51  self.T[3][4] = -cos(q1)*cos(q4)+cos(q2)*cos(q4)*sin(q1)*1.224646799147353E-16+cos(q1)*cos(q3)*sin(q4)*1.224646799147353E-16+cos(q2)*cos(q3)*sin(q1)*sin(q4)+sin(q1)*sin(q2)*sin(q3)*sin(q4);
52  self.T[3][5] = sin(q5)*(cos(q1)*sin(q4)*4.056481920730334E31+cos(q1)*cos(q3)*cos(q4)*4.967757600021511E15-cos(q2)*sin(q1)*sin(q4)*4.967757600021511E15+cos(q2)*cos(q3)*cos(q4)*sin(q1)*4.056481920730334E31+cos(q4)*sin(q1)*sin(q2)*sin(q3)*4.056481920730334E31)*2.465190328815662E-32-cos(q5)*(cos(q1)*sin(q3)*4.967757600021511E15+cos(q2)*sin(q1)*sin(q3)*4.056481920730334E31-cos(q3)*sin(q1)*sin(q2)*4.056481920730334E31)*2.465190328815662E-32;
53  self.T[4][1] = -sin(q1);
54  self.T[4][2] = sin(q1)+cos(q1)*cos(q2)*1.224646799147353E-16;
55  self.T[4][3] = sin(q1)*sin(q3)*1.224646799147353E-16-cos(q1)*cos(q2)*sin(q3)+cos(q1)*cos(q3)*sin(q2);
56  self.T[4][4] = -cos(q4)*sin(q1)-cos(q1)*cos(q2)*cos(q4)*1.224646799147353E-16+cos(q3)*sin(q1)*sin(q4)*1.224646799147353E-16-cos(q1)*cos(q2)*cos(q3)*sin(q4)-cos(q1)*sin(q2)*sin(q3)*sin(q4);
57  self.T[4][5] = sin(q5)*(sin(q1)*sin(q4)*4.056481920730334E31+cos(q1)*cos(q2)*sin(q4)*4.967757600021511E15+cos(q3)*cos(q4)*sin(q1)*4.967757600021511E15-cos(q1)*cos(q2)*cos(q3)*cos(q4)*4.056481920730334E31-cos(q1)*cos(q4)*sin(q2)*sin(q3)*4.056481920730334E31)*2.465190328815662E-32-cos(q5)*(sin(q1)*sin(q3)*4.967757600021511E15-cos(q1)*cos(q2)*sin(q3)*4.056481920730334E31+cos(q1)*cos(q3)*sin(q2)*4.056481920730334E31)*2.465190328815662E-32;
58  self.T[5][0] = 1.0;
59  self.T[5][2] = sin(q2)*(-1.224646799147353E-16);
60  self.T[5][3] = cos(q2-q3);
61  self.T[5][4] = cos(q4)*sin(q2)*1.224646799147353E-16-cos(q2)*sin(q3)*sin(q4)+cos(q3)*sin(q2)*sin(q4);
62  self.T[5][5] = sin(q2)*sin(q4)*sin(q5)*(-1.224646799147353E-16)-cos(q2)*cos(q3)*cos(q5)-cos(q5)*sin(q2)*sin(q3)-cos(q2)*cos(q4)*sin(q3)*sin(q5)+cos(q3)*cos(q4)*sin(q2)*sin(q5);
63 
64  return 0
65 
66 
67 
68  """
69  input:
70  q_ar - numpyarray - [q0, ... qN] joint values for N joints
71  ee_vel - numpyarray - desired end effector velocity in Twist format, ie [X,Y,Z,R,P,Y]
72 
73  output:
74  joint velocity array
75  """
76  def get_joint_vel(self,q_ar, ee_vel):
77  err = self.solve_jacobian(q_ar)
78  if err != 0:
79  return SvenzvaKinematics.ERROR_BAD_FORMAT
80  if not isinstance(ee_vel, numpy.ndarray):
81  return SvenzvaKinematics.ERROR_BAD_FORMAT
82 
83  self.det = numpy.linalg.det(self.T)
84  if self.det != 0:
85  try:
86  R = numpy.linalg.inv(self.T).dot(ee_vel)
87  return R
88  except:
89  return SvenzvaKinematics.ERROR_SINGULAR
90  else:
91  return SvenzvaKinematics.ERROR_SINGULAR
92 
93  """
94  input:
95  q_ar - numpyarray - [q0, ... , qN] joint values for N joints
96  ee_vel - numpyarray - desired end effector velocity in Twist format
97  time_step - double - time step to determine future joint value
98  returns determinant of jacobian at the future joint position of the arm
99  """
100  def get_next_det(self, q_ar, ee_vel, time_step):
101  err = self.solve_jacobian(q_ar)
102  if err != 0:
103  return SvenzvaKinematics.ERROR_BAD_FORMAT
104  if not isinstance(ee_vel, numpy.ndarray):
105  return SvenzvaKinematics.ERROR_BAD_FORMAT
106 
107  q_dot = numpy.linalg.inv(self.T).dot(ee_vel)
108  for i, index in enumerate(q_ar):
109  q_ar[i] += q_dot[i]*time_step
110 
111  old_det = self.det
112  old_T = self.T
113  err = self.solve_jacobian(q_ar)
114  if err!= 0:
115  return SvenzvaKinematics.ERROR_BAD_FORMAT
116  res = numpy.linalg.det(self.T)
117  self.T = old_T
118  self.det = old_det
119 
120  return res
121 
122 
123 
124  def get_jacobian_det(self):
125  return self.det
126 
128  return numpy.linalg.det(self.T[2:5, 2:5])
129 
130 def test_case():
131  kine = SvenzvaKinematics()
132  q = numpy.array([0,0.2,0.2,0.2,0.2,0])
133  twist = numpy.array([0,0,0,1,0,0])
134  start = time.time()
135  print kine.get_joint_vel(q,twist)
136  print kine.get_jacobian_det()
137  end = time.time()
138  print "Took " + str(end - start) + "s"
139 
140 if __name__== "__main__":
141  test_case()


svenzva_drivers
Author(s): Max Svetlik
autogenerated on Wed Oct 28 2020 03:31:27