residual-cop.hxx
Go to the documentation of this file.
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2021, LAAS-CNRS, University of Edinburgh, INRIA
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/frames-derivatives.hpp>
11 #include <pinocchio/algorithm/frames.hpp>
12 #include <pinocchio/algorithm/kinematics-derivatives.hpp>
13 
15 
16 namespace sobec {
17 
18 using namespace crocoddyl;
19 
20 template <typename Scalar>
22  boost::shared_ptr<StateMultibody> state,
23  const pinocchio::FrameIndex contact_id, const std::size_t nu)
24  : Base(state, 2, nu, true, true, true), contact_id_(contact_id) {}
25 
26 template <typename Scalar>
28 
29 template <typename Scalar>
31  const boost::shared_ptr<ResidualDataAbstract> &data,
32  const Eigen::Ref<const VectorXs> & /*x*/,
33  const Eigen::Ref<const VectorXs> &) {
34  Data *d = static_cast<Data *>(data.get());
35  Force f = d->contact->jMf.actInv(d->contact->f);
36 
37  if (f.linear()[2] != 0.0) {
38  data->r[0] = f.angular()[1] / f.linear()[2];
39  data->r[1] = -f.angular()[0] / f.linear()[2];
40  } else {
41  data->r[0] = 0;
42  data->r[1] = 0;
43  }
44 }
45 
46 template <typename Scalar>
48  const boost::shared_ptr<ResidualDataAbstract> &data,
49  const Eigen::Ref<const VectorXs> &, const Eigen::Ref<const VectorXs> &) {
50  Data *d = static_cast<Data *>(data.get());
51  Force f = d->contact->jMf.actInv(d->contact->f);
52  const MatrixXs &df_dx = d->contact->df_dx;
53  const MatrixXs &df_du = d->contact->df_du;
54 
55  // r = tau/f
56  // r'= tau'/f - tau/f^2 f' = (tau'-cop.f')/f
57  if (f.linear()[2] != 0.0) {
58  data->Rx.row(0) = df_dx.row(4);
59  data->Rx.row(1) = -df_dx.row(3);
60  data->Rx.row(0) -= data->r[0] * df_dx.row(2);
61  data->Rx.row(1) -= data->r[1] * df_dx.row(2);
62  data->Rx /= f.linear()[2];
63 
64  data->Ru.row(0) = df_du.row(4);
65  data->Ru.row(1) = -df_du.row(3);
66  data->Ru.row(0) -= data->r[0] * df_du.row(2);
67  data->Ru.row(1) -= data->r[1] * df_du.row(2);
68  data->Ru /= f.linear()[2];
69  } else {
70  data->Ru.setZero();
71  data->Rx.setZero();
72  }
73 }
74 
75 template <typename Scalar>
76 boost::shared_ptr<ResidualDataAbstractTpl<Scalar> >
78  DataCollectorAbstract *const data) {
79  return boost::allocate_shared<Data>(Eigen::aligned_allocator<Data>(), this,
80  data);
81 }
82 
83 } // namespace sobec
sobec::ResidualDataCenterOfPressureTpl
Definition: residual-cop.hpp:118
sobec::ResidualModelCenterOfPressureTpl::Force
pinocchio::ForceTpl< Scalar > Force
Definition: residual-cop.hpp:57
sobec::ResidualModelCenterOfPressureTpl::~ResidualModelCenterOfPressureTpl
virtual ~ResidualModelCenterOfPressureTpl()
Definition: residual-cop.hxx:27
sobec::ResidualModelCenterOfPressureTpl::calc
virtual void calc(const boost::shared_ptr< ResidualDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u)
Compute the cop.
Definition: residual-cop.hxx:30
sobec
Definition: activation-quad-ref.hpp:19
sobec::ResidualModelCenterOfPressureTpl::Base
ResidualModelAbstractTpl< Scalar > Base
Definition: residual-cop.hpp:48
sobec::ResidualModelCenterOfPressureTpl::DataCollectorAbstract
DataCollectorAbstractTpl< Scalar > DataCollectorAbstract
Definition: residual-cop.hpp:52
sobec::ResidualModelCenterOfPressureTpl::ResidualModelCenterOfPressureTpl
ResidualModelCenterOfPressureTpl(boost::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex contact_id, const std::size_t nu)
Initialize the residual model.
Definition: residual-cop.hxx:21
sobec::ResidualModelCenterOfPressureTpl::MatrixXs
MathBase::MatrixXs MatrixXs
Definition: residual-cop.hpp:56
sobec::ResidualModelCenterOfPressureTpl::createData
virtual boost::shared_ptr< ResidualDataAbstract > createData(DataCollectorAbstract *const data)
Definition: residual-cop.hxx:77
sobec::ResidualModelCenterOfPressureTpl::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 residual.
Definition: residual-cop.hxx:47
sobec::ResidualDataCenterOfPressureTpl::contact
boost::shared_ptr< ForceDataAbstractTpl< Scalar > > contact
Definition: residual-cop.hpp:166
residual-cop.hpp