talos-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 loadTalos
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 = loadTalos()
12 model = robot.model
13 data = robot.data
14 
15 state_name = "half_sitting"
16 
17 robot.q0 = robot.model.referenceConfigurations[state_name]
18 
19 pinocchio.forwardKinematics(model, data, robot.q0)
20 
21 lfFoot, rfFoot, lhFoot, rhFoot = (
22  "left_sole_link",
23  "right_sole_link",
24  "gripper_left_fingertip_3_link",
25  "gripper_right_fingertip_3_link",
26 )
27 
28 foot_frames = [lfFoot, rfFoot, lhFoot, rhFoot]
29 foot_frame_ids = [robot.model.getFrameId(frame_name) for frame_name in foot_frames]
30 foot_joint_ids = [
31  robot.model.frames[robot.model.getFrameId(frame_name)].parent
32  for frame_name in foot_frames
33 ]
34 pinocchio.forwardKinematics(model, data, robot.q0)
35 pinocchio.framesForwardKinematics(model, data, robot.q0)
36 
37 constraint_models = []
38 
39 for j, frame_id in enumerate(foot_frame_ids):
40  contact_model_lf1 = pinocchio.RigidConstraintModel(
41  pinocchio.ContactType.CONTACT_6D,
42  foot_joint_ids[j],
43  robot.model.frames[frame_id].placement,
44  0,
45  data.oMf[frame_id],
46  )
47  constraint_models.extend([contact_model_lf1])
48 
49 # Change arm position
50 constraint_models[3].joint2_placement = pinocchio.SE3(
51  pinocchio.rpy.rpyToMatrix(np.array([0.0, -np.pi / 2, 0.0])),
52  np.array([0.6, -0.40, 1.0]),
53 )
54 
55 constraint_models[2].joint2_placement = pinocchio.SE3(
56  pinocchio.rpy.rpyToMatrix(np.array([0, -np.pi / 2, 0.0])), np.array([0.6, 0.4, 1.0])
57 )
58 
59 robot.initViewer()
60 robot.loadViewerModel("pinocchio")
61 gui = robot.viewer.gui
62 robot.display(robot.q0)
63 window_id = robot.viewer.gui.getWindowID("python-pinocchio")
64 
65 robot.viewer.gui.setBackgroundColor1(window_id, [1.0, 1.0, 1.0, 1.0])
66 robot.viewer.gui.setBackgroundColor2(window_id, [1.0, 1.0, 1.0, 1.0])
67 robot.viewer.gui.addFloor("hpp-gui/floor")
68 
69 robot.viewer.gui.setScale("hpp-gui/floor", [0.5, 0.5, 0.5])
70 robot.viewer.gui.setColor("hpp-gui/floor", [0.7, 0.7, 0.7, 1.0])
71 robot.viewer.gui.setLightingMode("hpp-gui/floor", "OFF")
72 
73 robot.display(robot.q0)
74 
75 constraint_datas = [cm.createData() for cm in constraint_models]
76 
77 q = robot.q0.copy()
78 
79 pinocchio.computeAllTerms(model, data, q, np.zeros(model.nv))
80 kkt_constraint = pinocchio.ContactCholeskyDecomposition(model, constraint_models)
81 constraint_dim = sum([cm.size() for cm in constraint_models])
82 N = 100000
83 eps = 1e-10
84 mu = 1e-8 # 0.
85 # q_sol = (q[:] + np.pi) % np.pi - np.pi
86 q_sol = q.copy()
87 robot.display(q_sol)
88 
89 # Bring CoM between the two feet.
90 
91 mass = data.mass[0]
92 
93 
94 def squashing(model, data, q_in):
95  q = q_in.copy()
96  y = np.ones((constraint_dim))
97 
98  N_full = 200
99 
100  # Decrease CoMz by 0.2
101  com_drop_amp = 0.1
102  pinocchio.computeAllTerms(model, data, q, np.zeros(model.nv))
103  com_base = data.com[0].copy()
104  kp = 1.0
105  speed = 1.0
106  com_des = lambda k: com_base - np.array(
107  [0.0, 0.0, np.abs(com_drop_amp * np.sin(2.0 * np.pi * k * speed / (N_full)))]
108  )
109  for k in range(N):
110  pinocchio.computeAllTerms(model, data, q, np.zeros(model.nv))
111  pinocchio.computeJointJacobians(model, data, q)
112  pinocchio.computeJointJacobians(model, data, q)
113  com_act = data.com[0].copy()
114  com_err = com_act - com_des(k)
115  kkt_constraint.compute(model, data, constraint_models, constraint_datas, mu)
116  constraint_value = np.concatenate(
117  [pinocchio.log6(cd.c1Mc2) for cd in constraint_datas]
118  )
119  J = np.vstack(
120  [
122  model, data, cm.joint1_id, cm.joint1_placement, cm.reference_frame
123  )
124  for cm in constraint_models
125  ]
126  )
127  primal_feas = np.linalg.norm(constraint_value, np.inf)
128  print(J.shape, constraint_value.shape, y.shape)
129  dual_feas = np.linalg.norm(J.T.dot(constraint_value + y), np.inf)
130  print("primal_feas:", primal_feas)
131  print("dual_feas:", dual_feas)
132  # if primal_feas < eps and dual_feas < eps:
133  # print("Convergence achieved")
134  # break
135  print("constraint_value:", np.linalg.norm(constraint_value))
136  print("com_error:", np.linalg.norm(com_err))
137  rhs = np.concatenate(
138  [-constraint_value - y * mu, kp * mass * com_err, np.zeros(model.nv - 3)]
139  )
140  dz = kkt_constraint.solve(rhs)
141  dy = dz[:constraint_dim]
142  dq = dz[constraint_dim:]
143  alpha = 1.0
144  q = pinocchio.integrate(model, q, -alpha * dq)
145  y -= alpha * (-dy + y)
146  robot.display(q)
147  sleep(0.05)
148  return q
149 
150 
151 q_new = squashing(model, data, robot.q0)
talos-simulation.squashing
def squashing(model, data, q_in)
Definition: talos-simulation.py:94
pinocchio.visualize
Definition: bindings/python/pinocchio/visualize/__init__.py:1
pinocchio::SE3Tpl< context::Scalar, context::Options >
pinocchio::rpy::rpyToMatrix
Eigen::Matrix< typename Vector3Like::Scalar, 3, 3, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector3Like)::Options > rpyToMatrix(const Eigen::MatrixBase< Vector3Like > &rpy)
Convert from Roll, Pitch, Yaw to rotation Matrix.
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
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::log6
MotionTpl< typename Matrix4Like::Scalar, Eigen::internal::traits< Matrix4Like >::Options > log6(const Eigen::MatrixBase< Matrix4Like > &M)
Log: SE3 -> se3.
Definition: spatial/explog.hpp:475


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