6#include <pinocchio/multibody/model.hpp>
7#include <proxsuite-nlp/modelling/spaces/multibody.hpp>
8#include <pinocchio/multibody/data.hpp>
10#ifdef ALIGATOR_PINOCCHIO_V3
11#include <pinocchio/algorithm/proximal.hpp>
15template <
typename Scalar>
struct ContactForceDataTpl;
22template <
typename _Scalar>
23struct ContactForceResidualTpl : StageFunctionTpl<_Scalar>, frame_api {
25 using Scalar = _Scalar;
27 using Base = StageFunctionTpl<Scalar>;
28 using BaseData =
typename Base::Data;
29 using Model = pinocchio::ModelTpl<Scalar>;
30 using SE3 = pinocchio::SE3Tpl<Scalar>;
31 using Data = ContactForceDataTpl<Scalar>;
32 using RigidConstraintModelVector = PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR(
33 pinocchio::RigidConstraintModel);
34 using RigidConstraintDataVector =
35 PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR(pinocchio::RigidConstraintData);
36 using ProxSettings = pinocchio::ProximalSettingsTpl<Scalar>;
39 MatrixXs actuation_matrix_;
40 RigidConstraintModelVector constraint_models_;
41 ProxSettings prox_settings_;
45 ContactForceResidualTpl(
const int ndx,
const Model &model,
46 const MatrixXs &actuation,
47 const RigidConstraintModelVector &constraint_models,
48 const ProxSettings &prox_settings,
49 const Vector6s &fref,
const int contact_id)
50 : Base(ndx, (int)actuation.cols(), 6), pin_model_(model),
51 actuation_matrix_(actuation), constraint_models_(constraint_models),
52 prox_settings_(prox_settings), fref_(fref), contact_id_(contact_id) {
53 if (model.nv != actuation.rows()) {
55 fmt::format(
"actuation matrix should have number of rows = pinocchio "
56 "model nv ({} and {}).",
57 actuation.rows(), model.nv));
61 const Vector6s &getReference()
const {
return fref_; }
62 void setReference(
const Eigen::Ref<const Vector6s> &fnew) { fref_ = fnew; }
64 void evaluate(
const ConstVectorRef &x,
const ConstVectorRef &u,
65 const ConstVectorRef &, BaseData &data)
const;
67 void computeJacobians(
const ConstVectorRef &,
const ConstVectorRef &,
68 const ConstVectorRef &, BaseData &data)
const;
70 shared_ptr<BaseData> createData()
const {
71 return allocate_shared_eigen_aligned<Data>(
this);
75template <
typename Scalar>
76struct ContactForceDataTpl : StageFunctionDataTpl<Scalar> {
77 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
78 using Base = StageFunctionDataTpl<Scalar>;
79 using PinData = pinocchio::DataTpl<Scalar>;
80 using VectorXs =
typename math_types<Scalar>::VectorXs;
81 using MatrixXs =
typename math_types<Scalar>::MatrixXs;
82 using RigidConstraintDataVector =
83 PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR(pinocchio::RigidConstraintData);
89 RigidConstraintDataVector constraint_datas_;
90 pinocchio::ProximalSettingsTpl<Scalar> settings;
92 ContactForceDataTpl(
const ContactForceResidualTpl<Scalar> *model);
97#include "aligator/modelling/multibody/contact-force.hxx"
99#ifdef ALIGATOR_ENABLE_TEMPLATE_INSTANTIATION
100#include "./contact-force.txx"
#define ALIGATOR_DOMAIN_ERROR(msg)
Base definitions for ternary functions.
#define ALIGATOR_DYNAMIC_TYPEDEFS(Scalar)
pinocchio::DataTpl< Scalar, Options > PinData