residual-dcm-position.hxx
Go to the documentation of this file.
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2022, LAAS-CNRS
5 // Copyright note valid unless otherwise stated in individual files.
6 // All rights reserved.
8 
9 #include "crocoddyl/core/utils/exception.hpp"
10 #include "pinocchio/algorithm/center-of-mass-derivatives.hpp"
11 #include "pinocchio/algorithm/center-of-mass.hpp"
13 
14 namespace sobec {
15 using namespace crocoddyl;
16 
17 template <typename Scalar>
19  boost::shared_ptr<StateMultibody> state, const Vector3s& cref,
20  const double alpha, const std::size_t nu)
21  : Base(state, 3, nu, true, false, false),
22  cref_(cref),
23  alpha_(alpha),
24  pin_model_(*state->get_pinocchio()) {}
25 
26 template <typename Scalar>
28  boost::shared_ptr<StateMultibody> state, const Vector3s& cref,
29  const double alpha)
30  : Base(state, 3, true, false, false),
31  cref_(cref),
32  alpha_(alpha),
33  pin_model_(*state->get_pinocchio()) {}
34 
35 template <typename Scalar>
37 
38 template <typename Scalar>
40  const boost::shared_ptr<ResidualDataAbstract>& data,
41  const Eigen::Ref<const VectorXs>& x, const Eigen::Ref<const VectorXs>&) {
42  // Compute the residual residual give the reference DCMPosition position
43  Data* d = static_cast<Data*>(data.get());
44  const Eigen::VectorBlock<const Eigen::Ref<const VectorXs>, Eigen::Dynamic> q =
45  x.head(state_->get_nq());
46  const Eigen::VectorBlock<const Eigen::Ref<const VectorXs>, Eigen::Dynamic> v =
47  x.tail(state_->get_nv());
48 
49  pinocchio::centerOfMass(pin_model_, *d->pinocchio, q, v);
50  data->r = d->pinocchio->com[0] + alpha_ * d->pinocchio->vcom[0] - cref_;
51 }
52 
53 template <typename Scalar>
55  const boost::shared_ptr<ResidualDataAbstract>& data,
56  const Eigen::Ref<const VectorXs>&, const Eigen::Ref<const VectorXs>&) {
57  Data* d = static_cast<Data*>(data.get());
58 
59  // Compute the derivatives of the frame placement
60  const std::size_t nv = state_->get_nv();
61  pinocchio::getCenterOfMassVelocityDerivatives(pin_model_, *d->pinocchio,
62  d->dvcom_dq);
63  data->Rx.leftCols(nv) = d->pinocchio->Jcom + alpha_ * d->dvcom_dq;
64  data->Rx.rightCols(nv) = alpha_ * d->pinocchio->Jcom;
65 }
66 
67 template <typename Scalar>
68 boost::shared_ptr<ResidualDataAbstractTpl<Scalar> >
70  DataCollectorAbstract* const data) {
71  return boost::allocate_shared<Data>(Eigen::aligned_allocator<Data>(), this,
72  data);
73 }
74 
75 template <typename Scalar>
76 void ResidualModelDCMPositionTpl<Scalar>::print(std::ostream& os) const {
77  const Eigen::IOFormat fmt(2, Eigen::DontAlignCols, ", ", ";\n", "", "", "[",
78  "]");
79  os << "ResidualModelDCMPosition {cref=" << cref_.transpose().format(fmt)
80  << "}";
81 }
82 
83 template <typename Scalar>
84 const typename MathBaseTpl<Scalar>::Vector3s&
86  return cref_;
87 }
88 
89 template <typename Scalar>
91  cref_ = cref;
92 }
93 
94 } // namespace sobec
sobec::ResidualModelDCMPositionTpl::calcDiff
virtual void calcDiff(const boost::shared_ptr< ResidualDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u)
Compute the derivatives of the DCM position residual.
Definition: residual-dcm-position.hxx:54
sobec::ResidualModelDCMPositionTpl::set_reference
void set_reference(const Vector3s &cref)
Modify the DCM position reference.
Definition: residual-dcm-position.hxx:90
sobec::ResidualDataDCMPositionTpl::pinocchio
pinocchio::DataTpl< Scalar > * pinocchio
Pinocchio data.
Definition: residual-dcm-position.hpp:157
sobec::ResidualModelDCMPositionTpl::print
virtual void print(std::ostream &os) const
Print relevant information of the dcm-position residual.
Definition: residual-dcm-position.hxx:76
sobec::ResidualModelDCMPositionTpl::Base
ResidualModelAbstractTpl< Scalar > Base
Definition: residual-dcm-position.hpp:43
sobec::ResidualDataDCMPositionTpl::dvcom_dq
Matrix3xs dvcom_dq
Definition: residual-dcm-position.hpp:156
sobec::ResidualModelDCMPositionTpl::ResidualModelDCMPositionTpl
ResidualModelDCMPositionTpl(boost::shared_ptr< StateMultibody > state, const Vector3s &cref, const double alpha, const std::size_t nu)
Initialize the DCM position residual model.
Definition: residual-dcm-position.hxx:18
sobec::ResidualModelDCMPositionTpl::Vector3s
MathBase::Vector3s Vector3s
Definition: residual-dcm-position.hpp:48
sobec
Definition: activation-quad-ref.hpp:19
sobec::ResidualModelDCMPositionTpl::calc
virtual void calc(const boost::shared_ptr< ResidualDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u)
Compute the DCM position residual.
Definition: residual-dcm-position.hxx:39
sobec::ResidualDataDCMPositionTpl
Definition: residual-dcm-position.hpp:130
sobec::newcontacts::x
@ x
Definition: contact1d.hpp:26
residual-dcm-position.hpp
sobec::ResidualModelDCMPositionTpl::createData
virtual boost::shared_ptr< ResidualDataAbstract > createData(DataCollectorAbstract *const data)
Definition: residual-dcm-position.hxx:69
sobec::ResidualModelDCMPositionTpl::DataCollectorAbstract
DataCollectorAbstractTpl< Scalar > DataCollectorAbstract
Definition: residual-dcm-position.hpp:47
sobec::ResidualModelDCMPositionTpl::get_reference
const Vector3s & get_reference() const
Return the DCM position reference.
Definition: residual-dcm-position.hxx:85
sobec::ResidualModelDCMPositionTpl::~ResidualModelDCMPositionTpl
virtual ~ResidualModelDCMPositionTpl()
Definition: residual-dcm-position.hxx:36