residual-2D-surface.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/frames-derivatives.hpp>
11 #include <pinocchio/algorithm/frames.hpp>
12 
14 
15 namespace sobec {
16 using namespace crocoddyl;
17 template <typename Scalar>
19  boost::shared_ptr<StateMultibody> state,
20  const pinocchio::FrameIndex frame_id, const Vector2s support_translation,
21  const Scalar separation, const Scalar orientation, const Scalar alpha,
22  const std::size_t nu)
23  : Base(state, 2, nu, true, false, false),
24  frame_id(frame_id),
25  support_translation_(support_translation),
26  separation_(separation),
27  orientation_(orientation),
28  alpha_(alpha),
29  pin_model_(state->get_pinocchio()) {
30  A_.resize(2, 2);
31  pointF_ = support_translation_;
32  pointF_(0) -= separation_ * sin(orientation_);
33  pointF_(1) += separation_ * cos(orientation_);
34 
35  pointA_ = pointF_;
36  pointA_(0) += cos(orientation_ + alpha_);
37  pointA_(1) -= sin(orientation_ + alpha_);
38 
39  pointB_ = pointF_;
40  pointB_(0) -= cos(orientation_ - alpha_);
41  pointB_(1) += sin(orientation_ - alpha_);
42  A_(0, 0) = pointA_(1) - pointF_(1);
43  A_(0, 1) = pointF_(0) - pointA_(0);
44  A_(1, 0) = pointF_(1) - pointB_(1);
45  A_(1, 1) = pointB_(0) - pointF_(0);
46  b_(0) = pointF_(0) * pointA_(1) - pointA_(0) * pointF_(1);
47  b_(1) = pointB_(0) * pointF_(1) - pointF_(0) * pointB_(1);
48 }
49 
50 template <typename Scalar>
52  boost::shared_ptr<StateMultibody> state,
53  const pinocchio::FrameIndex frame_id, const Vector2s support_translation,
54  const Scalar separation, const Scalar orientation, const Scalar alpha)
55  : Base(state, 2, true, false, false),
56  frame_id(frame_id),
57  support_translation_(support_translation),
58  separation_(separation),
59  orientation_(orientation),
60  alpha_(alpha),
61  pin_model_(state->get_pinocchio()) {
62  A_.resize(2, 2);
63  pointF_ = support_translation_;
64  pointF_(0) -= separation_ * sin(orientation_);
65  pointF_(1) += separation_ * cos(orientation_);
66 
67  pointA_ = pointF_;
68  pointA_(0) += cos(orientation_ + alpha_);
69  pointA_(1) -= sin(orientation_ + alpha_);
70 
71  pointB_ = pointF_;
72  pointB_(0) -= cos(orientation_ - alpha_);
73  pointB_(1) += sin(orientation_ - alpha_);
74  A_(0, 0) = pointA_(1) - pointF_(1);
75  A_(0, 1) = pointF_(0) - pointA_(0);
76  A_(1, 0) = pointF_(1) - pointB_(1);
77  A_(1, 1) = pointB_(0) - pointF_(0);
78  b_(0) = pointF_(0) * pointA_(1) - pointA_(0) * pointF_(1);
79  b_(1) = pointB_(0) * pointF_(1) - pointF_(0) * pointB_(1);
80 }
81 
82 template <typename Scalar>
84 
85 template <typename Scalar>
87  const boost::shared_ptr<ResidualDataAbstract>& data,
88  const Eigen::Ref<const VectorXs>& /*x*/,
89  const Eigen::Ref<const VectorXs>&) {
90  // Compute the residual residual give the reference CoM velocity
91 
92  Data* d = static_cast<Data*>(data.get());
93 
94  pinocchio::updateFramePlacement(*pin_model_.get(), *d->pinocchio, frame_id);
95  data->r = A_ * d->pinocchio->oMf[frame_id].translation().head(2);
96  data->r -= b_;
97 }
98 
99 template <typename Scalar>
101  const boost::shared_ptr<ResidualDataAbstract>& data,
102  const Eigen::Ref<const VectorXs>& /*x*/,
103  const Eigen::Ref<const VectorXs>&) {
104  Data* d = static_cast<Data*>(data.get());
105  const std::size_t nv = state_->get_nv();
106 
107  pinocchio::getFrameJacobian(*pin_model_.get(), *d->pinocchio, frame_id,
108  pinocchio::LOCAL, d->fJf);
109  data->Rx.leftCols(nv).noalias() =
110  A_ * d->pinocchio->oMf[frame_id].rotation().topLeftCorner(2, 3) *
111  d->fJf.template topRows<3>();
112 }
113 
114 template <typename Scalar>
115 boost::shared_ptr<ResidualDataAbstractTpl<Scalar> >
117  DataCollectorAbstract* const data) {
118  return boost::allocate_shared<Data>(Eigen::aligned_allocator<Data>(), this,
119  data);
120 }
121 
122 template <typename Scalar>
123 const typename pinocchio::FrameIndex&
125  return frame_id;
126 }
127 
128 template <typename Scalar>
130  const pinocchio::FrameIndex& fid) {
131  frame_id = fid;
132 }
133 
134 template <typename Scalar>
136  const Vector2s support_translation, const Scalar orientation) {
137  pointF_ = support_translation;
138  pointF_(0) -= separation_ * sin(orientation);
139  pointF_(1) += separation_ * cos(orientation);
140 
141  pointA_ = pointF_;
142  pointA_(0) += cos(orientation + alpha_);
143  pointA_(1) -= sin(orientation + alpha_);
144 
145  pointB_ = pointF_;
146  pointB_(0) -= cos(orientation - alpha_);
147  pointB_(1) += sin(orientation - alpha_);
148  A_(0, 0) = pointA_(1) - pointF_(1);
149  A_(0, 1) = pointF_(0) - pointA_(0);
150  A_(1, 0) = pointF_(1) - pointB_(1);
151  A_(1, 1) = pointB_(0) - pointF_(0);
152  b_(0) = pointF_(0) * pointA_(1) - pointA_(0) * pointF_(1);
153  b_(1) = pointB_(0) * pointF_(1) - pointF_(0) * pointB_(1);
154 }
155 
156 } // namespace sobec
sobec::ResidualData2DSurfaceTpl::fJf
Matrix6xs fJf
Local Jacobian of the frame.
Definition: residual-2D-surface.hpp:179
sobec::ResidualModel2DSurfaceTpl::~ResidualModel2DSurfaceTpl
virtual ~ResidualModel2DSurfaceTpl()
Definition: residual-2D-surface.hxx:83
sobec::ResidualModel2DSurfaceTpl::set_Ab
void set_Ab(const Vector2s support_translation, const Scalar orientation)
Modify the matrix A and vector b.
Definition: residual-2D-surface.hxx:135
sobec::ResidualModel2DSurfaceTpl::createData
virtual boost::shared_ptr< ResidualDataAbstract > createData(DataCollectorAbstract *const data)
Definition: residual-2D-surface.hxx:116
sobec
Definition: activation-quad-ref.hpp:19
sobec::ResidualModel2DSurfaceTpl::Vector2s
MathBase::Vector2s Vector2s
Definition: residual-2D-surface.hpp:43
sobec::ResidualModel2DSurfaceTpl::set_frame_id
void set_frame_id(const pinocchio::FrameIndex &fid)
Modify the frame index.
Definition: residual-2D-surface.hxx:129
sobec::ResidualModel2DSurfaceTpl::ResidualModel2DSurfaceTpl
ResidualModel2DSurfaceTpl(boost::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex frame_id, const Vector2s support_translation, const Scalar separation, const Scalar orientation, const Scalar alpha, const std::size_t nu)
Initialize the residual model.
Definition: residual-2D-surface.hxx:18
sobec::ResidualData2DSurfaceTpl::pinocchio
pinocchio::DataTpl< Scalar > * pinocchio
Pinocchio data.
Definition: residual-2D-surface.hpp:178
sobec::ResidualModel2DSurfaceTpl::get_frame_id
const pinocchio::FrameIndex & get_frame_id() const
Return the frame index.
Definition: residual-2D-surface.hxx:124
sobec::ResidualModel2DSurfaceTpl::DataCollectorAbstract
DataCollectorAbstractTpl< Scalar > DataCollectorAbstract
Definition: residual-2D-surface.hpp:41
sobec::ResidualModel2DSurfaceTpl::calc
virtual void calc(const boost::shared_ptr< ResidualDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u)
Compute the residual.
Definition: residual-2D-surface.hxx:86
sobec::ResidualModel2DSurfaceTpl::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 CoM velocity residual.
Definition: residual-2D-surface.hxx:100
residual-2D-surface.hpp
sobec::ResidualModel2DSurfaceTpl::Base
ResidualModelAbstractTpl< Scalar > Base
Definition: residual-2D-surface.hpp:37
sobec::ResidualData2DSurfaceTpl
Definition: residual-2D-surface.hpp:149