residual-feet-collision.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_id1,
21  const pinocchio::FrameIndex frame_id2, const std::size_t nu)
22  : Base(state, 1, nu, true, false, false),
23  frame_id1(frame_id1),
24  frame_id2(frame_id2),
25  pin_model_(*state->get_pinocchio()) {}
26 
27 template <typename Scalar>
29  boost::shared_ptr<StateMultibody> state,
30  const pinocchio::FrameIndex frame_id1,
31  const pinocchio::FrameIndex frame_id2)
32  : Base(state, 1, true, false, false),
33  frame_id1(frame_id1),
34  frame_id2(frame_id2),
35  pin_model_(*state->get_pinocchio()) {}
36 
37 template <typename Scalar>
39 
40 template <typename Scalar>
42  const boost::shared_ptr<ResidualDataAbstract>& data,
43  const Eigen::Ref<const VectorXs>& /*x*/,
44  const Eigen::Ref<const VectorXs>&) {
45  // Compute the residual residual give the reference CoM velocity
46 
47  Data* d = static_cast<Data*>(data.get());
48 
49  pinocchio::updateFramePlacement(pin_model_, *d->pinocchio, frame_id1);
50  pinocchio::updateFramePlacement(pin_model_, *d->pinocchio, frame_id2);
51 
52  const typename MathBase::Vector3s& p1 =
53  d->pinocchio->oMf[frame_id1].translation();
54  const typename MathBase::Vector3s& p2 =
55  d->pinocchio->oMf[frame_id2].translation();
56  d->p1p2 = p1 - p2;
57  d->r[0] = d->p1p2.template head<2>().norm();
58 }
59 
60 template <typename Scalar>
62  const boost::shared_ptr<ResidualDataAbstract>& data,
63  const Eigen::Ref<const VectorXs>& /*x*/,
64  const Eigen::Ref<const VectorXs>&) {
65  Data* d = static_cast<Data*>(data.get());
66  // const Eigen::VectorBlock<const Eigen::Ref<const VectorXs>, Eigen::Dynamic>
67  // q = x.head(state_->get_nq()); const Eigen::VectorBlock<const
68  // Eigen::Ref<const VectorXs>, Eigen::Dynamic> v = x.tail(state_->get_nv());
69 
70  const std::size_t nv = state_->get_nv();
71  pinocchio::getFrameJacobian(pin_model_, *d->pinocchio, frame_id1,
72  pinocchio::LOCAL_WORLD_ALIGNED, d->J1);
73  pinocchio::getFrameJacobian(pin_model_, *d->pinocchio, frame_id2,
74  pinocchio::LOCAL_WORLD_ALIGNED, d->J2);
75 
76  d->dJ = d->J1.template topRows<2>() - d->J2.template topRows<2>();
77 
78  data->Rx.leftCols(nv) = d->dJ.row(0) * (d->p1p2[0] / d->r[0]);
79  data->Rx.leftCols(nv) += d->dJ.row(1) * (d->p1p2[1] / d->r[0]);
80 }
81 
82 template <typename Scalar>
83 boost::shared_ptr<ResidualDataAbstractTpl<Scalar> >
85  DataCollectorAbstract* const data) {
86  return boost::allocate_shared<Data>(Eigen::aligned_allocator<Data>(), this,
87  data);
88 }
89 
90 template <typename Scalar>
91 const typename pinocchio::FrameIndex&
93  return frame_id1;
94 }
95 
96 template <typename Scalar>
98  const pinocchio::FrameIndex& fid) {
99  frame_id1 = fid;
100 }
101 
102 template <typename Scalar>
103 const typename pinocchio::FrameIndex&
105  return frame_id2;
106 }
107 
108 template <typename Scalar>
110  const pinocchio::FrameIndex& fid) {
111  frame_id2 = fid;
112 }
113 
114 } // namespace sobec
sobec::ResidualDataFeetCollisionTpl::p1p2
Vector3s p1p2
Definition: residual-feet-collision.hpp:160
sobec::ResidualModelFeetCollisionTpl::Base
ResidualModelAbstractTpl< Scalar > Base
Definition: residual-feet-collision.hpp:35
sobec::ResidualModelFeetCollisionTpl::get_frame_id2
const pinocchio::FrameIndex & get_frame_id2() const
Return the second frame index in the collision pair.
Definition: residual-feet-collision.hxx:104
sobec::ResidualModelFeetCollisionTpl::ResidualModelFeetCollisionTpl
ResidualModelFeetCollisionTpl(boost::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex frame_id1, const pinocchio::FrameIndex frame_id2, const std::size_t nu)
Initialize the residual model.
Definition: residual-feet-collision.hxx:18
sobec::ResidualModelFeetCollisionTpl::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-feet-collision.hxx:61
residual-feet-collision.hpp
sobec::ResidualModelFeetCollisionTpl::DataCollectorAbstract
DataCollectorAbstractTpl< Scalar > DataCollectorAbstract
Definition: residual-feet-collision.hpp:39
sobec
Definition: activation-quad-ref.hpp:19
sobec::ResidualDataFeetCollisionTpl::pinocchio
pinocchio::DataTpl< Scalar > * pinocchio
Pinocchio data.
Definition: residual-feet-collision.hpp:157
sobec::ResidualDataFeetCollisionTpl::J2
Matrix6xs J2
Definition: residual-feet-collision.hpp:158
sobec::ResidualModelFeetCollisionTpl::createData
virtual boost::shared_ptr< ResidualDataAbstract > createData(DataCollectorAbstract *const data)
Definition: residual-feet-collision.hxx:84
sobec::ResidualModelFeetCollisionTpl::set_frame_id1
void set_frame_id1(const pinocchio::FrameIndex &fid1)
Set the first frame index in the collision pair.
Definition: residual-feet-collision.hxx:97
sobec::ResidualModelFeetCollisionTpl::~ResidualModelFeetCollisionTpl
virtual ~ResidualModelFeetCollisionTpl()
Definition: residual-feet-collision.hxx:38
sobec::ResidualDataFeetCollisionTpl::J1
Matrix6xs J1
Definition: residual-feet-collision.hpp:158
sobec::ResidualModelFeetCollisionTpl::set_frame_id2
void set_frame_id2(const pinocchio::FrameIndex &fid2)
Set the second frame index in the collision pair.
Definition: residual-feet-collision.hxx:109
sobec::ResidualModelFeetCollisionTpl::get_frame_id1
const pinocchio::FrameIndex & get_frame_id1() const
Return the first frame index in the collision pair.
Definition: residual-feet-collision.hxx:92
sobec::ResidualModelFeetCollisionTpl::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-feet-collision.hxx:41
sobec::ResidualDataFeetCollisionTpl::dJ
Matrix2xs dJ
Definition: residual-feet-collision.hpp:159
sobec::ResidualDataFeetCollisionTpl
Definition: residual-feet-collision.hpp:119