Crocoddyl
Loading...
Searching...
No Matches
contact-1d.hpp
1
2// BSD 3-Clause License
3//
4// Copyright (C) 2020-2026, LAAS-CNRS, University of Edinburgh,
5// Heriot-Watt University
6// Copyright note valid unless otherwise stated in individual files.
7// All rights reserved.
9
10#ifndef CROCODDYL_MULTIBODY_CONTACTS_CONTACT_1D_HPP_
11#define CROCODDYL_MULTIBODY_CONTACTS_CONTACT_1D_HPP_
12
13#include "crocoddyl/core/utils/conversions.hpp"
14#include "crocoddyl/multibody/contact-base.hpp"
15#include "crocoddyl/multibody/fwd.hpp"
16
17namespace crocoddyl {
18
19template <typename _Scalar>
21 public:
22 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
23 CROCODDYL_DERIVED_CAST(ContactModelBase, ContactModel1DTpl)
24
25 typedef _Scalar Scalar;
26 typedef MathBaseTpl<Scalar> MathBase;
28 typedef ContactData1DTpl<Scalar> Data;
29 typedef StateMultibodyTpl<Scalar> StateMultibody;
30 typedef ContactDataAbstractTpl<Scalar> ContactDataAbstract;
31 typedef typename MathBase::Vector2s Vector2s;
32 typedef typename MathBase::Vector3s Vector3s;
33 typedef typename MathBase::VectorXs VectorXs;
34 typedef typename MathBase::Matrix3s Matrix3s;
35
52 ContactModel1DTpl(std::shared_ptr<StateMultibody> state,
53 const pinocchio::FrameIndex id, const Scalar xref,
54 const pinocchio::ReferenceFrame type,
55 const Matrix3s& rotation, const std::size_t nu,
56 const Vector2s& gains = Vector2s::Zero());
57
73 ContactModel1DTpl(std::shared_ptr<StateMultibody> state,
74 const pinocchio::FrameIndex id, const Scalar xref,
75 const pinocchio::ReferenceFrame type,
76 const Vector2s& gains = Vector2s::Zero());
77
78 DEPRECATED(
79 "Use constructor that passes the type type of contact, this assumes is "
80 "pinocchio::LOCAL",
81 ContactModel1DTpl(std::shared_ptr<StateMultibody> state,
82 const pinocchio::FrameIndex id, const Scalar xref,
83 const std::size_t nu,
84 const Vector2s& gains = Vector2s::Zero());)
85 DEPRECATED(
86 "Use constructor that passes the type type of contact, this assumes is "
87 "pinocchio::LOCAL",
88 ContactModel1DTpl(std::shared_ptr<StateMultibody> state,
89 const pinocchio::FrameIndex id, const Scalar xref,
90 const Vector2s& gains = Vector2s::Zero());)
91 virtual ~ContactModel1DTpl() = default;
92
100 virtual void calc(const std::shared_ptr<ContactDataAbstract>& data,
101 const Eigen::Ref<const VectorXs>& x) override;
102
110 virtual void calcDiff(const std::shared_ptr<ContactDataAbstract>& data,
111 const Eigen::Ref<const VectorXs>& x) override;
112
119 virtual void updateForce(const std::shared_ptr<ContactDataAbstract>& data,
120 const VectorXs& force) override;
121
125 virtual std::shared_ptr<ContactDataAbstract> createData(
126 pinocchio::DataTpl<Scalar>* const data) override;
127
137 template <typename NewScalar>
139
143 const Scalar get_reference() const;
144
148 const Vector2s& get_gains() const;
149
153 const Matrix3s& get_axis_rotation() const;
154
158 void set_reference(const Scalar reference);
159
163 void set_axis_rotation(const Matrix3s& rotation);
164
170 virtual void print(std::ostream& os) const override;
171
172 protected:
173 using Base::id_;
174 using Base::nc_;
175 using Base::nu_;
176 using Base::state_;
177 using Base::type_;
178
179 private:
180 Scalar xref_;
181 Matrix3s Raxis_;
182 Vector2s gains_;
183};
184
185template <typename _Scalar>
186struct ContactData1DTpl : public ContactDataAbstractTpl<_Scalar> {
187 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
188
189 typedef _Scalar Scalar;
190 typedef MathBaseTpl<Scalar> MathBase;
191 typedef ContactDataAbstractTpl<Scalar> Base;
192 typedef typename MathBase::Matrix2s Matrix2s;
193 typedef typename MathBase::Matrix3s Matrix3s;
194 typedef typename MathBase::Matrix3xs Matrix3xs;
195 typedef typename MathBase::Matrix6xs Matrix6xs;
196 typedef typename MathBase::Vector3s Vector3s;
197 typedef typename pinocchio::MotionTpl<Scalar> Motion;
198 typedef typename pinocchio::ForceTpl<Scalar> Force;
199
200 template <template <typename Scalar> class Model>
201 ContactData1DTpl(Model<Scalar>* const model,
202 pinocchio::DataTpl<Scalar>* const data)
203 : Base(model, data),
204 v(Motion::Zero()),
205 f_local(Force::Zero()),
206 da0_local_dx(3, model->get_state()->get_ndx()),
207 fJf(6, model->get_state()->get_nv()),
208 v_partial_dq(6, model->get_state()->get_nv()),
209 a_partial_dq(6, model->get_state()->get_nv()),
210 a_partial_dv(6, model->get_state()->get_nv()),
211 a_partial_da(6, model->get_state()->get_nv()),
212 fXjdv_dq(6, model->get_state()->get_nv()),
213 fXjda_dq(6, model->get_state()->get_nv()),
214 fXjda_dv(6, model->get_state()->get_nv()),
215 fJf_df(3, model->get_state()->get_nv()) {
216 frame = model->get_id();
217 jMf = model->get_state()->get_pinocchio()->frames[frame].placement;
218 fXj = jMf.inverse().toActionMatrix();
219 a0_local.setZero();
220 dp.setZero();
221 dp_local.setZero();
222 da0_local_dx.setZero();
223 fJf.setZero();
224 v_partial_dq.setZero();
225 a_partial_dq.setZero();
226 a_partial_dv.setZero();
227 a_partial_da.setZero();
228 vv_skew.setZero();
229 vw_skew.setZero();
230 a0_skew.setZero();
231 a0_world_skew.setZero();
232 dp_skew.setZero();
233 f_skew.setZero();
234 fXjdv_dq.setZero();
235 fXjda_dq.setZero();
236 fXjda_dv.setZero();
237 oRf.setZero();
238 fJf_df.setZero();
239 }
240 virtual ~ContactData1DTpl() = default;
241
242 using Base::a0;
243 using Base::da0_dx;
244 using Base::df_du;
245 using Base::df_dx;
246 using Base::f;
247 using Base::frame;
248 using Base::fXj;
249 using Base::Jc;
250 using Base::jMf;
251 using Base::pinocchio;
252
253 Motion v;
254 Vector3s a0_local;
255 Vector3s dp;
256 Vector3s dp_local;
257 Force f_local;
258 Matrix3xs da0_local_dx;
259 Matrix6xs fJf;
260 Matrix6xs v_partial_dq;
261 Matrix6xs a_partial_dq;
262 Matrix6xs a_partial_dv;
263 Matrix6xs a_partial_da;
264 Matrix3s vv_skew;
265 Matrix3s vw_skew;
266 Matrix3s a0_skew;
267 Matrix3s a0_world_skew;
268 Matrix3s dp_skew;
269 Matrix3s f_skew;
270 Matrix6xs fXjdv_dq;
271 Matrix6xs fXjda_dq;
272 Matrix6xs fXjda_dv;
273 Matrix2s oRf;
274 Matrix3xs fJf_df;
275};
276
277} // namespace crocoddyl
278
279/* --- Details -------------------------------------------------------------- */
280/* --- Details -------------------------------------------------------------- */
281/* --- Details -------------------------------------------------------------- */
282#include "crocoddyl/multibody/contacts/contact-1d.hxx"
283
284CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(crocoddyl::ContactModel1DTpl)
285CROCODDYL_DECLARE_EXTERN_TEMPLATE_STRUCT(crocoddyl::ContactData1DTpl)
286
287#endif // CROCODDYL_MULTIBODY_CONTACTS_CONTACT_1D_HPP_
const Vector2s & get_gains() const
Create the 1d contact data.
virtual void calc(const std::shared_ptr< ContactDataAbstract > &data, const Eigen::Ref< const VectorXs > &x) override
Compute the 1d contact Jacobian and drift.
ContactModel1DTpl(std::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const Scalar xref, const pinocchio::ReferenceFrame type, const Matrix3s &rotation, const std::size_t nu, const Vector2s &gains=Vector2s::Zero())
Initialize the 1d contact model.
virtual std::shared_ptr< ContactDataAbstract > createData(pinocchio::DataTpl< Scalar > *const data) override
Create the 1d contact data.
const Matrix3s & get_axis_rotation() const
Return the rotation of the reference frames's z axis.
void set_reference(const Scalar reference)
Modify the reference frame translation.
void set_axis_rotation(const Matrix3s &rotation)
Modify the rotation of the reference frames's z axis.
const Scalar get_reference() const
Return the reference frame translation.
ContactModel1DTpl(std::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const Scalar xref, const pinocchio::ReferenceFrame type, const Vector2s &gains=Vector2s::Zero())
Initialize the 1d contact model.
ContactModel1DTpl< NewScalar > cast() const
Cast the contact-1d model to a different scalar type.
virtual void calcDiff(const std::shared_ptr< ContactDataAbstract > &data, const Eigen::Ref< const VectorXs > &x) override
Compute the derivatives of the 1d contact holonomic constraint.
virtual void updateForce(const std::shared_ptr< ContactDataAbstract > &data, const VectorXs &force) override
Convert the force into a stack of spatial forces.
virtual void print(std::ostream &os) const override
Print relevant information of the 1d contact model.
ContactModelAbstractTpl(std::shared_ptr< StateMultibody > state, const pinocchio::ReferenceFrame type, const std::size_t nc, const std::size_t nu)
Initialize the contact abstraction.
State multibody representation.
Definition multibody.hpp:34
SE3 jMf
Local frame placement of the contact frame.
pinocchio::FrameIndex frame
Frame index of the contact frame.