import numpy as np import pinocchio from numpy.linalg import norm, solve model = pinocchio.buildSampleModelManipulator() data = model.createData() JOINT_ID = 6 oMdes = pinocchio.SE3(np.eye(3), np.array([1.0, 0.0, 1.0])) q = pinocchio.neutral(model) eps = 1e-4 IT_MAX = 1000 DT = 1e-1 damp = 1e-12 i = 0 while True: pinocchio.forwardKinematics(model, data, q) iMd = data.oMi[JOINT_ID].actInv(oMdes) err = pinocchio.log(iMd).vector # in joint frame if norm(err) < eps: success = True break if i >= IT_MAX: success = False break J = pinocchio.computeJointJacobian(model, data, q, JOINT_ID) # in joint frame J = -np.dot(pinocchio.Jlog6(iMd.inverse()), J) v = -J.T.dot(solve(J.dot(J.T) + damp * np.eye(6), err)) q = pinocchio.integrate(model, q, v * DT) if not i % 10: print(f"{i}: error = {err.T}") i += 1 if success: print("Convergence achieved!") else: print( "\n" "Warning: the iterative algorithm has not reached convergence " "to the desired precision" ) print(f"\nresult: {q.flatten().tolist()}") print(f"\nfinal error: {err.T}")