timings-delassus-operations.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2019-2025 INRIA
3 //
4 
5 #include "model-fixture.hpp"
6 
21 
22 #include <benchmark/benchmark.h>
23 
24 #include <iostream>
25 
27 {
28  void SetUp(benchmark::State & st)
29  {
31 
32  const std::string RF = "RLEG_LINK6";
33  const auto RF_id = model.frames[model.getFrameId(RF)].parentJoint;
34  const std::string LF = "LLEG_LINK6";
35  const auto LF_id = model.frames[model.getFrameId(LF)].parentJoint;
36 
37  ci_RF_6D = std::make_unique<pinocchio::RigidConstraintModel>(
39  ci_LF_6D = std::make_unique<pinocchio::RigidConstraintModel>(
41 
42  contact_models_6D6D.clear();
43  contact_models_6D6D.push_back(*ci_RF_6D);
44  contact_models_6D6D.push_back(*ci_LF_6D);
45 
46  contact_data_6D6D.clear();
47  contact_data_6D6D.push_back(pinocchio::RigidConstraintData(*ci_RF_6D));
48  contact_data_6D6D.push_back(pinocchio::RigidConstraintData(*ci_LF_6D));
49 
51 
53  prox_settings.mu = 1e8;
54 
55  num_constraints = 12;
56 
58  + Eigen::MatrixXd::Identity(num_constraints, num_constraints);
59  }
60 
61  void TearDown(benchmark::State & st)
62  {
64  }
65 
66  std::unique_ptr<pinocchio::RigidConstraintModel> ci_RF_6D;
67  std::unique_ptr<pinocchio::RigidConstraintModel> ci_LF_6D;
68 
71 
73 
75 
76  int num_constraints = 12;
77 
78  Eigen::MatrixXd col_major_square_matrices;
79 };
80 
81 static void CustomArguments(benchmark::internal::Benchmark * b)
82 {
83  b->MinWarmUpTime(3.);
84 }
85 
86 // CONTACT_CHOLESKY_DECOMPOSITION_COMPUTE
87 
90  const pinocchio::Model & model,
93  & contact_models_6D6D,
95 {
96  contact.compute(model, data, contact_models_6D6D, contact_data_6D6D);
97 }
98 
99 BENCHMARK_DEFINE_F(DelassusFixture, CONTACT_CHOLESKY_DECOMPOSITION_COMPUTE)(benchmark::State & st)
100 {
102  for (auto _ : st)
103  {
105  contact_chol_6D6D, model, data, contact_models_6D6D, contact_data_6D6D);
106  }
107 }
108 BENCHMARK_REGISTER_F(DelassusFixture, CONTACT_CHOLESKY_DECOMPOSITION_COMPUTE)
109  ->Apply(CustomArguments);
110 
111 // CONTACT_CHOLESKY_DECOMPOSITION_INVERSE
112 
114  pinocchio::ContactCholeskyDecomposition & contact, Eigen::MatrixXd & H_inverse)
115 {
116  contact.inverse(H_inverse);
117 }
118 
119 BENCHMARK_DEFINE_F(DelassusFixture, CONTACT_CHOLESKY_DECOMPOSITION_INVERSE)(benchmark::State & st)
120 {
122  contact_chol_6D6D.compute(model, data, contact_models_6D6D, contact_data_6D6D);
123  Eigen::MatrixXd H_inverse(contact_chol_6D6D.size(), contact_chol_6D6D.size());
124  for (auto _ : st)
125  {
126  contactCholeskyDecompositionInverseCall(contact_chol_6D6D, H_inverse);
127  }
128 }
129 BENCHMARK_REGISTER_F(DelassusFixture, CONTACT_CHOLESKY_DECOMPOSITION_INVERSE)
130  ->Apply(CustomArguments);
131 
132 // CONTACT_CHOLESKY_DECOMPOSITION_UPDATE_DAMPING
133 
135  pinocchio::ContactCholeskyDecomposition & contact, double damping)
136 {
137  contact.getDelassusCholeskyExpression().updateDamping(damping);
138 }
139 
140 BENCHMARK_DEFINE_F(DelassusFixture, CONTACT_CHOLESKY_DECOMPOSITION_UPDATE_DAMPING)(
141  benchmark::State & st)
142 {
144  contact_chol_6D6D.compute(model, data, contact_models_6D6D, contact_data_6D6D);
145  for (auto _ : st)
146  {
147  contactCholeskyDecompositionUpdateDampingCall(contact_chol_6D6D, 1.);
148  }
149 }
150 BENCHMARK_REGISTER_F(DelassusFixture, CONTACT_CHOLESKY_DECOMPOSITION_UPDATE_DAMPING)
151  ->Apply(CustomArguments);
152 
153 // CONTACT_CHOLESKY_DECOMPOSITION_SOLVE_IN_PLACE
154 
156  pinocchio::ContactCholeskyDecomposition & contact, const Eigen::VectorXd & rhs_vector)
157 {
158  contact.getDelassusCholeskyExpression().solveInPlace(rhs_vector);
159 }
160 
161 BENCHMARK_DEFINE_F(DelassusFixture, CONTACT_CHOLESKY_DECOMPOSITION_SOLVE_IN_PLACE)(
162  benchmark::State & st)
163 {
165  contact_chol_6D6D.compute(model, data, contact_models_6D6D, contact_data_6D6D);
166  Eigen::VectorXd rhs_vector = Eigen::VectorXd::Random(num_constraints);
167  for (auto _ : st)
168  {
169  contactCholeskyDecompositionSolveInPlaceCall(contact_chol_6D6D, rhs_vector);
170  }
171 }
172 BENCHMARK_REGISTER_F(DelassusFixture, CONTACT_CHOLESKY_DECOMPOSITION_SOLVE_IN_PLACE)
173  ->Apply(CustomArguments);
174 
175 // COLUMN_MAJOR_LLT_COMPUTE
176 
177 PINOCCHIO_DONT_INLINE static void
178 columnMajorLLTComputeCall(Eigen::LLT<Eigen::MatrixXd> & llt, const Eigen::MatrixXd & m)
179 {
180  llt.compute(m);
181 }
182 
183 BENCHMARK_DEFINE_F(DelassusFixture, COLUMN_MAJOR_LLT_COMPUTE)(benchmark::State & st)
184 {
185  Eigen::LLT<Eigen::MatrixXd> col_major_llt(num_constraints);
186  for (auto _ : st)
187  {
188  columnMajorLLTComputeCall(col_major_llt, col_major_square_matrices);
189  }
190 }
191 BENCHMARK_REGISTER_F(DelassusFixture, COLUMN_MAJOR_LLT_COMPUTE)->Apply(CustomArguments);
192 
193 // COLUMN_MAJOR_LLT_SOLVE_IN_PLACE
194 
195 PINOCCHIO_DONT_INLINE static void
196 columnMajorLLTSolveInPlaceCall(Eigen::LLT<Eigen::MatrixXd> & llt, const Eigen::VectorXd & v)
197 {
198  llt.solveInPlace(v);
199 }
200 
201 BENCHMARK_DEFINE_F(DelassusFixture, COLUMN_MAJOR_LLT_SOLVE_IN_PLACE)(benchmark::State & st)
202 {
203  Eigen::LLT<Eigen::MatrixXd> col_major_llt(num_constraints);
204  Eigen::VectorXd rhs_vector = Eigen::VectorXd::Random(num_constraints);
205  col_major_llt.compute(col_major_square_matrices);
206  for (auto _ : st)
207  {
208  columnMajorLLTSolveInPlaceCall(col_major_llt, rhs_vector);
209  }
210 }
211 BENCHMARK_REGISTER_F(DelassusFixture, COLUMN_MAJOR_LLT_SOLVE_IN_PLACE)->Apply(CustomArguments);
212 
213 // GET_KKT_CONTACT_DYNAMIC_MATRIX_INVERSE
214 
216  const pinocchio::Model & model,
218  const Eigen::MatrixXd & J,
219  const Eigen::MatrixXd & MJtJ_inv)
220 {
223 }
224 
225 BENCHMARK_DEFINE_F(DelassusFixture, GET_KKT_CONTACT_DYNAMIC_MATRIX_INVERSE)(benchmark::State & st)
226 {
227  Eigen::MatrixXd J(contact_chol_6D6D.constraintDim(), model.nv);
228  J.setZero();
229 
230  Eigen::MatrixXd MJtJ_inv(
231  model.nv + contact_chol_6D6D.constraintDim(), model.nv + contact_chol_6D6D.constraintDim());
232  MJtJ_inv.setZero();
233 
234  Eigen::VectorXd gamma(contact_chol_6D6D.constraintDim());
235  gamma.setZero();
236 
238  getJointJacobian(model, data, ci_RF_6D->joint1_id, ci_RF_6D->reference_frame, J.middleRows<6>(0));
239  getJointJacobian(model, data, ci_LF_6D->joint1_id, ci_LF_6D->reference_frame, J.middleRows<6>(6));
240  forwardDynamics(model, data, q, v, tau, J, gamma);
241 
242  for (auto _ : st)
243  {
245  }
246 }
247 BENCHMARK_REGISTER_F(DelassusFixture, GET_KKT_CONTACT_DYNAMIC_MATRIX_INVERSE)
248  ->Apply(CustomArguments);
249 
250 // COMPUTE_DAMPED_DELASSUS_MATRIX_INVERSE
251 
253  const pinocchio::Model & model,
255  const Eigen::VectorXd & q,
258  const Eigen::MatrixXd & damped_delassus_inverse)
259 {
261  model, data, q, contact_models, contact_data, damped_delassus_inverse, 1e-6);
262 }
263 
264 BENCHMARK_DEFINE_F(DelassusFixture, COMPUTE_DAMPED_DELASSUS_MATRIX_INVERSE)(benchmark::State & st)
265 {
266  Eigen::MatrixXd H_inverse(contact_chol_6D6D.size(), contact_chol_6D6D.size());
267 
269  contact_chol_6D6D.compute(model, data, contact_models_6D6D, contact_data_6D6D, 1e-6);
270  contact_chol_6D6D.inverse(H_inverse);
271 
272  Eigen::MatrixXd damped_delassus_inverse;
273  damped_delassus_inverse.resize(
274  contact_chol_6D6D.constraintDim(), contact_chol_6D6D.constraintDim());
275 
276  initPvDelassus(model, data, contact_models_6D6D); // Allocate memory
277 
278  for (auto _ : st)
279  {
281  model, data, q, contact_models_6D6D, contact_data_6D6D, damped_delassus_inverse);
282  }
283 }
284 BENCHMARK_REGISTER_F(DelassusFixture, COMPUTE_DAMPED_DELASSUS_MATRIX_INVERSE)
285  ->Apply(CustomArguments);
286 
287 // COMPUTE_DAMPED_DELASSUS_MATRIX_INVERSE_NO_SCALE_NO_PV
288 
290  const pinocchio::Model & model,
292  const Eigen::VectorXd & q,
295  const Eigen::MatrixXd & damped_delassus_inverse)
296 {
298  model, data, q, contact_models, contact_data, damped_delassus_inverse, 1e-6, false, false);
299 }
300 
301 BENCHMARK_DEFINE_F(DelassusFixture, COMPUTE_DAMPED_DELASSUS_MATRIX_INVERSE_NO_SCALE_NO_PV)(
302  benchmark::State & st)
303 {
304  Eigen::MatrixXd H_inverse(contact_chol_6D6D.size(), contact_chol_6D6D.size());
305 
307  contact_chol_6D6D.compute(model, data, contact_models_6D6D, contact_data_6D6D, 1e-6);
308  contact_chol_6D6D.inverse(H_inverse);
309 
310  Eigen::MatrixXd damped_delassus_inverse;
311  damped_delassus_inverse.resize(
312  contact_chol_6D6D.constraintDim(), contact_chol_6D6D.constraintDim());
313 
314  initPvDelassus(model, data, contact_models_6D6D); // Allocate memory
315 
316  for (auto _ : st)
317  {
319  model, data, q, contact_models_6D6D, contact_data_6D6D, damped_delassus_inverse);
320  }
321 }
322 BENCHMARK_REGISTER_F(DelassusFixture, COMPUTE_DAMPED_DELASSUS_MATRIX_INVERSE_NO_SCALE_NO_PV)
323  ->Apply(CustomArguments);
324 
pinocchio::computeDampedDelassusMatrixInverse
void computeDampedDelassusMatrixInverse(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q, const std::vector< RigidConstraintModelTpl< Scalar, Options >, ModelAllocator > &contact_models, std::vector< RigidConstraintDataTpl< Scalar, Options >, DataAllocator > &contact_data, const Eigen::MatrixBase< MatrixType > &damped_delassus_inverse, const Scalar mu, const bool scaled=false, const bool Pv=true)
Computes the inverse of the Delassus matrix associated to a set of given constraints.
pinocchio::getKKTContactDynamicMatrixInverse
PINOCCHIO_DEPRECATED void getKKTContactDynamicMatrixInverse(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, const DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConstraintMatrixType > &J, const Eigen::MatrixBase< KKTMatrixType > &KKTMatrix_inv)
Computes the inverse of the KKT matrix for dynamics with contact constraints.
test-cpp2pybind11.m
m
Definition: test-cpp2pybind11.py:25
pinocchio::ModelTpl::frames
FrameVector frames
Vector of operational frames registered on the model.
Definition: multibody/model.hpp:193
DelassusFixture
Definition: timings-delassus-operations.cpp:26
pinocchio::DataTpl
Definition: context/generic.hpp:25
delassus.hpp
PINOCCHIO_DONT_INLINE
#define PINOCCHIO_DONT_INLINE
Function attribute to forbid inlining. This is a compiler hint that can be not respected.
Definition: include/pinocchio/macros.hpp:53
pinocchio::ProximalSettingsTpl::mu
Scalar mu
Regularization parameter of the proximal algorithm.
Definition: algorithm/proximal.hpp:95
PINOCCHIO_BENCHMARK_MAIN
PINOCCHIO_BENCHMARK_MAIN()
ModelFixture::model
pinocchio::Model model
Definition: model-fixture.hpp:79
DelassusFixture::col_major_square_matrices
Eigen::MatrixXd col_major_square_matrices
Definition: timings-delassus-operations.cpp:78
ModelFixture::TearDown
void TearDown(benchmark::State &)
Definition: model-fixture.hpp:51
ModelFixture
Definition: model-fixture.hpp:37
contact-cholesky.contact_data
list contact_data
Definition: contact-cholesky.py:33
kinematics.hpp
rnea-derivatives.hpp
setup.data
data
Definition: cmake/cython/setup.in.py:48
inverse-kinematics-3d.J
J
Definition: inverse-kinematics-3d.py:28
pinocchio::initPvDelassus
void initPvDelassus(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const std::vector< RigidConstraintModelTpl< Scalar, Options >, Allocator > &contact_models)
CustomArguments
static void CustomArguments(benchmark::internal::Benchmark *b)
Definition: timings-delassus-operations.cpp:81
DelassusFixture::contact_chol_6D6D
pinocchio::ContactCholeskyDecomposition contact_chol_6D6D
Definition: timings-delassus-operations.cpp:72
contactCholeskyDecompositionComputeCall
static PINOCCHIO_DONT_INLINE void contactCholeskyDecompositionComputeCall(pinocchio::ContactCholeskyDecomposition &contact, const pinocchio::Model &model, pinocchio::Data &data, const PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR(pinocchio::RigidConstraintModel) &contact_models_6D6D, PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR(pinocchio::RigidConstraintData) &contact_data_6D6D)
Definition: timings-delassus-operations.cpp:88
pinocchio::CONTACT_6D
@ CONTACT_6D
Point contact model.
Definition: algorithm/contact-info.hpp:22
rnea.hpp
aba-derivatives.hpp
b
Vec3f b
ModelFixture::SetUp
void SetUp(benchmark::State &)
Definition: model-fixture.hpp:39
aba.hpp
anymal-simulation.model
model
Definition: anymal-simulation.py:8
forward-dynamics-derivatives.tau
tau
Definition: forward-dynamics-derivatives.py:25
joint-configuration.hpp
pinocchio::ProximalSettingsTpl
Structure containing all the settings parameters for the proximal algorithms.
Definition: algorithm/fwd.hpp:13
computeDampedDelassusMatrixInverseCall
static PINOCCHIO_DONT_INLINE void computeDampedDelassusMatrixInverseCall(const pinocchio::Model &model, pinocchio::Data &data, const Eigen::VectorXd &q, const PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR(pinocchio::RigidConstraintModel) &contact_models, PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR(pinocchio::RigidConstraintData) &contact_data, const Eigen::MatrixXd &damped_delassus_inverse)
Definition: timings-delassus-operations.cpp:252
pinocchio::RigidConstraintModelTpl
Definition: algorithm/constraints/fwd.hpp:14
model-fixture.hpp
pinocchio::getJointJacobian
void getJointJacobian(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, const DataTpl< Scalar, Options, JointCollectionTpl > &data, const JointIndex joint_id, const ReferenceFrame reference_frame, const Eigen::MatrixBase< Matrix6Like > &J)
Computes the Jacobian of a specific joint frame expressed in one of the pinocchio::ReferenceFrame opt...
pinocchio::ModelTpl::getFrameId
FrameIndex getFrameId(const std::string &name, const FrameType &type=(FrameType)(JOINT|FIXED_JOINT|BODY|OP_FRAME|SENSOR)) const
Returns the index of a frame given by its name.
urdf.hpp
pinocchio::forwardDynamics
const PINOCCHIO_DEPRECATED DataTpl< Scalar, Options, JointCollectionTpl >::TangentVectorType & forwardDynamics(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 > &tau, const Eigen::MatrixBase< ConstraintMatrixType > &J, const Eigen::MatrixBase< DriftVectorType > &gamma, const Scalar inv_damping=0.)
Compute the forward dynamics with contact constraints. Internally, pinocchio::computeAllTerms is call...
pinocchio::RigidConstraintDataTpl
Definition: algorithm/constraints/fwd.hpp:16
cartpole.v
v
Definition: cartpole.py:153
DelassusFixture::ci_LF_6D
std::unique_ptr< pinocchio::RigidConstraintModel > ci_LF_6D
Definition: timings-delassus-operations.cpp:67
inverse-dynamics._
_
Definition: inverse-dynamics.py:22
q
q
contactCholeskyDecompositionSolveInPlaceCall
static PINOCCHIO_DONT_INLINE void contactCholeskyDecompositionSolveInPlaceCall(pinocchio::ContactCholeskyDecomposition &contact, const Eigen::VectorXd &rhs_vector)
Definition: timings-delassus-operations.cpp:155
PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR
#define PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR(T)
Definition: container/aligned-vector.hpp:13
columnMajorLLTComputeCall
static PINOCCHIO_DONT_INLINE void columnMajorLLTComputeCall(Eigen::LLT< Eigen::MatrixXd > &llt, const Eigen::MatrixXd &m)
Definition: timings-delassus-operations.cpp:178
cholesky.hpp
BENCHMARK_REGISTER_F
BENCHMARK_REGISTER_F(DelassusFixture, COLUMN_MAJOR_LLT_COMPUTE) -> Apply(CustomArguments)
pinocchio::cholesky::decompose
const DataTpl< Scalar, Options, JointCollectionTpl >::MatrixXs & decompose(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data)
Compute the Cholesky decomposition of the joint space inertia matrix M contained in data.
DelassusFixture::PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR
PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR(pinocchio::RigidConstraintModel) contact_models_6D6D
simulation-contact-dynamics.num_constraints
num_constraints
Definition: simulation-contact-dynamics.py:72
llt
llt
contactCholeskyDecompositionUpdateDampingCall
static PINOCCHIO_DONT_INLINE void contactCholeskyDecompositionUpdateDampingCall(pinocchio::ContactCholeskyDecomposition &contact, double damping)
Definition: timings-delassus-operations.cpp:134
DelassusFixture::num_constraints
int num_constraints
Definition: timings-delassus-operations.cpp:76
pinocchio::ContactCholeskyDecomposition
ContactCholeskyDecompositionTpl< context::Scalar, context::Options > ContactCholeskyDecomposition
Definition: algorithm/fwd.hpp:17
columnMajorLLTSolveInPlaceCall
static PINOCCHIO_DONT_INLINE void columnMajorLLTSolveInPlaceCall(Eigen::LLT< Eigen::MatrixXd > &llt, const Eigen::VectorXd &v)
Definition: timings-delassus-operations.cpp:196
pinocchio::ProximalSettingsTpl::max_iter
int max_iter
Maximal number of iterations.
Definition: algorithm/proximal.hpp:98
kinematics-derivatives.hpp
contact-cholesky.contact_models
list contact_models
Definition: contact-cholesky.py:22
DelassusFixture::SetUp
void SetUp(benchmark::State &st)
Definition: timings-delassus-operations.cpp:28
pinocchio::ContactCholeskyDecompositionTpl< context::Scalar, context::Options >
contact-dynamics.hpp
sample-models.hpp
pinocchio::ModelTpl< context::Scalar, context::Options >
BENCHMARK_DEFINE_F
BENCHMARK_DEFINE_F(DelassusFixture, CONTACT_CHOLESKY_DECOMPOSITION_COMPUTE)(benchmark
Definition: timings-delassus-operations.cpp:99
constrained-dynamics.hpp
crba.hpp
DelassusFixture::TearDown
void TearDown(benchmark::State &st)
Definition: timings-delassus-operations.cpp:61
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...
DelassusFixture::prox_settings
pinocchio::ProximalSettings prox_settings
Definition: timings-delassus-operations.cpp:74
contactCholeskyDecompositionInverseCall
static PINOCCHIO_DONT_INLINE void contactCholeskyDecompositionInverseCall(pinocchio::ContactCholeskyDecomposition &contact, Eigen::MatrixXd &H_inverse)
Definition: timings-delassus-operations.cpp:113
computeDampedDelassusMatrixInverseNoScaleNoPvCall
static PINOCCHIO_DONT_INLINE void computeDampedDelassusMatrixInverseNoScaleNoPvCall(const pinocchio::Model &model, pinocchio::Data &data, const Eigen::VectorXd &q, const PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR(pinocchio::RigidConstraintModel) &contact_models, PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR(pinocchio::RigidConstraintData) &contact_data, const Eigen::MatrixXd &damped_delassus_inverse)
Definition: timings-delassus-operations.cpp:289
DelassusFixture::ci_RF_6D
std::unique_ptr< pinocchio::RigidConstraintModel > ci_RF_6D
Definition: timings-delassus-operations.cpp:66
getKKTContactDynamicMatrixInverseCall
static PINOCCHIO_DONT_INLINE void getKKTContactDynamicMatrixInverseCall(const pinocchio::Model &model, pinocchio::Data &data, const Eigen::MatrixXd &J, const Eigen::MatrixXd &MJtJ_inv)
Definition: timings-delassus-operations.cpp:215
pinocchio::LOCAL
@ LOCAL
Definition: multibody/fwd.hpp:50


pinocchio
Author(s):
autogenerated on Wed Apr 16 2025 02:41:51