39 from urdf_parser_py.urdf
import URDF
40 from pykdl_utils.kdl_parser
import kdl_tree_from_urdf_model
43 while angle > math.pi:
44 angle = angle - 2.0*math.pi
45 while angle < -math.pi:
46 angle = angle + 2.0*M_PI
51 Kinematics solver (FK, IK) for Kuka LWR 4+ 66 self.
m_lim_lo = [-2.96, -2.09, -2.96, -2.095, -2.96, -2.09, -2.96]
67 self.
m_lim_up = [2.96, 2.09, 2.96, 2.095, 2.96, 2.09, 2.96]
74 Get some debug information after solving inverse kinematics. 76 @param key string: one of values: 'T_A0_A6d', 'pt_shoulder', 'elbow_pt'. 78 @return Value for the given key or None, if the key does not exist. 86 def __calcQ3(self, dist):
89 acos_val = (a**2 + b**2 - dist**2) / (2*a*b)
90 if abs(acos_val) <= 1.0:
91 return math.pi - math.acos( acos_val )
98 def __heronArea(self, a, b, c):
100 val = s*(s-a)*(s-b)*(s-c)
102 raise Exception(
'Square root of negative number: {} = {}*({}-{})*({}-{})*({}-{})'.format(val, s, s, a, s, b, s, c))
103 return math.sqrt(val)
105 def __calculateIkPart1(self, T_A0_A6d, elbow_circle_angle, flip_shoulder, flip_elbow):
107 pt_shoulder = PyKDL.Vector(0, 0, self.
__D)
108 dir_vec = T_A0_A6d.p - pt_shoulder;
109 dist = dir_vec.Norm()
113 return None,
None,
None,
None 116 height = area / (0.5*dist)
117 dist_a = math.sqrt( self.
__arm_len_a**2 - height**2 )
122 shoulder_vec = pt_shoulder - PyKDL.Vector()
124 nx = shoulder_vec * 1.0
130 shoulder_frame = PyKDL.Frame( PyKDL.Rotation(nx, ny, nz), pt_shoulder )
131 shoulder_frame_rot = shoulder_frame * PyKDL.Frame( PyKDL.Rotation.RotZ(elbow_circle_angle), PyKDL.Vector() )
132 elbow_pt = shoulder_frame_rot * PyKDL.Vector(height, 0, dist_a)
133 elbow_vec = elbow_pt - pt_shoulder
134 q0 = math.atan2(-elbow_pt.y(), -elbow_pt.x())
136 q1 = -math.atan2(math.sqrt(elbow_vec.x()**2 + elbow_vec.y()**2), elbow_vec.z())
141 nx = shoulder_vec * 1.0
148 T_A0_A2 = PyKDL.Frame( PyKDL.Rotation(nx, ny, nz), pt_shoulder )
150 dir_vec_A2 = T_A0_A2.Inverse().M * dir_vec_A0
151 q2 = math.atan2(-dir_vec_A2.y(), -dir_vec_A2.x())
165 self.
__debug[
'pt_shoulder'] = pt_shoulder
166 self.
__debug[
'elbow_pt'] = elbow_pt
177 return None,
None,
None,
None 180 return q0, q1, q2, q3
182 def __calculateIkPart2(self, T_A0_A7d, q0, q1, q2, q3, flip_ee):
193 nx = T_A0_A7d.M.UnitX()
194 ny = T_A0_A7d.M.UnitY()
195 nz = T_A0_A7d.M.UnitZ()
210 m02 = r13*((-s1*s3 + c1*c2*c3)*c4 + s2*s4*c1) + r23*((s1*c2*c3 + s3*c1)*c4 + s1*s2*s4) + r33*(-s2*c3*c4 + s4*c2)
211 m12 = r13*(-s1*c3 - s3*c1*c2) + r23*(-s1*s3*c2 + c1*c3) + r33*s2*s3
212 m20 = r11*(-(-s1*s3 + c1*c2*c3)*s4 + s2*c1*c4) + r21*(-(s1*c2*c3 + s3*c1)*s4 + s1*s2*c4) + r31*(s2*s4*c3 + c2*c4)
213 m21 = r12*(-(-s1*s3 + c1*c2*c3)*s4 + s2*c1*c4) + r22*(-(s1*c2*c3 + s3*c1)*s4 + s1*s2*c4) + r32*(s2*s4*c3 + c2*c4)
214 m22 = r13*(-(-s1*s3 + c1*c2*c3)*s4 + s2*c1*c4) + r23*(-(s1*c2*c3 + s3*c1)*s4 + s1*s2*c4) + r33*(s2*s4*c3 + c2*c4)
217 q6 = math.atan2(m21, -m20)
220 q4 = math.atan2(m12, m02)
223 q5 = math.atan2(m21, math.sin(q6)*m22)
240 return None,
None,
None 244 def calculateIk(self, T_A0_A7d, elbow_circle_angle, flip_shoulder, flip_elbow, flip_ee):
246 Calculate inverse kinematics (IK) for Kuka LWR 4+. 248 @param T_A0_A7d PyKDL.Frame: pose of the end-effector (the last link) wrt. the base of arm 250 @param elbow_circle_angle float: IK parameter. 251 @param flip_shoulder bool: IK parameter. 252 @param flip_elbow bool: IK parameter. 253 @param flip_ee bool: IK parameter. 255 @return 7-tuple: arm configuration or a tuple of Nones, if the solution does not exist. 259 T_A6_A7 = PyKDL.Frame(PyKDL.Rotation(), PyKDL.Vector(0, 0, self.
__A))
260 T_A7_A6 = T_A6_A7.Inverse()
261 T_A0_A6d = T_A0_A7d * T_A7_A6
262 self.
__debug[
'T_A0_A6d'] = T_A0_A6d
263 q0, q1, q2, q3 = self.
__calculateIkPart1(T_A0_A6d, elbow_circle_angle, flip_shoulder, flip_elbow)
265 return None,
None,
None,
None,
None,
None,
None 269 return None,
None,
None,
None,
None,
None,
None 271 return q0, q1, q2, q3, q4, q5, q6
275 Calculate inverse kinematics (IK) for Kuka LWR 4+. 277 @param T_A0_A7d PyKDL.Frame: pose of the end-effector (the last link) wrt. the base of arm 279 @param elbow_circle_angles list of float: list of values for IK parameter: elbow_circle_angle (@see calculateIk). 281 @return list of 7-tuples: arm configurations. 283 flips = [(
False,
False,
False), (
False,
False,
True), (
False,
True,
False),
284 (
False,
True,
True), (
True,
False,
False), (
True,
False,
True), (
True,
True,
False),
287 for elbow_circle_angle
in elbow_circle_angles:
288 for flip_shoulder, flip_elbow, flip_ee
in flips:
289 q = self.
calculateIk(T_A0_A7d, elbow_circle_angle, flip_shoulder, flip_elbow,
291 print(
'calculateIkSet: {}, {}, {}, {}'.format(elbow_circle_angle, flip_shoulder,
292 flip_elbow, flip_ee))
293 print(
' {}'.format(q))
295 solutions.append( q )
300 Calculate forward kinematics (FK) for Kuka LWR 4+. 302 @param q 7-tuple: arm configuration. 304 @return PyKDL.Frame: pose of the last link wrt. the first link of the arm. 358 e1 = (s4s6 + c4c5c6)*c7
359 e2 = (s4s6 + c4c5c6)*s7
360 e3 = (s4c5c6 - c4s6)*s7
361 e4 = (s4c5c6 - c4s6)*c7
362 e6 = (-A*s4c6 - B*s4 + A*c4c5s6)
363 e8 = (A*s4c5s6 + A*c4c6 + B*c4 + C)
364 e9 = e6*c2*c3 + e8*s2 + C*s2 - A*s3s5s6*c2
365 m00 = -((e1 - c4s5s7)*s3 + (s5c6c7 + c5s7)*c3)*s1 + ((e1 - c4s5s7)*c2*c3 + (e4 - s4*s5*s7)*s2 - (s5c6c7 + c5s7)*c2s3)*c1
366 m01 = -((-e2 - c4s5c7)*s3 + (-s5c6s7 + c5c7)*c3)*s1 + ((-e2 - c4s5c7)*c2*c3 + (-e3 - s4s5c7)*s2 - (-s5c6s7 + c5c7)*c2s3)*c1
367 m02 = -((-s4c6 + c4c5s6)*s3 + c3s5s6)*s1 + ((-s4c6 + c4c5s6)*c2*c3 + (s4c5s6 + c4c6)*s2 - s3s5s6*c2)*c1
368 m03 = -(e6*s3 + A*c3s5s6)*s1 + e9*c1
369 m10 = ((e1 - c4s5s7)*s3 + (s5c6c7 + c5s7)*c3)*c1 + ((e1 - c4s5s7)*c2*c3 + (e4 - s4*s5*s7)*s2 - (s5c6c7 + c5s7)*c2s3)*s1
370 m11 = ((-e2 - c4s5c7)*s3 + (-s5c6s7 + c5c7)*c3)*c1 + ((-e2 - c4s5c7)*c2*c3 + (-e3 - s4s5c7)*s2 - (-s5c6s7 + c5c7)*c2s3)*s1
371 m12 = ((-s4c6 + c4c5s6)*s3 + c3s5s6)*c1 + ((-s4c6 + c4c5s6)*c2*c3 + (s4c5s6 + c4c6)*s2 - s3s5s6*c2)*s1
372 m13 = (e6*s3 + A*c3s5s6)*c1 + e9*s1
373 m20 = -(e1 - c4s5s7)*s2c3 + (e4 - s4*s5*s7)*c2 + (s5c6c7 + c5s7)*s2*s3
374 m21 = -(-e2 - c4s5c7)*s2c3 + (-e3 - s4s5c7)*c2 + (-s5c6s7 + c5c7)*s2*s3
375 m22 = -(-s4c6 + c4c5s6)*s2c3 + (s4c5s6 + c4c6)*c2 + s2*s3s5s6
376 m23 = -e6*s2c3 + e8*c2 + A*s2*s3s5s6 + C*c2 + D
378 nx = PyKDL.Vector(m00, m10, m20)
379 ny = PyKDL.Vector(m01, m11, m21)
380 nz = PyKDL.Vector(m02, m12, m22)
381 return PyKDL.Frame( PyKDL.Rotation(nx, ny, nz), PyKDL.Vector(m03, m13, m23))
386 Kinematics solver (FK, IK) for WUT Velma robot 394 self.
__robot = URDF.from_parameter_server()
402 self.
__T_Er_Gr = PyKDL.Frame( PyKDL.Rotation.RPY(0, math.pi/2, 0), PyKDL.Vector(0.235, 0, -0.078) )
403 self.
__T_El_Gl = PyKDL.Frame( PyKDL.Rotation.RPY(0, -math.pi/2, 0), PyKDL.Vector(-0.235, 0, -0.078) )
404 self.
__T_Er_Pr = PyKDL.Frame( PyKDL.Rotation.RPY(0, math.pi/2, 0), PyKDL.Vector(0.115, 0, -0.078) )
405 self.
__T_El_Pl = PyKDL.Frame( PyKDL.Rotation.RPY(0, -math.pi/2, 0), PyKDL.Vector(-0.115, 0, -0.078) )
415 Calculate forward kinematics for shoulder. 417 @param side_str string: either 'left' or 'right'. 418 @param torso_angle float: angle of torso joint. 420 @return PyKDL.Frame: pose of the shoulder given by side_str. 423 if side_str ==
'left':
425 elif side_str ==
'right':
432 Calculate forward kinematics for left shoulder. 434 @param torso_angle float: angle of torso joint. 436 @return PyKDL.Frame: pose of the left shoulder. 439 return T_B_A * PyKDL.Vector(0, 0, 0.2005+0.11)
443 Calculate forward kinematics for right shoulder. 445 @param torso_angle float: angle of torso joint. 447 @return PyKDL.Frame: pose of the right shoulder. 450 return T_B_A * PyKDL.Vector(0, 0, 0.2005+0.11)
453 if side_str ==
'left':
455 elif side_str ==
'right':
458 raise Exception(
'Wrong side: "{}"'.format(side_str))
462 Calculate forward kinematics for left arm base. 464 @param torso_angle float: angle of torso joint. 466 @return PyKDL.Frame: pose of the left arm base. 468 T_B_AB = PyKDL.Frame()
469 q_kdl = PyKDL.JntArray(1)
470 q_kdl[0] = torso_angle
496 Calculate forward kinematics for right arm base. 498 @param torso_angle float: angle of torso joint. 500 @return PyKDL.Frame: pose of the right arm base. 503 T_B_AB = PyKDL.Frame()
504 q_kdl = PyKDL.JntArray(1)
505 q_kdl[0] = torso_angle
530 if side_str ==
'left':
532 elif side_str ==
'right':
535 raise Exception(
'Wrong side: "{}"'.format(side_str))
539 Calculate forward kinematics for left arm end-effector (the last link). 541 @param torso_angle float: angle of torso joint. 542 @param q 7-tuple: arm configuration. 544 @return PyKDL.Frame: pose of the left arm end-effector (the last link). 549 return T_B_AB * T_AB_E
553 Calculate forward kinematics for right arm end-effector (the last link). 555 @param torso_angle float: angle of torso joint. 556 @param q 7-tuple: arm configuration. 558 @return PyKDL.Frame: pose of the right arm end-effector (the last link). 562 return T_B_AB * T_AB_E
566 Get constant transformation from the left end-effector (the last link, frame 'E') to the left grasp frame 'G' in the center of the left gripper. 568 @return PyKDL.Frame: pose of frame 'G' wrt. frame 'E'. 574 Get constant transformation from the right end-effector (the last link, frame 'E') to the right grasp frame 'G' in the center of the right gripper. 576 @return PyKDL.Frame: pose of frame 'G' wrt. frame 'E'. 582 Get constant transformation from the the end-effector (the last link, frame 'E') to the grasp frame ('G', in the center of the gripper). 584 @param side_str str: either 'left' or 'right'. 586 @return PyKDL.Frame: pose of frame 'E' wrt. frame 'G'. 588 if side_str ==
'left':
590 elif side_str ==
'right':
593 raise Exception(
'Wrong side_str: "{}"'.format(side_str))
597 Get constant transformation from the left end-effector (the last link, frame 'E') to the left palm link (frame 'P'). 599 @return PyKDL.Frame: pose of frame 'P' wrt. frame 'E'. 605 Get constant transformation from the right end-effector (the last link, frame 'E') to the right palm link (frame 'P'). 607 @return PyKDL.Frame: pose of frame 'P' wrt. frame 'E'. 613 Get constant transformation from the end-effector (the last link, frame 'E') to the left palm link (frame 'P'). 615 @param side_str str: either 'left' or 'right'. 617 @return PyKDL.Frame: pose of frame 'P' wrt. frame 'E'. 619 if side_str ==
'left':
621 elif side_str ==
'right':
624 raise Exception(
'Wrong value for side_str: "{}", expected "left" or "right"'.format(
629 Inverse of velma_kinematics.velma_ik_geom.KinematicsSolverVelma.getLeft_T_E_G. 631 @return PyKDL.Frame: pose of frame 'E' wrt. frame 'G'. 637 Inverse of velma_kinematics.velma_ik_geom.KinematicsSolverVelma.getRight_T_E_G. 639 @return PyKDL.Frame: pose of frame 'E' wrt. frame 'G'. 645 Get constant transformation from the grasp frame 'G' in the center of the gripper to the end-effector (the last link, frame 'E'). 647 @param side_str str: either 'left' or 'right'. 649 @return PyKDL.Frame: pose of frame 'E' wrt. frame 'G'. 651 if side_str ==
'left':
653 elif side_str ==
'right':
656 raise Exception(
'Wrong side_str: "{}"'.format(side_str))
660 Inverse of velma_kinematics.velma_ik_geom.KinematicsSolverVelma.getLeft_T_E_P. 662 @return PyKDL.Frame: pose of frame 'E' wrt. frame 'P'. 668 Inverse of velma_kinematics.velma_ik_geom.KinematicsSolverVelma.getRight_T_E_P. 670 @return PyKDL.Frame: pose of frame 'E' wrt. frame 'P'. 675 flip_elbow, flip_ee):
677 Calculate inverse kinematics (IK) for WUT Velma robot for right arm. 680 return self.
calculateIkArm(
'right', T_B_W, torso_angle, elbow_circle_angle, flip_shoulder,
684 flip_elbow, flip_ee):
686 Calculate inverse kinematics (IK) for WUT Velma robot for left arm. 689 return self.
calculateIkArm(
'left', T_B_W, torso_angle, elbow_circle_angle, flip_shoulder,
692 def calculateIkArm(self, side_str, T_B_W, torso_angle, elbow_circle_angle, flip_shoulder,
693 flip_elbow, flip_ee):
695 Calculate inverse kinematics (IK) for WUT Velma robot arm. 697 @param side_str string: either 'left' or 'right'. 698 @param T_B_W PyKDL.Frame: pose of the end-effector (the last link) wrt. the robot base. 699 @param torso_angle float: angle of the torso joint. 700 @param elbow_circle_angle float: IK parameter. 701 @param flip_shoulder bool: IK parameter. 702 @param flip_elbow bool: IK parameter. 703 @param flip_ee bool: IK parameter. 705 @return 7-tuple: arm configuration or a tuple of Nones, if the solution does not exist. 707 assert isinstance(T_B_W, PyKDL.Frame)
708 assert isinstance(torso_angle, float)
709 assert isinstance(elbow_circle_angle, float)
711 T_A0_A7d = self.
getArmBaseFk(side_str, torso_angle).Inverse() * T_B_W
712 return self.
__ik_solver_lwr.calculateIk(T_A0_A7d, elbow_circle_angle, flip_shoulder,
717 @see KinematicsSolverLWR4.calculateIkSet 719 assert side_str
in (
'left',
'right')
720 assert isinstance(T_B_W, PyKDL.Frame)
721 assert isinstance(torso_angle, float)
723 T_A0_A7d = self.
getArmBaseFk(side_str, torso_angle).Inverse() * T_B_W
735 Kinematics solver (FK) for BarrettHand gripper 739 self.
__T_P_G = PyKDL.Frame( PyKDL.Vector(0, 0, 0.12) )
743 (
'_HandFingerThreeKnuckleTwoJoint',
744 '_HandPalmLink',
'_HandFingerThreeKnuckleTwoLink',
745 (-1.57079632679, 0, -1.57079632679), (0, -0.05, 0.0754), (0, 0, -1)),
746 (
'_HandFingerThreeKnuckleThreeJoint',
747 '_HandFingerThreeKnuckleTwoLink',
'_HandFingerThreeKnuckleThreeLink',
748 (0, 0, -0.690452252), (0.07, 0, 0), (0, 0, -1)),
749 (
'_HandFingerOneKnuckleOneJoint',
750 '_HandPalmLink',
'_HandFingerOneKnuckleOneLink',
751 (0, 0, 1.57079632679), (0.02497, 0, 0.0587966), (0, 0, -1)),
752 (
'_HandFingerOneKnuckleTwoJoint',
753 '_HandFingerOneKnuckleOneLink',
'_HandFingerOneKnuckleTwoLink',
754 (-1.57079632679, 0, 0), (0.05, 0, 0.0166034), (0, 0, -1)),
755 (
'_HandFingerOneKnuckleThreeJoint',
756 '_HandFingerOneKnuckleTwoLink',
'_HandFingerOneKnuckleThreeLink',
757 (0, 0, -0.690452252), (0.07, 0, 0), (0, 0, -1)),
758 (
'_HandFingerTwoKnuckleOneJoint',
759 '_HandPalmLink',
'_HandFingerTwoKnuckleOneLink',
760 (0, 0, 1.57079632679), (-0.02497, 0, 0.0587966), (0, 0, 1)),
761 (
'_HandFingerTwoKnuckleTwoJoint',
762 '_HandFingerTwoKnuckleOneLink',
'_HandFingerTwoKnuckleTwoLink',
763 (-1.57079632679, 0, 0), (0.05, 0, 0.0166034), (0, 0, -1)),
764 (
'_HandFingerTwoKnuckleThreeJoint',
765 '_HandFingerTwoKnuckleTwoLink',
'_HandFingerTwoKnuckleThreeLink',
766 (0, 0, -0.690452252), (0.07, 0, 0), (0, 0, -1)),
775 f0b = q[0] * 0.3333333
777 f1b = q[1] * 0.3333333
779 f2b = q[2] * 0.3333333
790 raise Exception(
'KinematicsSolverBarrettHand.calculateFK({}): '\
791 'Wrong number of joint angles'.format(q))
794 '_HandFingerOneKnuckleTwoJoint':f0a,
795 '_HandFingerOneKnuckleThreeJoint':f0b,
796 '_HandFingerTwoKnuckleTwoJoint':f1a,
797 '_HandFingerTwoKnuckleThreeJoint':f1b,
798 '_HandFingerThreeKnuckleTwoJoint':f2a,
799 '_HandFingerThreeKnuckleThreeJoint':f2b,
800 '_HandFingerOneKnuckleOneJoint':sp,
801 '_HandFingerTwoKnuckleOneJoint':sp,
804 fk = {
'_HandPalmLink':PyKDL.Frame()}
806 for joint_name, parent_link, child_link, joint_rpy, joint_xyz, joint_axis
in self.
__kin_parameters:
807 q = q_map[joint_name]
808 axis = PyKDL.Vector(joint_axis[0], joint_axis[1], joint_axis[2])
810 fk[child_link] = fk[parent_link] *\
811 PyKDL.Frame(PyKDL.Rotation.RPY(joint_rpy[0], joint_rpy[1], joint_rpy[2]),
812 PyKDL.Vector(joint_xyz[0], joint_xyz[1], joint_xyz[2])) *\
813 PyKDL.Frame(PyKDL.Rotation.Rot(axis, q))
816 for link_name, q
in fk.iteritems():
817 result[prefix+link_name] = q
Kinematics solver (FK) for BarrettHand gripper.
def getArmBaseFk(self, side_str, torso_angle)
def getRightArmShoulderPosition(self, torso_angle)
Calculate forward kinematics for right shoulder.
def getRight_T_E_P(self)
Get constant transformation from the right end-effector (the last link, frame 'E') to the right palm ...
def calculateFK(self, prefix, q)
def calculateIk(self, T_A0_A7d, elbow_circle_angle, flip_shoulder, flip_elbow, flip_ee)
Calculate inverse kinematics (IK) for Kuka LWR 4+.
def __init__(self)
Initialization.
def calculateIkSet(self, T_A0_A7d, elbow_circle_angles)
Calculate inverse kinematics (IK) for Kuka LWR 4+.
def getLeftArmBaseFk(self, torso_angle)
Calculate forward kinematics for left arm base.
def getLeft_T_E_P(self)
Get constant transformation from the left end-effector (the last link, frame 'E') to the left palm li...
def calculateIkLeftArm(self, T_B_Wr, torso_angle, elbow_circle_angle, flip_shoulder, flip_elbow, flip_ee)
Calculate inverse kinematics (IK) for WUT Velma robot for left arm.
def getRight_T_G_E(self)
Inverse of velma_kinematics.velma_ik_geom.KinematicsSolverVelma.getRight_T_E_G.
def getRightArmFk(self, torso_angle, q)
Calculate forward kinematics for right arm end-effector (the last link).
def getRight_T_P_E(self)
Inverse of velma_kinematics.velma_ik_geom.KinematicsSolverVelma.getRight_T_E_P.
def getArmFk(self, side_str, torso_angle, q)
def getLeftArmFk(self, torso_angle, q)
Calculate forward kinematics for left arm end-effector (the last link).
def calculateFk(self, q)
Calculate forward kinematics (FK) for Kuka LWR 4+.
def calculateIkSet(self, side_str, T_B_W, torso_angle, elbow_circle_angles)
def getT_G_E(self, side_str)
Get constant transformation from the grasp frame 'G' in the center of the gripper to the end-effector...
Kinematics solver (FK, IK) for WUT Velma robot.
def getLeftArmShoulderPosition(self, torso_angle)
Calculate forward kinematics for left shoulder.
def __calculateIkPart2(self, T_A0_A7d, q0, q1, q2, q3, flip_ee)
Kinematics solver (FK, IK) for Kuka LWR 4+.
def getT_E_P(self, side_str)
Get constant transformation from the end-effector (the last link, frame 'E') to the left palm link (f...
def calculateIkArm(self, side_str, T_B_W, torso_angle, elbow_circle_angle, flip_shoulder, flip_elbow, flip_ee)
Calculate inverse kinematics (IK) for WUT Velma robot arm.
def getLeft_T_P_E(self)
Inverse of velma_kinematics.velma_ik_geom.KinematicsSolverVelma.getLeft_T_E_P.
def __heronArea(self, a, b, c)
def getT_E_G(self, side_str)
Get constant transformation from the the end-effector (the last link, frame 'E') to the grasp frame (...
def getLeft_T_G_E(self)
Inverse of velma_kinematics.velma_ik_geom.KinematicsSolverVelma.getLeft_T_E_G.
def getRight_T_E_G(self)
Get constant transformation from the right end-effector (the last link, frame 'E') to the right grasp...
def getDebug(self, key)
Get some debug information after solving inverse kinematics.
def __init__(self)
Initialize.
def getLeft_T_E_G(self)
Get constant transformation from the left end-effector (the last link, frame 'E') to the left grasp f...
def __calculateIkPart1(self, T_A0_A6d, elbow_circle_angle, flip_shoulder, flip_elbow)
def calculateIkRightArm(self, T_B_W, torso_angle, elbow_circle_angle, flip_shoulder, flip_elbow, flip_ee)
Calculate inverse kinematics (IK) for WUT Velma robot for right arm.
def getArmShoulderPosition(self, side_str, torso_angle)
Calculate forward kinematics for shoulder.
def getRightArmBaseFk(self, torso_angle)
Calculate forward kinematics for right arm base.