anymal-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 load
5 from pinocchio.visualize import GepettoVisualizer
6 from pinocchio import GeometryType
7 from time import sleep
8 
9 from os.path import join, dirname, abspath
10 
11 robot = load("anymal")
12 model = robot.model
13 data = robot.data
14 
15 state_name = "standing"
16 
17 robot.q0 = robot.model.referenceConfigurations[state_name]
18 
19 pinocchio.forwardKinematics(model, data, robot.q0)
20 
21 lfFoot, rfFoot, lhFoot, rhFoot = "LF_FOOT", "RF_FOOT", "LH_FOOT", "RH_FOOT"
22 
23 foot_frames = [lfFoot, rfFoot, lhFoot, rhFoot]
24 foot_frame_ids = [robot.model.getFrameId(frame_name) for frame_name in foot_frames]
25 foot_joint_ids = [
26  robot.model.frames[robot.model.getFrameId(frame_name)].parent
27  for frame_name in foot_frames
28 ]
29 pinocchio.forwardKinematics(model, data, robot.q0)
30 pinocchio.framesForwardKinematics(model, data, robot.q0)
31 
32 constraint_models = []
33 
34 for j, frame_id in enumerate(foot_frame_ids):
35  contact_model_lf1 = pinocchio.RigidConstraintModel(
36  pinocchio.ContactType.CONTACT_3D,
37  robot.model,
38  foot_joint_ids[j],
39  robot.model.frames[frame_id].placement,
40  0,
41  data.oMf[frame_id],
42  )
43 
44  constraint_models.extend([contact_model_lf1])
45 
46 robot.initViewer()
47 robot.loadViewerModel("pinocchio")
48 gui = robot.viewer.gui
49 robot.display(robot.q0)
50 window_id = robot.viewer.gui.getWindowID("python-pinocchio")
51 
52 robot.viewer.gui.setBackgroundColor1(window_id, [1.0, 1.0, 1.0, 1.0])
53 robot.viewer.gui.setBackgroundColor2(window_id, [1.0, 1.0, 1.0, 1.0])
54 robot.viewer.gui.addFloor("hpp-gui/floor")
55 
56 robot.viewer.gui.setScale("hpp-gui/floor", [0.5, 0.5, 0.5])
57 robot.viewer.gui.setColor("hpp-gui/floor", [0.7, 0.7, 0.7, 1.0])
58 robot.viewer.gui.setLightingMode("hpp-gui/floor", "OFF")
59 
60 robot.display(robot.q0)
61 
62 constraint_datas = [cm.createData() for cm in constraint_models]
63 
64 q = robot.q0.copy()
65 
66 pinocchio.computeAllTerms(model, data, q, np.zeros(model.nv))
67 kkt_constraint = pinocchio.ContactCholeskyDecomposition(model, constraint_models)
68 constraint_dim = sum([cm.size() for cm in constraint_models])
69 N = 100000
70 eps = 1e-10
71 mu = 0.0
72 # q_sol = (q[:] + np.pi) % np.pi - np.pi
73 q_sol = q.copy()
74 robot.display(q_sol)
75 
76 # Bring CoM between the two feet.
77 
78 mass = data.mass[0]
79 
80 
81 def squashing(model, data, q_in):
82  q = q_in.copy()
83  y = np.ones((constraint_dim))
84 
85  N_full = 200
86 
87  # Decrease CoMz by 0.2
88  com_drop_amp = 0.2
89  pinocchio.computeAllTerms(model, data, q, np.zeros(model.nv))
90  com_base = data.com[0].copy()
91  kp = 1.0
92  speed = 1.0
93  com_des = lambda k: com_base - np.array(
94  [0.0, 0.0, np.abs(com_drop_amp * np.sin(2.0 * np.pi * k * speed / (N_full)))]
95  )
96  for k in range(N):
97  pinocchio.computeAllTerms(model, data, q, np.zeros(model.nv))
98  pinocchio.computeJointJacobians(model, data, q)
99  pinocchio.computeJointJacobians(model, data, q)
100  com_act = data.com[0].copy()
101  com_err = com_act - com_des(k)
102  kkt_constraint.compute(model, data, constraint_models, constraint_datas, mu)
103  constraint_value = np.concatenate(
104  [cd.c1Mc2.translation for cd in constraint_datas]
105  )
106  # constraint_value = np.concatenate([pinocchio.log6(cd.c1Mc2) for cd in constraint_datas])
107  J = np.vstack(
108  [
110  model, data, cm.joint1_id, cm.joint1_placement, cm.reference_frame
111  )[:3, :]
112  for cm in constraint_models
113  ]
114  )
115  primal_feas = np.linalg.norm(constraint_value, np.inf)
116  dual_feas = np.linalg.norm(J.T.dot(constraint_value + y), np.inf)
117  print("primal_feas:", primal_feas)
118  print("dual_feas:", dual_feas)
119  # if primal_feas < eps and dual_feas < eps:
120  # print("Convergence achieved")
121  # break
122  print("constraint_value:", np.linalg.norm(constraint_value))
123  print("com_error:", np.linalg.norm(com_err))
124  rhs = np.concatenate(
125  [-constraint_value - y * mu, kp * mass * com_err, np.zeros(model.nv - 3)]
126  )
127  dz = kkt_constraint.solve(rhs)
128  dy = dz[:constraint_dim]
129  dq = dz[constraint_dim:]
130  alpha = 1.0
131  q = pinocchio.integrate(model, q, -alpha * dq)
132  y -= alpha * (-dy + y)
133  robot.display(q)
134  sleep(0.05)
135  return q
136 
137 
138 q_new = squashing(model, data, robot.q0)
pinocchio.visualize
Definition: bindings/python/pinocchio/visualize/__init__.py:1
boost::serialization::load
void load(Archive &ar, Eigen::array< _IndexType, _NumIndices > &a, const unsigned int)
Definition: serialization/eigen.hpp:197
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
anymal-simulation.squashing
def squashing(model, data, q_in)
Definition: anymal-simulation.py:81
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::framesForwardKinematics
void framesForwardKinematics(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q)
First calls the forwardKinematics on the model, then computes the placement of each frame....
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
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...
path


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