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  foot_joint_ids[j],
38  robot.model.frames[frame_id].placement,
39  0,
40  data.oMf[frame_id],
41  )
42 
43  constraint_models.extend([contact_model_lf1])
44 
45 robot.initViewer()
46 robot.loadViewerModel("pinocchio")
47 gui = robot.viewer.gui
48 robot.display(robot.q0)
49 window_id = robot.viewer.gui.getWindowID("python-pinocchio")
50 
51 robot.viewer.gui.setBackgroundColor1(window_id, [1.0, 1.0, 1.0, 1.0])
52 robot.viewer.gui.setBackgroundColor2(window_id, [1.0, 1.0, 1.0, 1.0])
53 robot.viewer.gui.addFloor("hpp-gui/floor")
54 
55 robot.viewer.gui.setScale("hpp-gui/floor", [0.5, 0.5, 0.5])
56 robot.viewer.gui.setColor("hpp-gui/floor", [0.7, 0.7, 0.7, 1.0])
57 robot.viewer.gui.setLightingMode("hpp-gui/floor", "OFF")
58 
59 robot.display(robot.q0)
60 
61 constraint_datas = [cm.createData() for cm in constraint_models]
62 
63 q = robot.q0.copy()
64 
65 pinocchio.computeAllTerms(model, data, q, np.zeros(model.nv))
66 kkt_constraint = pinocchio.ContactCholeskyDecomposition(model, constraint_models)
67 constraint_dim = sum([cm.size() for cm in constraint_models])
68 N = 100000
69 eps = 1e-10
70 mu = 0.0
71 # q_sol = (q[:] + np.pi) % np.pi - np.pi
72 q_sol = q.copy()
73 robot.display(q_sol)
74 
75 # Bring CoM between the two feet.
76 
77 mass = data.mass[0]
78 
79 
80 def squashing(model, data, q_in):
81  q = q_in.copy()
82  y = np.ones((constraint_dim))
83 
84  N_full = 200
85 
86  # Decrease CoMz by 0.2
87  com_drop_amp = 0.2
88  pinocchio.computeAllTerms(model, data, q, np.zeros(model.nv))
89  com_base = data.com[0].copy()
90  kp = 1.0
91  speed = 1.0
92  com_des = lambda k: com_base - np.array(
93  [0.0, 0.0, np.abs(com_drop_amp * np.sin(2.0 * np.pi * k * speed / (N_full)))]
94  )
95  for k in range(N):
96  pinocchio.computeAllTerms(model, data, q, np.zeros(model.nv))
97  pinocchio.computeJointJacobians(model, data, q)
98  pinocchio.computeJointJacobians(model, data, q)
99  com_act = data.com[0].copy()
100  com_err = com_act - com_des(k)
101  kkt_constraint.compute(model, data, constraint_models, constraint_datas, mu)
102  constraint_value = np.concatenate(
103  [cd.c1Mc2.translation for cd in constraint_datas]
104  )
105  # constraint_value = np.concatenate([pinocchio.log6(cd.c1Mc2) for cd in constraint_datas])
106  J = np.vstack(
107  [
109  model, data, cm.joint1_id, cm.joint1_placement, cm.reference_frame
110  )[:3, :]
111  for cm in constraint_models
112  ]
113  )
114  primal_feas = np.linalg.norm(constraint_value, np.inf)
115  dual_feas = np.linalg.norm(J.T.dot(constraint_value + y), np.inf)
116  print("primal_feas:", primal_feas)
117  print("dual_feas:", dual_feas)
118  # if primal_feas < eps and dual_feas < eps:
119  # print("Convergence achieved")
120  # break
121  print("constraint_value:", np.linalg.norm(constraint_value))
122  print("com_error:", np.linalg.norm(com_err))
123  rhs = np.concatenate(
124  [-constraint_value - y * mu, kp * mass * com_err, np.zeros(model.nv - 3)]
125  )
126  dz = kkt_constraint.solve(rhs)
127  dy = dz[:constraint_dim]
128  dq = dz[constraint_dim:]
129  alpha = 1.0
130  q = pinocchio.integrate(model, q, -alpha * dq)
131  y -= alpha * (-dy + y)
132  robot.display(q)
133  sleep(0.05)
134  return q
135 
136 
137 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:80
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 Sat Jun 22 2024 02:41:42