6 import pinocchio
as pin
17 shape_link_A = fcl.Capsule(radius, length_link_A)
21 shape_link_B = fcl.Capsule(radius, length_link_B)
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(
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(
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])
52 geom_obj0.meshColor = WHITE_COLOR
53 collision_model.addGeometryObject(geom_obj0)
55 joint1_placement = pin.SE3.Identity()
56 joint1_placement.translation =
pin.XAxis * length_link_A / 2.0
57 joint1_id = model.addJoint(
60 model.appendBodyToJoint(joint1_id, inertia_link_B, placement_center_link_B)
62 geom_obj1.meshColor = RED_COLOR
63 collision_model.addGeometryObject(geom_obj1)
65 joint2_placement = pin.SE3.Identity()
66 joint2_placement.translation =
pin.XAxis * length_link_B
68 model.appendBodyToJoint(joint2_id, inertia_link_A, placement_center_link_A)
70 geom_obj2.meshColor = WHITE_COLOR
71 collision_model.addGeometryObject(geom_obj2)
73 joint3_placement = pin.SE3.Identity()
74 joint3_placement.translation =
pin.XAxis * length_link_A
76 model.appendBodyToJoint(joint3_id, inertia_link_B, placement_center_link_B)
78 geom_obj3.meshColor = RED_COLOR
79 collision_model.addGeometryObject(geom_obj3)
80 visual_model = collision_model
84 data = model.createData()
88 constraint1_joint1_placement = pin.SE3.Identity()
89 constraint1_joint1_placement.translation =
pin.XAxis * length_link_B
91 constraint1_joint2_placement = pin.SE3.Identity()
92 constraint1_joint2_placement.translation = -
pin.XAxis * length_link_A / 2.0
95 pin.ContactType.CONTACT_3D,
98 constraint1_joint1_placement,
100 constraint1_joint2_placement,
102 constraint_data = constraint_model.createData()
103 constraint_dim = constraint_model.size()
111 y = np.ones(constraint_dim)
112 data.M = np.eye(model.nv) * rho
118 kkt_constraint.compute(model, data, [constraint_model], [constraint_data], mu)
119 constraint_value = constraint_data.c1Mc2.translation
124 constraint_model.joint1_id,
125 constraint_model.joint1_placement,
126 constraint_model.reference_frame,
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")
133 print(
"constraint_value:", np.linalg.norm(constraint_value))
134 rhs = np.concatenate([-constraint_value - y * mu, np.zeros(model.nv)])
136 dz = kkt_constraint.solve(rhs)
137 dy = dz[:constraint_dim]
138 dq = dz[constraint_dim:]
142 y -= alpha * (-dy + y)
144 q_sol = (q[:] + np.pi) % np.pi - np.pi
148 v = np.zeros(model.nv)
149 tau = np.zeros(model.nv)
155 constraint_model.corrector.Kp[:] = 10
156 constraint_model.corrector.Kd[:] = 2.0 * np.sqrt(constraint_model.corrector.Kp)
162 viz.initViewer(open=
True)
163 except ImportError
as error:
166 viz.loadViewerModel()
171 model, data, q, v, tau, [constraint_model], [constraint_data], prox_settings