1 """Simple demo of usage of ContactTwoFramePositions in TSID
2 Make the Talos gripper model works with closed kinematic chains
7 from pathlib
import Path
10 import pinocchio
as pin
12 from numpy.linalg
import norm
as norm
14 np.set_printoptions(precision=3, linewidth=200, suppress=
True)
17 print(
"".
center(LINE_WIDTH,
"#"))
19 " Demo of TSID with Closed Kinematic Chains via ContactTwoFramePositions".
center(
23 print(
"".
center(LINE_WIDTH,
"#"),
"\n")
40 filename = str(Path(__file__).resolve().parent)
41 path = filename +
"../../tsid_demo_closed_kinematic_chain/models/talos_gripper"
42 urdf = path +
"../../tsid_demo_closed_kinematic_chain/urdf/talos_gripper_half.urdf"
43 vector = pin.StdVec_StdString()
44 vector.extend(item
for item
in path)
46 robot = tsid.RobotWrapper(urdf, vector,
False)
49 robot_display = pin.RobotWrapper.BuildFromURDF(urdf, [path])
50 robot_display.initViewer(loadModel=
True)
53 q = np.zeros(robot.nq)
54 v = np.zeros(robot.nv)
56 viz = pin.visualize.MeshcatVisualizer(
58 robot_display.collision_model,
59 robot_display.visual_model,
61 viz.initViewer(loadModel=
True, open=
True)
65 invdyn.computeProblemData(t, q, v)
69 fingertip_name =
"gripper_left_fingertip_3_link"
70 H_fingertip_ref = robot.framePosition(invdyn.data(), model.getFrameId(fingertip_name))
72 fingertipPositionTask = tsid.TaskSE3Equality(
73 "task-fingertip-position", robot, fingertip_name
75 fingertipPositionTask.useLocalFrame(
False)
76 fingertipPositionTask.setKp(kp_ee * np.ones(6))
77 fingertipPositionTask.setKd(2.0 * np.sqrt(kp_ee) * np.ones(6))
78 trajFingertipPosition = tsid.TrajectorySE3Constant(
79 "traj-fingertip-position", H_fingertip_ref
81 sampleFingertipPosition = trajFingertipPosition.computeNext()
82 fingertipPositionTask.setReference(sampleFingertipPosition)
83 invdyn.addMotionTask(fingertipPositionTask, w_ee, 1, 0.0)
85 postureTask = tsid.TaskJointPosture(
"task-posture", robot)
86 postureTask.setKp(kp_posture * np.ones(robot.nv))
87 postureTask.setKd(2.0 * np.sqrt(kp_posture) * np.ones(robot.nv))
88 invdyn.addMotionTask(postureTask, w_posture, 1, 0.0)
92 ContactTwoFramePositionsFingertipBottomAxis = tsid.ContactTwoFramePositions(
93 "contact-two-frame-positions-fingertip-bottom-axis",
95 "gripper_left_motor_single_link_ckc_axis",
96 "gripper_left_fingertip_3_link_ckc_axis",
100 twoFramesContact_Kp = 300
101 ContactTwoFramePositionsFingertipBottomAxis.setKp(twoFramesContact_Kp * np.ones(3))
102 ContactTwoFramePositionsFingertipBottomAxis.setKd(
103 2.0 * np.sqrt(twoFramesContact_Kp) * np.ones(3)
106 twoFramesContact_w_forceRef = 1e-5
107 invdyn.addRigidContact(
108 ContactTwoFramePositionsFingertipBottomAxis, twoFramesContact_w_forceRef, 1.0, 1
112 tau_max = model.effortLimit[-robot.na :]
118 actuationBoundsTask = tsid.TaskActuationBounds(
"task-actuation-bounds", robot)
119 actuationBoundsTask.setBounds(tau_min, tau_max)
120 invdyn.addActuationTask(actuationBoundsTask, 1.0, 0, 0.0)
123 trajPosture = tsid.TrajectoryEuclidianConstant(
"traj_joint", q_ref)
126 "Create QP solver with ",
132 " inequality constraints",
134 solver = tsid.SolverHQuadProgFast(
"qp solver")
135 solver.resize(invdyn.nVar, invdyn.nEq, invdyn.nIn)
137 offset = sampleFingertipPosition.pos()
138 offset[:3] += np.array([0, -0.04, 0])
139 amp = np.array([0.0, 0.04, 0.0])
140 two_pi_f = 2 * np.pi * np.array([0.0, 0.5, 0.0])
141 two_pi_f_amp = np.multiply(two_pi_f, amp)
142 two_pi_f_squared_amp = np.multiply(two_pi_f, two_pi_f_amp)
150 time_start = time.time()
153 pEE[:3] = offset[:3] + amp * np.sin(two_pi_f * t)
154 vEE[:3] = two_pi_f_amp * np.cos(two_pi_f * t)
155 aEE[:3] = -two_pi_f_squared_amp * np.sin(two_pi_f * t)
156 sampleFingertipPosition.value(pEE)
157 sampleFingertipPosition.derivative(vEE)
158 sampleFingertipPosition.second_derivative(aEE)
160 fingertipPositionTask.setReference(sampleFingertipPosition)
162 samplePosture = trajPosture.computeNext()
163 postureTask.setReference(samplePosture)
166 HQPData = invdyn.computeProblemData(t, q, v)
170 sol = solver.solve(HQPData)
172 print(f
"[{i}] QP problem could not be solved! Error code:", sol.status)
175 tau = invdyn.getActuatorForces(sol)
176 dv = invdyn.getAccelerations(sol)
179 print(f
"Time {t:.3f}")
181 v_mean = v + 0.5 * dt * dv
183 q = pin.integrate(robot.model(), q, dt * v_mean)
186 if i % DISPLAY_N == 0:
189 time_spent = time.time() - time_start
191 time.sleep(dt - time_spent)