Source code for rofunc.utils.robolab.kinematics.ik_dual

from __future__ import print_function

import numpy as np
from numpy.linalg import norm, solve

eps = 1e-4
eps_r = 1e-4
IT_MAX = 10000
DT = 1e-1
damp = 1e-12


[docs]def ik_dual(model, POSE_L, POSE_R, JOINT_ID_L, JOINT_ID_R): import pinocchio data = model.createData() oMdes_l = pinocchio.SE3(np.eye(3), np.array(POSE_L)) oMdes_r = pinocchio.SE3(np.eye(3), np.array(POSE_R)) q = pinocchio.neutral(model) i = 0 while True: pinocchio.forwardKinematics(model, data, q) dMi_l = oMdes_l.actInv(data.oMi[JOINT_ID_L]) err_l = pinocchio.log(dMi_l).vector dMi_r = oMdes_r.actInv(data.oMi[JOINT_ID_R]) err_r = pinocchio.log(dMi_r).vector if norm(err_l) < eps and norm(err_r) < eps_r: success = True break if i >= IT_MAX: success = False break J_l = pinocchio.computeJointJacobian(model, data, q, JOINT_ID_L) v_l = - J_l.T.dot(solve(J_l.dot(J_l.T) + damp * np.eye(6), err_l)) J_r = pinocchio.computeJointJacobian(model, data, q, JOINT_ID_R) v_r = - J_r.T.dot(solve(J_r.dot(J_r.T) + damp * np.eye(6), err_r)) q = pinocchio.integrate(model, q, 0.5 * v_l * DT + 0.5 * v_r * DT) if not i % 10: print('%d: error = %s' % (i, err_l.T)) print('%d: error = %s' % (i, err_r.T)) i += 1 if success: print("Convergence achieved!") else: print("\nWarning: the iterative algorithm has not reached convergence to the desired precision") q_ik_dual = np.append(0, np.delete(q, [1, 3, 5, 7])) i = 0 for name, value in zip(model.names, q_ik_dual): print(("{: .0f} {:<24} : {: .4f}" .format(i, name, value))) i += 1 print('\nresult: %s' % q_ik_dual.flatten().tolist()) print('\nfinal error: %s, %s' % (err_l.T, err_r.T)) return q_ik_dual
# if __name__ == '__main__': # model = pinocchio.buildModelFromUrdf( # "/home/ubuntu/Rofunc/rofunc/simulator/assets/urdf/curi/urdf/curi_pinocchio_test.urdf") # print('model name: ' + model.name) # POSE_L = [1, 0.5, 0.5] # POSE_R = [1, -0.5, 0.5] # q_rearrange = ik_dual(model, POSE_L, POSE_R, JOINT_ID_L=18, JOINT_ID_R=27) # a = q_rearrange.take( # [0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 21, 11, 13, 22, 23, 14, 15, 24, 16, 25, 26, 17, 18, 27, 19, 28]) # print('\nresult: %s' % a.flatten().tolist())