cassie-simulation.py
Go to the documentation of this file.
1 import numpy as np
2 import hppfcl as fcl
3 import pinocchio
4 from example_robot_data import readParamsFromSrdf
5 from pinocchio import buildModelFromSdf, buildGeomFromSdf, neutral, JointModelFreeFlyer
6 from pinocchio.visualize import GepettoVisualizer
7 from pinocchio import GeometryType
8 from time import sleep
9 
10 from os.path import join, dirname, abspath
11 
12 
13 model_dir = "/local/rbudhira/devel/install/sot/share/example-robot-data/robots/"
14 # pinocchio_model_dir = join(dirname(dirname(str(abspath(__file__)))), "models")
15 sdf_filename = model_dir + "cassie_description/robots/cassie.sdf"
16 srdf_path = model_dir + "cassie_description/srdf/cassie_v2.srdf"
17 package_dir = model_dir + "../../"
18 
19 sdf_parent_guidance = [
20  "left-roll-op",
21  "left-yaw-op",
22  "left-pitch-op",
23  "left-knee-op",
24  "left-tarsus-spring-joint",
25  "left-foot-op",
26  "right-roll-op",
27  "right-yaw-op",
28  "right-pitch-op",
29  "right-knee-op",
30  "right-tarsus-spring-joint",
31  "right-foot-op",
32 ]
33 
34 
35 robot = pinocchio.RobotWrapper.BuildFromSDF(
36  sdf_filename,
37  package_dirs=[package_dir],
38  root_joint=JointModelFreeFlyer(),
39  root_link_name="pelvis",
40  parent_guidance=sdf_parent_guidance,
41 )
42 
43 robot.q0 = readParamsFromSrdf(
44  robot.model, srdf_path, has_rotor_parameters=False, referencePose="standing"
45 )
46 
47 
48 constraint_models = robot.constraint_models
49 
50 data = pinocchio.Data(robot.model)
51 
52 pinocchio.forwardKinematics(robot.model, robot.data, robot.q0)
53 
54 foot_joints = ["left-plantar-foot-joint", "right-plantar-foot-joint"]
55 foot_joint_ids = [robot.model.getJointId(joint_name) for joint_name in foot_joints]
56 
57 front_placement = pinocchio.SE3(np.identity(3), np.array([-0.1, 0.11, 0.0]))
58 
59 back_placement = pinocchio.SE3(np.identity(3), np.array([0.03, -0.0, 0.0]))
60 
61 foot_length = np.linalg.norm(front_placement.translation - back_placement.translation)
62 
63 
64 # Add contact robot.model for contact with ground
65 
66 mid_point = np.zeros(3)
67 
68 for joint_id in foot_joint_ids:
69  joint2_placement = robot.data.oMi[joint_id] * front_placement
70  joint2_placement.translation[2] = 0
71  contact_model_lf1 = pinocchio.RigidConstraintModel(
72  pinocchio.ContactType.CONTACT_3D,
73  robot.model,
74  joint_id,
75  front_placement,
76  0,
77  joint2_placement,
78  pinocchio.ReferenceFrame.LOCAL,
79  )
80 
81  mid_point += joint2_placement.translation
82  joint2_placement.translation[0] -= foot_length
83 
84  contact_model_lf2 = pinocchio.RigidConstraintModel(
85  pinocchio.ContactType.CONTACT_3D,
86  robot.model,
87  joint_id,
88  back_placement,
89  0,
90  joint2_placement,
91  pinocchio.ReferenceFrame.LOCAL,
92  )
93 
94  mid_point += joint2_placement.translation
95  constraint_models.extend([contact_model_lf1, contact_model_lf2])
96 
97 mid_point /= 4.0
98 
99 
100 robot.initDisplay(loadModel=True)
101 gui = robot.viewer.gui
102 
103 robot.display(robot.q0)
104 q0 = robot.q0.copy()
105 constraint_datas = pinocchio.StdVec_RigidConstraintData()
106 for cm in constraint_models:
107  constraint_datas.append(cm.createData())
108 
109 
110 def update_axis(q):
111  pinocchio.forwardKinematics(robot.model, robot.data, q)
112  for j, cm in enumerate(robot.constraint_models):
113  pos1 = robot.data.oMi[cm.joint1_id] * cm.joint1_placement
114  pos2 = robot.data.oMi[cm.joint2_id] * cm.joint2_placement
115  name1 = "hpp-gui/cm1_" + str(j)
116  name2 = "hpp-gui/cm2_" + str(j)
117  gui.applyConfiguration(name1, list(pinocchio.SE3ToXYZQUAT(pos1)))
118  gui.applyConfiguration(name2, list(pinocchio.SE3ToXYZQUAT(pos2)))
119  gui.refresh()
120 
121 
122 def check_joint(model, nj):
123  for k in range(model.joints[nj].nv):
124  for res in range(200):
125  q1 = robot.q0.copy()
126  theta = res * 2.0 * np.pi / 200.0
127  v = np.zeros(robot.model.nv)
128  v[robot.model.idx_vs[nj] + k] = theta
129  q1 = pinocchio.integrate(robot.model, q1, v)
130  robot.display(q1)
131  update_axis(q1)
132  sleep(0.005)
133 
134 
135 q = q0.copy()
136 
137 pinocchio.computeAllTerms(robot.model, robot.data, q, np.zeros(robot.model.nv))
138 kkt_constraint = pinocchio.ContactCholeskyDecomposition(robot.model, constraint_models)
139 constraint_dim = sum([cm.size() for cm in constraint_models])
140 N = 1000
141 eps = 1e-6
142 mu = 1e-4
143 # q_sol = (q[:] + np.pi) % np.pi - np.pi
144 q_sol = q.copy()
145 
146 window_id = robot.viewer.gui.getWindowID("python-pinocchio")
147 robot.viewer.gui.setBackgroundColor1(window_id, [1.0, 1.0, 1.0, 1.0])
148 robot.viewer.gui.setBackgroundColor2(window_id, [1.0, 1.0, 1.0, 1.0])
149 robot.viewer.gui.addFloor("hpp-gui/floor")
150 robot.viewer.gui.setScale("hpp-gui/floor", [0.5, 0.5, 0.5])
151 robot.viewer.gui.setColor("hpp-gui/floor", [0.7, 0.7, 0.7, 1.0])
152 robot.viewer.gui.setLightingMode("hpp-gui/floor", "OFF")
153 
154 
155 axis_size = 0.08
156 radius = 0.005
157 transparency = 0.5
158 
159 for j, cm in enumerate(constraint_models):
160  pos1 = robot.data.oMi[cm.joint1_id] * cm.joint1_placement
161  pos2 = robot.data.oMi[cm.joint2_id] * cm.joint2_placement
162  name1 = "hpp-gui/cm1_" + str(j)
163  name2 = "hpp-gui/cm2_" + str(j)
164  red_color = 1.0 * float(j) / float(len(constraint_models))
165  print(red_color)
166  robot.viewer.gui.addXYZaxis(
167  name1, [red_color, 1.0, 1.0 - red_color, transparency], radius, axis_size
168  )
169  robot.viewer.gui.addXYZaxis(
170  name2, [red_color, 1.0, 1.0 - red_color, transparency], radius, axis_size
171  )
172 
173  gui.applyConfiguration(name1, list(pinocchio.SE3ToXYZQUAT(pos1)))
174  gui.applyConfiguration(name2, list(pinocchio.SE3ToXYZQUAT(pos2)))
175  gui.refresh()
176  gui.setVisibility(name1, "OFF")
177  gui.setVisibility(name2, "OFF")
178 
179 
180 mid_point_name = "hpp-gui/mid_point"
181 mid_point_pos = pinocchio.SE3(np.identity(3), mid_point)
182 robot.viewer.gui.addXYZaxis(
183  mid_point_name, [0.0, 0.0, 1.0, transparency], radius, axis_size
184 )
185 
186 
187 gui.applyConfiguration(mid_point_name, list(pinocchio.SE3ToXYZQUAT(mid_point_pos)))
188 gui.setVisibility(mid_point_name, "ALWAYS_ON_TOP")
189 
190 robot.display(q_sol)
191 
192 # Bring CoM between the two feet.
193 
194 mass = robot.data.mass[0]
195 
196 com_base = robot.data.com[0].copy()
197 com_base[:2] = mid_point[:2]
198 com_drop_amp = 0.1
199 com_des = lambda k: com_base - np.array([0.0, 0.0, np.abs(com_drop_amp)])
200 
201 
202 def squashing(model, data, q_in, Nin=N, epsin=eps, verbose=True):
203  q = q_in.copy()
204  y = np.ones((constraint_dim))
205 
206  N_full = 200
207 
208  # Decrease CoMz by 0.2
209  pinocchio.computeAllTerms(robot.model, robot.data, q, np.zeros(robot.model.nv))
210  kp = np.array([1.0, 1.0, 0.1])
211 
212  for k in range(Nin):
213  pinocchio.computeAllTerms(robot.model, robot.data, q, np.zeros(robot.model.nv))
214  pinocchio.computeJointJacobians(robot.model, robot.data, q)
215  com_act = robot.data.com[0].copy()
216  com_err = com_act - com_des(k)
217  kkt_constraint.compute(
218  robot.model, robot.data, constraint_models, constraint_datas, mu
219  )
220  constraint_value1 = np.concatenate(
221  [pinocchio.log(cd.c1Mc2) for cd in constraint_datas[:-4]]
222  )
223  constraint_value2 = np.concatenate(
224  [cd.c1Mc2.translation for cd in constraint_datas[-4:]]
225  )
226  constraint_value = np.concatenate([constraint_value1, constraint_value2])
227 
228  J1 = np.vstack(
229  [
231  robot.model,
232  data,
233  cm.joint1_id,
234  cm.joint1_placement,
235  cm.reference_frame,
236  )
237  for cm in constraint_models[:-4]
238  ]
239  )
240  J2 = np.vstack(
241  [
243  robot.model,
244  data,
245  cm.joint1_id,
246  cm.joint1_placement,
247  cm.reference_frame,
248  )[:3, :]
249  for cm in constraint_models[-4:]
250  ]
251  )
252  J = np.vstack([J1, J2])
253  primal_feas = np.linalg.norm(constraint_value, np.inf)
254 
255  dual_feas = np.linalg.norm(J.T.dot(constraint_value + y), np.inf)
256  if primal_feas < epsin and dual_feas < epsin:
257  print("Convergence achieved")
258  break
259  if verbose:
260  print("constraint_value:", np.linalg.norm(constraint_value))
261  print("com_error:", np.linalg.norm(com_err))
262  print("com_des", com_des(k))
263  print("com_act", com_act)
264  rhs = np.concatenate(
265  [-constraint_value - y * mu, kp * com_err, np.zeros(robot.model.nv - 3)]
266  )
267  dz = kkt_constraint.solve(rhs)
268  dy = dz[:constraint_dim]
269  dq = dz[constraint_dim:]
270  alpha = 1.0
271  q = pinocchio.integrate(robot.model, q, -alpha * dq)
272  y -= alpha * (-dy + y)
273  robot.display(q)
274  update_axis(q)
275  gui.applyConfiguration(
276  mid_point_name,
277  list(pinocchio.SE3ToXYZQUAT(pinocchio.SE3(np.identity(3), com_des(k)))),
278  )
279  sleep(0.0)
280  return q
281 
282 
283 qin = robot.q0.copy()
284 for k in range(1000):
285  qout = squashing(robot.model, data, qin)
286  qout[3:6] = 0.0
287  qout[6] = 1.0
288  qin = qout.copy()
289 
290 qout = squashing(robot.model, data, qin, Nin=100000, epsin=1e-10, verbose=False)
pinocchio::DataTpl
Definition: context/generic.hpp:25
pinocchio.visualize
Definition: bindings/python/pinocchio/visualize/__init__.py:1
pinocchio::SE3Tpl< context::Scalar, context::Options >
cassie-simulation.squashing
def squashing(model, data, q_in, Nin=N, epsin=eps, verbose=True)
Definition: cassie-simulation.py:202
pinocchio::python::context::JointModelFreeFlyer
JointModelFreeFlyerTpl< Scalar > JointModelFreeFlyer
Definition: bindings/python/context/generic.hpp:124
pinocchio::forwardKinematics
void forwardKinematics(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q, const Eigen::MatrixBase< TangentVectorType1 > &v, const Eigen::MatrixBase< TangentVectorType2 > &a)
Update the joint placements, spatial velocities and spatial accelerations according to the current jo...
cassie-simulation.com_des
com_des
Definition: cassie-simulation.py:199
pinocchio::RigidConstraintModelTpl
Definition: algorithm/constraints/fwd.hpp:14
cassie-simulation.check_joint
def check_joint(model, nj)
Definition: cassie-simulation.py:122
pinocchio::integrate
void integrate(const LieGroupGenericTpl< LieGroupCollection > &lg, const Eigen::MatrixBase< ConfigIn_t > &q, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< ConfigOut_t > &qout)
Visit a LieGroupVariant to call its integrate method.
pinocchio::computeJointJacobians
const DataTpl< Scalar, Options, JointCollectionTpl >::Matrix6x & computeJointJacobians(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data)
Computes the full model Jacobian, i.e. the stack of all motion subspace expressed in the world frame....
pinocchio::getFrameJacobian
Eigen::Matrix< Scalar, 6, Eigen::Dynamic, Options > getFrameJacobian(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const FrameIndex frame_id, const ReferenceFrame reference_frame)
Returns the jacobian of the frame expressed either expressed in the local frame coordinate system,...
Definition: frames.hpp:397
pinocchio::copy
void copy(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, const DataTpl< Scalar, Options, JointCollectionTpl > &origin, DataTpl< Scalar, Options, JointCollectionTpl > &dest, KinematicLevel kinematic_level)
Copy part of the data from origin to dest. Template parameter can be used to select at which differen...
Definition: copy.hpp:42
example_robot_data.robots_loader.readParamsFromSrdf
def readParamsFromSrdf(model, SRDF_PATH, verbose=False, has_rotor_parameters=True, referencePose="half_sitting")
Definition: robots_loader.py:42
pinocchio::ContactCholeskyDecompositionTpl< context::Scalar, context::Options >
pinocchio::computeAllTerms
void computeAllTerms(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q, const Eigen::MatrixBase< TangentVectorType > &v)
Computes efficiently all the terms needed for dynamic simulation. It is equivalent to the call at the...
cassie-simulation.update_axis
def update_axis(q)
Definition: cassie-simulation.py:110
path


pinocchio
Author(s):
autogenerated on Tue Jun 25 2024 02:42:34