27 typedef ::casadi::SX ADScalar;
28 typedef ::casadi::SXVector ADSVector;
29 typedef ::casadi::DM DMMatrix;
30 typedef ::casadi::DMVector DMVector;
46 typedef typename Data::MatrixXs MatrixXs;
47 typedef typename Data::VectorXs VectorXs;
48 typedef typename Data::RowMatrixXs RowMatrixXs;
50 typedef ::casadi::Function ADFun;
54 const std::string & filename,
55 const std::string & libname,
56 const std::string & fun_name)
62 , cg_generated(filename)
79 cg_generated.add(ad_fun);
80 fun_operation_count = ad_fun.n_instructions() - ad_fun.nnz_in() - ad_fun.nnz_out();
83 cg_generated.add(ad_fun_derivs);
84 fun_derivs_operation_count =
85 ad_fun_derivs.n_instructions() - ad_fun_derivs.nnz_in() - ad_fun_derivs.nnz_out();
87 cg_generated.generate();
92 std::ifstream
file((libname +
".so").
c_str());
99 "clang -fPIC -shared -Ofast -DNDEBUG " + filename +
".c -o " + libname +
".so";
103 "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"
104 "Developer/SDKs/MacOSX.sdk";
110 std::cerr <<
"Compilation failed" << std::endl;
114 void loadLib(
const bool generate_if_not_exist =
true)
116 if (!existLib() && generate_if_not_exist)
119 fun = ::casadi::external(fun_name,
"./" + libname +
".so");
122 fun_derivs = ::casadi::external(fun_name +
"_derivs",
"./" + libname +
".so");
126 casadi_int getFunOperationCount()
const
128 return fun_operation_count;
131 casadi_int getFunDerivsOperationCount()
const
133 return fun_derivs_operation_count;
139 std::string filename, libname, fun_name;
140 ::casadi::CodeGenerator cg_generated;
147 ADFun ad_fun, ad_fun_derivs;
148 ADFun fun, fun_derivs;
149 std::vector<DMMatrix> fun_output, fun_output_derivs;
150 casadi_int fun_operation_count, fun_derivs_operation_count;
157 typedef typename Base::Scalar Scalar;
159 typedef typename Base::TangentVectorType TangentVectorType;
160 typedef typename Base::RowMatrixXs RowMatrixXs;
161 typedef typename Base::VectorXs VectorXs;
162 typedef typename Base::MatrixXs MatrixXs;
164 typedef typename Base::ADFun ADFun;
165 typedef typename Base::DMVector DMVector;
166 typedef typename Base::DMMatrix DMMatrix;
167 typedef typename Base::ADScalar ADScalar;
168 typedef typename Base::ADSVector ADSVector;
169 typedef typename Base::ADConfigVectorType ADConfigVectorType;
170 typedef typename Base::ADTangentVectorType ADTangentVectorType;
174 const std::string & filename =
"casadi_aba",
175 const std::string & libname =
"libcasadi_cg_aba",
176 const std::string & fun_name =
"eval_f")
177 :
Base(model, filename, libname, fun_name)
179 , ddq_dq(model.nv, model.nv)
180 , ddq_dv(model.nv, model.nv)
181 , ddq_dtau(model.nv, model.nv)
182 , cs_q(ADScalar::sym(
"q", model.nq))
183 , cs_v(ADScalar::sym(
"v", model.nv))
184 , cs_tau(ADScalar::sym(
"tau", model.nv))
185 , cs_v_int(ADScalar::sym(
"v_inc", model.nv))
186 , cs_ddq(model.nv, 1)
192 , q_vec((
size_t)model.nq)
193 , v_vec((
size_t)model.nv)
194 , v_int_vec((
size_t)model.nv)
195 , tau_vec((
size_t)model.nv)
197 q_ad = Eigen::Map<ADConfigVectorType>(
198 static_cast<std::vector<ADScalar>
>(cs_q).data(), model.nq, 1);
199 v_int_ad = Eigen::Map<ADConfigVectorType>(
200 static_cast<std::vector<ADScalar>
>(cs_v_int).data(), model.nv, 1);
201 v_ad = Eigen::Map<ADTangentVectorType>(
202 static_cast<std::vector<ADScalar>
>(cs_v).data(), model.nv, 1);
203 tau_ad = Eigen::Map<ADTangentVectorType>(
204 static_cast<std::vector<ADScalar>
>(cs_tau).data(), model.nv, 1);
206 Eigen::Map<TangentVectorType>(v_int_vec.data(), model.nv, 1).setZero();
220 pinocchio::casadi::copy(ad_data.
ddq, cs_ddq);
222 cs_ddq_dq = jacobian(cs_ddq, cs_v_int);
223 cs_ddq_dv = jacobian(cs_ddq, cs_v);
224 cs_ddq_dtau = jacobian(cs_ddq, cs_tau);
226 ad_fun = ADFun(fun_name, ADSVector{cs_q, cs_v_int, cs_v, cs_tau}, ADSVector{cs_ddq});
228 ad_fun_derivs = ADFun(
229 fun_name +
"_derivs", ADSVector{cs_q, cs_v_int, cs_v, cs_tau},
230 ADSVector{cs_ddq_dq, cs_ddq_dv, cs_ddq_dtau});
233 template<
typename ConfigVectorType1,
typename TangentVectorType1,
typename TangentVectorType2>
235 const Eigen::MatrixBase<ConfigVectorType1> & q,
236 const Eigen::MatrixBase<TangentVectorType1> & v,
237 const Eigen::MatrixBase<TangentVectorType2> & tau)
239 Eigen::Map<ConfigVectorType1>(q_vec.data(), ad_model.
nq, 1) = q;
240 Eigen::Map<TangentVectorType1>(v_vec.data(), ad_model.
nv, 1) = v;
241 Eigen::Map<TangentVectorType2>(tau_vec.data(), ad_model.
nv, 1) = tau;
242 fun_output = fun(DMVector{q_vec, v_int_vec, v_vec, tau_vec});
243 ddq = Eigen::Map<TangentVectorType>(
244 static_cast<std::vector<Scalar>
>(fun_output[0]).data(), ad_model.
nv, 1);
247 template<
typename ConfigVectorType1,
typename TangentVectorType1,
typename TangentVectorType2>
249 const Eigen::MatrixBase<ConfigVectorType1> & q,
250 const Eigen::MatrixBase<TangentVectorType1> & v,
251 const Eigen::MatrixBase<TangentVectorType2> & tau)
253 Eigen::Map<ConfigVectorType1>(q_vec.data(), ad_model.
nq, 1) = q;
254 Eigen::Map<TangentVectorType1>(v_vec.data(), ad_model.
nv, 1) = v;
255 Eigen::Map<TangentVectorType2>(tau_vec.data(), ad_model.
nv, 1) = tau;
256 fun_output_derivs = fun_derivs(DMVector{q_vec, v_int_vec, v_vec, tau_vec});
258 ddq_dq = Eigen::Map<MatrixXs>(
259 static_cast<std::vector<Scalar>
>(fun_output_derivs[0]).data(), ad_model.
nv, ad_model.
nv);
260 ddq_dv = Eigen::Map<MatrixXs>(
261 static_cast<std::vector<Scalar>
>(fun_output_derivs[1]).data(), ad_model.
nv, ad_model.
nv);
262 ddq_dtau = Eigen::Map<MatrixXs>(
263 static_cast<std::vector<Scalar>
>(fun_output_derivs[2]).data(), ad_model.
nv, ad_model.
nv);
266 TangentVectorType ddq;
267 RowMatrixXs ddq_dq, ddq_dv, ddq_dtau;
271 using Base::ad_model;
272 using Base::cg_generated;
273 using Base::filename;
274 using Base::fun_name;
278 using Base::ad_fun_derivs;
280 using Base::fun_derivs;
281 using Base::fun_output;
282 using Base::fun_output_derivs;
284 ADScalar cs_q, cs_v, cs_tau, cs_v_int, cs_ddq;
287 ADScalar cs_ddq_dq, cs_ddq_dv, cs_ddq_dtau;
289 ADConfigVectorType q_ad, q_int_ad;
290 ADTangentVectorType v_ad, v_int_ad, tau_ad;
292 std::vector<Scalar> q_vec, v_vec, v_int_vec, tau_vec;
300 typedef typename Base::Scalar Scalar;
302 typedef typename Base::TangentVectorType TangentVectorType;
303 typedef typename Base::RowMatrixXs RowMatrixXs;
304 typedef typename Base::VectorXs VectorXs;
305 typedef typename Base::MatrixXs MatrixXs;
307 typedef typename Base::ADFun ADFun;
308 typedef typename Base::DMVector DMVector;
309 typedef typename Base::DMMatrix DMMatrix;
310 typedef typename Base::ADScalar ADScalar;
311 typedef typename Base::ADSVector ADSVector;
312 typedef typename Base::ADConfigVectorType ADConfigVectorType;
313 typedef typename Base::ADTangentVectorType ADTangentVectorType;
317 const std::string & filename =
"casadi_abaDerivs",
318 const std::string & libname =
"libcasadi_cg_abaDerivs",
319 const std::string & fun_name =
"eval_f")
320 :
Base(model, filename, libname, fun_name)
321 , cs_q(ADScalar::sym(
"q", model.nq))
322 , cs_v(ADScalar::sym(
"v", model.nv))
323 , cs_tau(ADScalar::sym(
"tau", model.nv))
327 , cs_ddq(model.nv, 1)
328 , q_vec((
size_t)model.nq)
329 , v_vec((
size_t)model.nv)
330 , tau_vec((
size_t)model.nv)
332 , ddq_dq(model.nv, model.nv)
333 , ddq_dv(model.nv, model.nv)
334 , ddq_dtau(model.nv, model.nv)
336 q_ad = Eigen::Map<ADConfigVectorType>(
337 static_cast<std::vector<ADScalar>
>(cs_q).data(), model.nq, 1);
338 v_ad = Eigen::Map<ADTangentVectorType>(
339 static_cast<std::vector<ADScalar>
>(cs_v).data(), model.nv, 1);
340 tau_ad = Eigen::Map<ADTangentVectorType>(
341 static_cast<std::vector<ADScalar>
>(cs_tau).data(), model.nv, 1);
357 pinocchio::casadi::copy(ad_data.
ddq, cs_ddq);
358 pinocchio::casadi::copy(ad_data.
ddq_dq, cs_ddq_dq);
359 pinocchio::casadi::copy(ad_data.
ddq_dv, cs_ddq_dv);
360 pinocchio::casadi::copy(ad_data.
Minv, cs_ddq_dtau);
363 fun_name, ADSVector{cs_q, cs_v, cs_tau},
364 ADSVector{cs_ddq, cs_ddq_dq, cs_ddq_dv, cs_ddq_dtau});
367 template<
typename ConfigVectorType1,
typename TangentVectorType1,
typename TangentVectorType2>
369 const Eigen::MatrixBase<ConfigVectorType1> & q,
370 const Eigen::MatrixBase<TangentVectorType1> & v,
371 const Eigen::MatrixBase<TangentVectorType2> & tau)
373 Eigen::Map<ConfigVectorType1>(q_vec.data(), ad_model.
nq, 1) = q;
374 Eigen::Map<TangentVectorType1>(v_vec.data(), ad_model.
nv, 1) = v;
375 Eigen::Map<TangentVectorType2>(tau_vec.data(), ad_model.
nv, 1) = tau;
376 fun_output = fun(DMVector{q_vec, v_vec, tau_vec});
378 ddq = Eigen::Map<TangentVectorType>(
379 static_cast<std::vector<Scalar>
>(fun_output[0]).data(), ad_model.
nv, 1);
380 ddq_dq = Eigen::Map<MatrixXs>(
381 static_cast<std::vector<Scalar>
>(fun_output[1]).data(), ad_model.
nv, ad_model.
nv);
382 ddq_dv = Eigen::Map<MatrixXs>(
383 static_cast<std::vector<Scalar>
>(fun_output[2]).data(), ad_model.
nv, ad_model.
nv);
384 ddq_dtau = Eigen::Map<MatrixXs>(
385 static_cast<std::vector<Scalar>
>(fun_output[3]).data(), ad_model.
nv, ad_model.
nv);
388 TangentVectorType ddq;
389 RowMatrixXs ddq_dq, ddq_dv, ddq_dtau;
393 using Base::ad_model;
394 using Base::cg_generated;
395 using Base::filename;
396 using Base::fun_name;
400 using Base::ad_fun_derivs;
402 using Base::fun_derivs;
403 using Base::fun_output;
404 using Base::fun_output_derivs;
406 ADScalar cs_q, cs_v, cs_tau, cs_ddq;
408 ADScalar cs_ddq_dq, cs_ddq_dv, cs_ddq_dtau;
410 ADConfigVectorType q_ad;
411 ADTangentVectorType v_ad, tau_ad;
412 std::vector<Scalar> q_vec, v_vec, tau_vec;
419 typedef typename Base::Scalar Scalar;
420 typedef typename Base::ADScalar ADScalar;
421 typedef typename Base::ADSVector ADSVector;
423 typedef typename Base::TangentVectorType TangentVectorType;
424 typedef typename Base::RowMatrixXs RowMatrixXs;
425 typedef typename Base::VectorXs VectorXs;
426 typedef typename Base::MatrixXs MatrixXs;
428 typedef typename Base::ADFun ADFun;
429 typedef typename Base::DMVector DMVector;
430 typedef typename Base::DMMatrix DMMatrix;
431 typedef typename Base::ADConfigVectorType ADConfigVectorType;
432 typedef typename Base::ADTangentVectorType ADTangentVectorType;
435 typedef Eigen::aligned_allocator<ConstraintModel> ConstraintModelAllocator;
436 typedef typename std::vector<ConstraintModel, ConstraintModelAllocator> ConstraintModelVector;
438 typedef Eigen::aligned_allocator<ConstraintData> ConstraintDataAllocator;
439 typedef typename std::vector<ConstraintData, ConstraintDataAllocator> ConstraintDataVector;
443 typedef Eigen::aligned_allocator<ADConstraintModel> ADConstraintModelAllocator;
444 typedef typename std::vector<ADConstraintModel, ADConstraintModelAllocator>
445 ADConstraintModelVector;
447 typedef Eigen::aligned_allocator<ADConstraintData> ADConstraintDataAllocator;
448 typedef typename std::vector<ADConstraintData, ADConstraintDataAllocator>
449 ADConstraintDataVector;
451 static Eigen::DenseIndex constraintDim(
const ConstraintModelVector &
contact_models)
454 for (
typename ConstraintModelVector::const_iterator it =
contact_models.begin();
457 PINOCCHIO_CHECK_INPUT_ARGUMENT(
458 it->size() > 0,
"The dimension of the constraint must be positive");
467 const std::string & filename =
"casadi_contactDyn",
468 const std::string & libname =
"libcasadi_cg_contactDyn",
469 const std::string & fun_name =
"eval_f")
470 :
Base(model, filename, libname, fun_name)
472 , cs_q(ADScalar::sym(
"q", model.nq))
473 , cs_v(ADScalar::sym(
"v", model.nv))
474 , cs_tau(ADScalar::sym(
"tau", model.nv))
475 , cs_v_int(ADScalar::sym(
"v_inc", model.nv))
481 , cs_ddq(model.nv, 1)
482 , cs_lambda_c(model.nv, 1)
483 , q_vec((
size_t)model.nq)
484 , v_vec((
size_t)model.nv)
485 , v_int_vec((
size_t)model.nv)
486 , tau_vec((
size_t)model.nv)
488 , ddq_dq(model.nv, model.nv)
489 , ddq_dv(model.nv, model.nv)
490 , ddq_dtau(model.nv, model.nv)
494 dlambda_dq.resize(nc, model.nv);
495 dlambda_dq.setZero();
496 dlambda_dv.resize(nc, model.nv);
497 dlambda_dv.setZero();
498 dlambda_dtau.resize(nc, model.nv);
499 dlambda_dtau.setZero();
500 q_ad = Eigen::Map<ADConfigVectorType>(
501 static_cast<std::vector<ADScalar>
>(cs_q).data(), model.nq, 1);
502 v_int_ad = Eigen::Map<ADConfigVectorType>(
503 static_cast<std::vector<ADScalar>
>(cs_v_int).data(), model.nv, 1);
504 v_ad = Eigen::Map<ADTangentVectorType>(
505 static_cast<std::vector<ADScalar>
>(cs_v).data(), model.nv, 1);
506 tau_ad = Eigen::Map<ADTangentVectorType>(
507 static_cast<std::vector<ADScalar>
>(cs_tau).data(), model.nv, 1);
509 Eigen::Map<TangentVectorType>(v_int_vec.data(), model.nv, 1).setZero();
529 ad_model, ad_data, q_int_ad, v_ad, tau_ad, ad_contact_models, ad_contact_datas);
531 pinocchio::casadi::copy(ad_data.
ddq, cs_ddq);
532 pinocchio::casadi::copy(ad_data.
lambda_c, cs_lambda_c);
534 cs_ddq_dq = jacobian(cs_ddq, cs_v_int);
535 cs_ddq_dv = jacobian(cs_ddq, cs_v);
536 cs_ddq_dtau = jacobian(cs_ddq, cs_tau);
538 cs_lambda_dq = jacobian(cs_lambda_c, cs_v_int);
539 cs_lambda_dv = jacobian(cs_lambda_c, cs_v);
540 cs_lambda_dtau = jacobian(cs_lambda_c, cs_tau);
543 ADFun(fun_name, ADSVector{cs_q, cs_v_int, cs_v, cs_tau}, ADSVector{cs_ddq, cs_lambda_c});
544 ad_fun_derivs = ADFun(
545 fun_name +
"_derivs", ADSVector{cs_q, cs_v_int, cs_v, cs_tau},
546 ADSVector{cs_ddq_dq, cs_ddq_dv, cs_ddq_dtau, cs_lambda_dq, cs_lambda_dv, cs_lambda_dtau});
549 template<
typename ConfigVectorType1,
typename TangentVectorType1,
typename TangentVectorType2>
551 const Eigen::MatrixBase<ConfigVectorType1> & q,
552 const Eigen::MatrixBase<TangentVectorType1> & v,
553 const Eigen::MatrixBase<TangentVectorType2> & tau)
555 Eigen::Map<ConfigVectorType1>(q_vec.data(), ad_model.
nq, 1) = q;
556 Eigen::Map<TangentVectorType1>(v_vec.data(), ad_model.
nv, 1) = v;
557 Eigen::Map<TangentVectorType2>(tau_vec.data(), ad_model.
nv, 1) = tau;
558 fun_output = fun(DMVector{q_vec, v_int_vec, v_vec, tau_vec});
559 ddq = Eigen::Map<TangentVectorType>(
560 static_cast<std::vector<Scalar>
>(fun_output[0]).data(), ad_model.
nv, 1);
561 lambda_c = Eigen::Map<TangentVectorType>(
562 static_cast<std::vector<Scalar>
>(fun_output[1]).data(), nc, 1);
565 template<
typename ConfigVectorType1,
typename TangentVectorType1,
typename TangentVectorType2>
567 const Eigen::MatrixBase<ConfigVectorType1> & q,
568 const Eigen::MatrixBase<TangentVectorType1> & v,
569 const Eigen::MatrixBase<TangentVectorType2> & tau)
571 Eigen::Map<ConfigVectorType1>(q_vec.data(), ad_model.
nq, 1) = q;
572 Eigen::Map<TangentVectorType1>(v_vec.data(), ad_model.
nv, 1) = v;
573 Eigen::Map<TangentVectorType2>(tau_vec.data(), ad_model.
nv, 1) = tau;
574 fun_output_derivs = fun_derivs(DMVector{q_vec, v_int_vec, v_vec, tau_vec});
575 ddq_dq = Eigen::Map<MatrixXs>(
576 static_cast<std::vector<Scalar>
>(fun_output_derivs[0]).data(), ad_model.
nv, ad_model.
nv);
577 ddq_dv = Eigen::Map<MatrixXs>(
578 static_cast<std::vector<Scalar>
>(fun_output_derivs[1]).data(), ad_model.
nv, ad_model.
nv);
579 ddq_dtau = Eigen::Map<MatrixXs>(
580 static_cast<std::vector<Scalar>
>(fun_output_derivs[2]).data(), ad_model.
nv, ad_model.
nv);
581 dlambda_dq = Eigen::Map<MatrixXs>(
582 static_cast<std::vector<Scalar>
>(fun_output_derivs[3]).data(), nc, ad_model.
nv);
583 dlambda_dv = Eigen::Map<MatrixXs>(
584 static_cast<std::vector<Scalar>
>(fun_output_derivs[4]).data(), nc, ad_model.
nv);
585 dlambda_dtau = Eigen::Map<MatrixXs>(
586 static_cast<std::vector<Scalar>
>(fun_output_derivs[5]).data(), nc, ad_model.
nv);
589 TangentVectorType ddq;
591 RowMatrixXs ddq_dq, ddq_dv, ddq_dtau, dlambda_dq, dlambda_dv, dlambda_dtau;
595 using Base::ad_model;
596 using Base::cg_generated;
597 using Base::filename;
598 using Base::fun_name;
602 using Base::ad_fun_derivs;
604 using Base::fun_derivs;
605 using Base::fun_output;
606 using Base::fun_output_derivs;
608 ADConstraintModelVector ad_contact_models;
609 ADConstraintDataVector ad_contact_datas;
611 Eigen::DenseIndex nc;
612 ADScalar cs_q, cs_v, cs_tau, cs_v_int, cs_ddq, cs_lambda_c;
615 ADScalar cs_ddq_dq, cs_ddq_dv, cs_ddq_dtau, cs_lambda_dq, cs_lambda_dv, cs_lambda_dtau;
617 ADConfigVectorType q_ad, q_int_ad;
618 ADTangentVectorType v_ad, v_int_ad, tau_ad;
620 std::vector<Scalar> q_vec, v_vec, v_int_vec, tau_vec;
627 typedef typename Base::Scalar Scalar;
628 typedef typename Base::ADScalar ADScalar;
629 typedef typename Base::ADSVector ADSVector;
631 typedef typename Base::TangentVectorType TangentVectorType;
632 typedef typename Base::RowMatrixXs RowMatrixXs;
633 typedef typename Base::VectorXs VectorXs;
634 typedef typename Base::MatrixXs MatrixXs;
636 typedef typename Base::ADFun ADFun;
637 typedef typename Base::DMVector DMVector;
638 typedef typename Base::DMMatrix DMMatrix;
639 typedef typename Base::ADConfigVectorType ADConfigVectorType;
640 typedef typename Base::ADTangentVectorType ADTangentVectorType;
643 typedef Eigen::aligned_allocator<ConstraintModel> ConstraintModelAllocator;
644 typedef typename std::vector<ConstraintModel, ConstraintModelAllocator> ConstraintModelVector;
646 typedef Eigen::aligned_allocator<ConstraintData> ConstraintDataAllocator;
647 typedef typename std::vector<ConstraintData, ConstraintDataAllocator> ConstraintDataVector;
651 typedef Eigen::aligned_allocator<ADConstraintModel> ADConstraintModelAllocator;
652 typedef typename std::vector<ADConstraintModel, ADConstraintModelAllocator>
653 ADConstraintModelVector;
655 typedef Eigen::aligned_allocator<ADConstraintData> ADConstraintDataAllocator;
656 typedef typename std::vector<ADConstraintData, ADConstraintDataAllocator>
657 ADConstraintDataVector;
659 static Eigen::DenseIndex constraintDim(
const ConstraintModelVector &
contact_models)
662 for (
typename ConstraintModelVector::const_iterator it =
contact_models.begin();
665 PINOCCHIO_CHECK_INPUT_ARGUMENT(
666 it->size() > 0,
"The dimension of the constraint must be positive");
675 const std::string & filename =
"casadi_contactDynDerivs",
676 const std::string & libname =
"libcasadi_cg_contactDynDerivs",
677 const std::string & fun_name =
"eval_f")
678 :
Base(model, filename, libname, fun_name)
680 , cs_q(ADScalar::sym(
"q", model.nq))
681 , cs_v(ADScalar::sym(
"v", model.nv))
682 , cs_tau(ADScalar::sym(
"tau", model.nv))
686 , cs_ddq(model.nv, 1)
687 , cs_lambda_c(model.nv, 1)
688 , q_vec((
size_t)model.nq)
689 , v_vec((
size_t)model.nv)
690 , tau_vec((
size_t)model.nv)
692 , ddq_dq(model.nv, model.nv)
693 , ddq_dv(model.nv, model.nv)
694 , ddq_dtau(model.nv, model.nv)
698 dlambda_dq.resize(nc, model.nv);
699 dlambda_dq.setZero();
700 dlambda_dv.resize(nc, model.nv);
701 dlambda_dv.setZero();
702 dlambda_dtau.resize(nc, model.nv);
703 dlambda_dtau.setZero();
705 q_ad = Eigen::Map<ADConfigVectorType>(
706 static_cast<std::vector<ADScalar>
>(cs_q).data(), model.nq, 1);
707 v_ad = Eigen::Map<ADTangentVectorType>(
708 static_cast<std::vector<ADScalar>
>(cs_v).data(), model.nv, 1);
709 tau_ad = Eigen::Map<ADTangentVectorType>(
710 static_cast<std::vector<ADScalar>
>(cs_tau).data(), model.nv, 1);
729 ad_model, ad_data, q_ad, v_ad, tau_ad, ad_contact_models, ad_contact_datas);
730 pinocchio::computeConstraintDynamicsDerivatives(
731 ad_model, ad_data, ad_contact_models, ad_contact_datas);
733 pinocchio::casadi::copy(ad_data.
ddq, cs_ddq);
734 pinocchio::casadi::copy(ad_data.
lambda_c, cs_lambda_c);
735 pinocchio::casadi::copy(ad_data.
ddq_dq, cs_ddq_dq);
736 pinocchio::casadi::copy(ad_data.
ddq_dv, cs_ddq_dv);
737 pinocchio::casadi::copy(ad_data.
ddq_dtau, cs_ddq_dtau);
738 pinocchio::casadi::copy(ad_data.
dlambda_dq, cs_lambda_dq);
739 pinocchio::casadi::copy(ad_data.dlambda_dv, cs_lambda_dv);
740 pinocchio::casadi::copy(ad_data.dlambda_dtau, cs_lambda_dtau);
743 fun_name, ADSVector{cs_q, cs_v, cs_tau},
745 cs_ddq, cs_lambda_c, cs_ddq_dq, cs_ddq_dv, cs_ddq_dtau, cs_lambda_dq, cs_lambda_dv,
749 template<
typename ConfigVectorType1,
typename TangentVectorType1,
typename TangentVectorType2>
751 const Eigen::MatrixBase<ConfigVectorType1> & q,
752 const Eigen::MatrixBase<TangentVectorType1> & v,
753 const Eigen::MatrixBase<TangentVectorType2> & tau)
755 Eigen::Map<ConfigVectorType1>(q_vec.data(), ad_model.
nq, 1) = q;
756 Eigen::Map<TangentVectorType1>(v_vec.data(), ad_model.
nv, 1) = v;
757 Eigen::Map<TangentVectorType2>(tau_vec.data(), ad_model.
nv, 1) = tau;
758 fun_output = fun(DMVector{q_vec, v_vec, tau_vec});
759 ddq = Eigen::Map<TangentVectorType>(
760 static_cast<std::vector<Scalar>
>(fun_output[0]).data(), ad_model.
nv, 1);
761 lambda_c = Eigen::Map<TangentVectorType>(
762 static_cast<std::vector<Scalar>
>(fun_output[1]).data(), nc, 1);
763 ddq_dq = Eigen::Map<MatrixXs>(
764 static_cast<std::vector<Scalar>
>(fun_output[2]).data(), ad_model.
nv, ad_model.
nv);
765 ddq_dv = Eigen::Map<MatrixXs>(
766 static_cast<std::vector<Scalar>
>(fun_output[3]).data(), ad_model.
nv, ad_model.
nv);
767 ddq_dtau = Eigen::Map<MatrixXs>(
768 static_cast<std::vector<Scalar>
>(fun_output[4]).data(), ad_model.
nv, ad_model.
nv);
769 dlambda_dq = Eigen::Map<MatrixXs>(
770 static_cast<std::vector<Scalar>
>(fun_output[5]).data(), nc, ad_model.
nv);
771 dlambda_dv = Eigen::Map<MatrixXs>(
772 static_cast<std::vector<Scalar>
>(fun_output[6]).data(), nc, ad_model.
nv);
773 dlambda_dtau = Eigen::Map<MatrixXs>(
774 static_cast<std::vector<Scalar>
>(fun_output[7]).data(), nc, ad_model.
nv);
777 TangentVectorType ddq, lambda_c;
778 RowMatrixXs ddq_dq, ddq_dv, ddq_dtau, dlambda_dq, dlambda_dv, dlambda_dtau;
782 using Base::ad_model;
783 using Base::cg_generated;
784 using Base::filename;
785 using Base::fun_name;
789 using Base::ad_fun_derivs;
791 using Base::fun_derivs;
792 using Base::fun_output;
793 using Base::fun_output_derivs;
794 ADConstraintModelVector ad_contact_models;
795 ADConstraintDataVector ad_contact_datas;
797 Eigen::DenseIndex nc;
798 ADScalar cs_q, cs_v, cs_tau, cs_ddq, cs_lambda_c;
801 ADScalar cs_ddq_dq, cs_ddq_dv, cs_ddq_dtau, cs_lambda_dq, cs_lambda_dv, cs_lambda_dtau;
803 ADConfigVectorType q_ad;
804 ADTangentVectorType v_ad, tau_ad;
806 std::vector<Scalar> q_vec, v_vec, tau_vec;
const DataTpl< Scalar, Options, JointCollectionTpl >::TangentVectorType & constraintDynamics(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 std::vector< RigidConstraintModelTpl< Scalar, Options >, ConstraintModelAllocator > &contact_models, std::vector< RigidConstraintDataTpl< Scalar, Options >, ConstraintDataAllocator > &contact_datas, ProximalSettingsTpl< Scalar > &settings)
Computes the forward dynamics with contact constraints according to a given list of contact informati...