simulation-closed-kinematic-chains.py
Go to the documentation of this file.
1 import sys
2 import time
3 
4 import hppfcl as fcl
5 import numpy as np
6 import pinocchio as pin
7 from pinocchio.visualize import MeshcatVisualizer
8 
9 # Perform the simulation of a four-bar linkages mechanism
10 
11 height = 0.1
12 width = 0.01
13 radius = 0.05
14 
15 mass_link_A = 10.0
16 length_link_A = 1.0
17 shape_link_A = fcl.Capsule(radius, length_link_A)
18 
19 mass_link_B = 5.0
20 length_link_B = 0.6
21 shape_link_B = fcl.Capsule(radius, length_link_B)
22 
23 inertia_link_A = pin.Inertia.FromBox(mass_link_A, length_link_A, width, height)
24 placement_center_link_A = pin.SE3.Identity()
25 placement_center_link_A.translation = pin.XAxis * length_link_A / 2.0
26 placement_shape_A = placement_center_link_A.copy()
27 placement_shape_A.rotation = pin.Quaternion.FromTwoVectors(
28  pin.ZAxis, pin.XAxis
29 ).matrix()
30 
31 inertia_link_B = pin.Inertia.FromBox(mass_link_B, length_link_B, width, height)
32 placement_center_link_B = pin.SE3.Identity()
33 placement_center_link_B.translation = pin.XAxis * length_link_B / 2.0
34 placement_shape_B = placement_center_link_B.copy()
35 placement_shape_B.rotation = pin.Quaternion.FromTwoVectors(
36  pin.ZAxis, pin.XAxis
37 ).matrix()
38 
39 model = pin.Model()
40 collision_model = pin.GeometryModel()
41 
42 RED_COLOR = np.array([1.0, 0.0, 0.0, 1.0])
43 WHITE_COLOR = np.array([1.0, 1.0, 1.0, 1.0])
44 
45 base_joint_id = 0
46 geom_obj0 = pin.GeometryObject(
47  "link_A1",
48  base_joint_id,
49  pin.SE3(pin.Quaternion.FromTwoVectors(pin.ZAxis, pin.XAxis).matrix(), np.zeros(3)),
50  shape_link_A,
51 )
52 geom_obj0.meshColor = WHITE_COLOR
53 collision_model.addGeometryObject(geom_obj0)
54 
55 joint1_placement = pin.SE3.Identity()
56 joint1_placement.translation = pin.XAxis * length_link_A / 2.0
57 joint1_id = model.addJoint(
58  base_joint_id, pin.JointModelRY(), joint1_placement, "link_B1"
59 )
60 model.appendBodyToJoint(joint1_id, inertia_link_B, placement_center_link_B)
61 geom_obj1 = pin.GeometryObject("link_B1", joint1_id, placement_shape_B, shape_link_B)
62 geom_obj1.meshColor = RED_COLOR
63 collision_model.addGeometryObject(geom_obj1)
64 
65 joint2_placement = pin.SE3.Identity()
66 joint2_placement.translation = pin.XAxis * length_link_B
67 joint2_id = model.addJoint(joint1_id, pin.JointModelRY(), joint2_placement, "link_A2")
68 model.appendBodyToJoint(joint2_id, inertia_link_A, placement_center_link_A)
69 geom_obj2 = pin.GeometryObject("link_A2", joint2_id, placement_shape_A, shape_link_A)
70 geom_obj2.meshColor = WHITE_COLOR
71 collision_model.addGeometryObject(geom_obj2)
72 
73 joint3_placement = pin.SE3.Identity()
74 joint3_placement.translation = pin.XAxis * length_link_A
75 joint3_id = model.addJoint(joint2_id, pin.JointModelRY(), joint3_placement, "link_B2")
76 model.appendBodyToJoint(joint3_id, inertia_link_B, placement_center_link_B)
77 geom_obj3 = pin.GeometryObject("link_B2", joint3_id, placement_shape_B, shape_link_B)
78 geom_obj3.meshColor = RED_COLOR
79 collision_model.addGeometryObject(geom_obj3)
80 visual_model = collision_model
81 
82 q0 = pin.neutral(model)
83 
84 data = model.createData()
85 pin.forwardKinematics(model, data, q0)
86 
87 # Set the contact constraints
88 constraint1_joint1_placement = pin.SE3.Identity()
89 constraint1_joint1_placement.translation = pin.XAxis * length_link_B
90 
91 constraint1_joint2_placement = pin.SE3.Identity()
92 constraint1_joint2_placement.translation = -pin.XAxis * length_link_A / 2.0
93 
94 constraint_model = pin.RigidConstraintModel(
95  pin.ContactType.CONTACT_3D,
96  model,
97  joint3_id,
98  constraint1_joint1_placement,
99  base_joint_id,
100  constraint1_joint2_placement,
101 )
102 constraint_data = constraint_model.createData()
103 constraint_dim = constraint_model.size()
104 
105 # First, do an inverse geometry
106 rho = 1e-10
107 mu = 1e-4
108 
109 q = q0.copy()
110 
111 y = np.ones(constraint_dim)
112 data.M = np.eye(model.nv) * rho
113 kkt_constraint = pin.ContactCholeskyDecomposition(model, [constraint_model])
114 eps = 1e-10
115 N = 100
116 for k in range(N):
117  pin.computeJointJacobians(model, data, q)
118  kkt_constraint.compute(model, data, [constraint_model], [constraint_data], mu)
119  constraint_value = constraint_data.c1Mc2.translation
120 
121  J = pin.getFrameJacobian(
122  model,
123  data,
124  constraint_model.joint1_id,
125  constraint_model.joint1_placement,
126  constraint_model.reference_frame,
127  )[:3, :]
128  primal_feas = np.linalg.norm(constraint_value, np.inf)
129  dual_feas = np.linalg.norm(J.T.dot(constraint_value + y), np.inf)
130  if primal_feas < eps and dual_feas < eps:
131  print("Convergence achieved")
132  break
133  print("constraint_value:", np.linalg.norm(constraint_value))
134  rhs = np.concatenate([-constraint_value - y * mu, np.zeros(model.nv)])
135 
136  dz = kkt_constraint.solve(rhs)
137  dy = dz[:constraint_dim]
138  dq = dz[constraint_dim:]
139 
140  alpha = 1.0
141  q = pin.integrate(model, q, -alpha * dq)
142  y -= alpha * (-dy + y)
143 
144 q_sol = (q[:] + np.pi) % np.pi - np.pi
145 
146 # Perform the simulation
147 q = q_sol.copy()
148 v = np.zeros(model.nv)
149 tau = np.zeros(model.nv)
150 dt = 5e-3
151 
152 T_sim = 10
153 t = 0
154 mu_sim = 1e-10
155 constraint_model.corrector.Kp[:] = 10
156 constraint_model.corrector.Kd[:] = 2.0 * np.sqrt(constraint_model.corrector.Kp)
157 pin.initConstraintDynamics(model, data, [constraint_model])
158 prox_settings = pin.ProximalSettings(1e-8, mu_sim, 10)
159 
160 try:
161  viz = MeshcatVisualizer(model, collision_model, visual_model)
162  viz.initViewer(open=True)
163 except ImportError as error:
164  print(error)
165  sys.exit(0)
166 viz.loadViewerModel()
167 viz.display(q_sol)
168 
169 while t <= T_sim:
170  a = pin.constraintDynamics(
171  model, data, q, v, tau, [constraint_model], [constraint_data], prox_settings
172  )
173  v += a * dt
174  q = pin.integrate(model, q, v * dt)
175  viz.display(q)
176  time.sleep(dt)
177  t += dt
pinocchio.visualize
Definition: bindings/python/pinocchio/visualize/__init__.py:1
pinocchio.visualize.meshcat_visualizer.MeshcatVisualizer
Definition: meshcat_visualizer.py:580


pinocchio
Author(s):
autogenerated on Wed Apr 16 2025 02:41:51