1 import pinocchio
as pin
7 from os.path import dirname, join, abspath
14 pinocchio_model_dir = join(dirname(dirname(str(abspath(__file__)))),
"models")
18 pinocchio_model_dir = join(dirname(dirname(str(abspath(__file__)))),
"models")
20 model_path = join(pinocchio_model_dir,
"example-robot-data/robots")
21 mesh_dir = pinocchio_model_dir
22 urdf_filename =
"talos_reduced.urdf"
23 urdf_model_path = join(join(model_path,
"talos_data/robots"), urdf_filename)
24 srdf_filename =
"talos.srdf"
25 srdf_full_path = join(join(model_path,
"talos_data/srdf"), srdf_filename)
27 model, collision_model, visual_model = pin.buildModelsFromUrdf(
28 urdf_model_path, mesh_dir, pin.JointModelFreeFlyer()
39 viz.initViewer(open=
False)
40 except ImportError
as err:
42 "Error while initializing the viewer. It seems you should install Python meshcat"
51 pin.loadReferenceConfigurations(model, srdf_full_path)
52 q0 = model.referenceConfigurations[
"half_sitting"]
53 q_ref = pin.integrate(model, q0, 0.1 * np.random.rand((model.nv)))
56 feet_name = [
"left_sole_link",
"right_sole_link"]
57 frame_ids = [model.getFrameId(frame_name)
for frame_name
in feet_name]
59 v0 = np.zeros((model.nv))
61 data_sim = model.createData()
62 data_control = model.createData()
68 for frame_id
in frame_ids:
69 frame = model.frames[frame_id]
70 contact_model = pin.RigidConstraintModel(
71 pin.ContactType.CONTACT_6D, model, frame.parentJoint, frame.placement
74 contact_models.append(contact_model)
75 contact_datas.append(contact_model.createData())
77 num_constraints = len(frame_ids)
78 contact_dim = 6 * num_constraints
80 pin.initConstraintDynamics(model, data_sim, contact_models)
85 S = np.zeros((model.nv - 6, model.nv))
86 S.T[6:, :] = np.eye(model.nv - 6)
88 Kv_posture = 0.05 * math.sqrt(Kp_posture)
92 tau = np.zeros((model.nv))
101 J_constraint = np.zeros((contact_dim, model.nv))
102 pin.computeJointJacobians(model, data_control, q)
104 for k
in range(num_constraints):
105 contact_model = contact_models[k]
106 J_constraint[constraint_index : constraint_index + 6, :] = pin.getFrameJacobian(
109 contact_model.joint1_id,
110 contact_model.joint1_placement,
111 contact_model.reference_frame,
113 constraint_index += 6
115 A = np.vstack((S, J_constraint))
116 b = pin.rnea(model, data_control, q, v, np.zeros((model.nv)))
118 sol = np.linalg.lstsq(A.T, b, rcond=
None)[0]
119 tau = np.concatenate((np.zeros((6)), sol[: model.nv - 6]))
122 -Kp_posture * (pin.difference(model, q_ref, q))[6:]
123 - Kv_posture * (v - v_ref)[6:]
126 prox_settings = pin.ProximalSettings(1e-12, 1e-12, 10)
127 a = pin.constraintDynamics(
128 model, data_sim, q, v, tau, contact_models, contact_datas, prox_settings
132 print(
"constraint:", np.linalg.norm(J_constraint @ a))
133 print(
"iter:", prox_settings.iter)
136 q = pin.integrate(model, q, v * dt)
139 elapsed_time = time.time() - tic
141 time.sleep(
max(0, dt - elapsed_time))