simulation-contact-dynamics.py
Go to the documentation of this file.
1 import pinocchio as pin
2 
3 import math
4 import numpy as np
5 import sys
6 import os
7 from os.path import dirname, join, abspath
8 import time
9 
10 from pinocchio.visualize import MeshcatVisualizer
11 
12 # Load the URDF model.
13 # Conversion with str seems to be necessary when executing this file with ipython
14 pinocchio_model_dir = join(dirname(dirname(str(abspath(__file__)))), "models")
15 
16 # Load the URDF model.
17 # Conversion with str seems to be necessary when executing this file with ipython
18 pinocchio_model_dir = join(dirname(dirname(str(abspath(__file__)))), "models")
19 
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)
26 
27 model, collision_model, visual_model = pin.buildModelsFromUrdf(
28  urdf_model_path, mesh_dir, pin.JointModelFreeFlyer()
29 )
30 
31 # Start a new MeshCat server and client.
32 # Note: the server can also be started separately using the "meshcat-server" command in a terminal:
33 # this enables the server to remain active after the current script ends.
34 #
35 # Option open=True pens the visualizer.
36 # Note: the visualizer can also be opened seperately by visiting the provided URL.
37 try:
38  viz = MeshcatVisualizer(model, collision_model, visual_model)
39  viz.initViewer(open=False)
40 except ImportError as err:
41  print(
42  "Error while initializing the viewer. It seems you should install Python meshcat"
43  )
44  print(err)
45  sys.exit(0)
46 
47 # Load the robot in the viewer.
48 viz.loadViewerModel()
49 
50 # Display a robot configuration.
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)))
54 viz.display(q0)
55 
56 feet_name = ["left_sole_link", "right_sole_link"]
57 frame_ids = [model.getFrameId(frame_name) for frame_name in feet_name]
58 
59 v0 = np.zeros((model.nv))
60 v_ref = v0.copy()
61 data_sim = model.createData()
62 data_control = model.createData()
63 
64 contact_models = []
65 contact_datas = []
66 
67 
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
72  )
73 
74  contact_models.append(contact_model)
75  contact_datas.append(contact_model.createData())
76 
77 num_constraints = len(frame_ids)
78 contact_dim = 6 * num_constraints
79 
80 pin.initConstraintDynamics(model, data_sim, contact_models)
81 
82 t = 0
83 dt = 5e-3
84 
85 S = np.zeros((model.nv - 6, model.nv))
86 S.T[6:, :] = np.eye(model.nv - 6)
87 Kp_posture = 30.0
88 Kv_posture = 0.05 * math.sqrt(Kp_posture)
89 
90 q = q0.copy()
91 v = v0.copy()
92 tau = np.zeros((model.nv))
93 
94 T = 5
95 
96 while t <= T:
97  print("t:", t)
98  t += dt
99 
100  tic = time.time()
101  J_constraint = np.zeros((contact_dim, model.nv))
102  pin.computeJointJacobians(model, data_control, q)
103  constraint_index = 0
104  for k in range(num_constraints):
105  contact_model = contact_models[k]
106  J_constraint[constraint_index : constraint_index + 6, :] = pin.getFrameJacobian(
107  model,
108  data_control,
109  contact_model.joint1_id,
110  contact_model.joint1_placement,
111  contact_model.reference_frame,
112  )
113  constraint_index += 6
114 
115  A = np.vstack((S, J_constraint))
116  b = pin.rnea(model, data_control, q, v, np.zeros((model.nv)))
117 
118  sol = np.linalg.lstsq(A.T, b, rcond=None)[0]
119  tau = np.concatenate((np.zeros((6)), sol[: model.nv - 6]))
120 
121  tau[6:] += (
122  -Kp_posture * (pin.difference(model, q_ref, q))[6:]
123  - Kv_posture * (v - v_ref)[6:]
124  )
125 
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
129  )
130  print("a:", a.T)
131  print("v:", v.T)
132  print("constraint:", np.linalg.norm(J_constraint @ a))
133  print("iter:", prox_settings.iter)
134 
135  v += a * dt
136  q = pin.integrate(model, q, v * dt)
137 
138  viz.display(q)
139  elapsed_time = time.time() - tic
140 
141  time.sleep(max(0, dt - elapsed_time))
142  # input()
pinocchio.visualize
Definition: bindings/python/pinocchio/visualize/__init__.py:1
pinocchio.visualize.meshcat_visualizer.MeshcatVisualizer
Definition: meshcat_visualizer.py:532
path
CppAD::max
AD< Scalar > max(const AD< Scalar > &x, const AD< Scalar > &y)
Definition: autodiff/cppad.hpp:180


pinocchio
Author(s):
autogenerated on Wed Jun 19 2024 02:41:16