contact6d.hxx
Go to the documentation of this file.
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2021, LAAS-CNRS, University of Edinburgh
5 // Copyright note valid unless otherwise stated in individual files.
6 // All rights reserved.
8 
9 #include "contact6d.hpp"
10 
11 namespace sobec {
12 namespace newcontacts {
13 
14 template <typename Scalar>
16  boost::shared_ptr<StateMultibody> state, const pinocchio::FrameIndex id,
17  const SE3& xref, const std::size_t nu, const Vector2s& gains,
18  const pinocchio::ReferenceFrame type)
19  : Base(state, id, SE3::Identity(), nu, Vector2s::Zero()),
20  xref_(xref),
21  gains_(gains),
22  type_(type) {}
23 
24 template <typename Scalar>
26  boost::shared_ptr<StateMultibody> state, const pinocchio::FrameIndex id,
27  const SE3& xref, const Vector2s& gains,
28  const pinocchio::ReferenceFrame type)
29  : Base(state, id, SE3::Identity(), Vector2s::Zero()),
30  xref_(xref),
31  gains_(gains),
32  type_(type) {}
33 
34 template <typename Scalar>
36 
37 template <typename Scalar>
39  const boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>& data,
40  const Eigen::Ref<const VectorXs>& x) {
41  Data* d = static_cast<Data*>(data.get());
42  pinocchio::updateFramePlacement(*state_->get_pinocchio().get(), *d->pinocchio,
43  id_);
44  pinocchio::getFrameJacobian(*state_->get_pinocchio().get(), *d->pinocchio,
45  id_, pinocchio::LOCAL, d->fJf);
46  d->a = pinocchio::getFrameAcceleration(*state_->get_pinocchio().get(),
47  *d->pinocchio, id_);
48  d->a0_temp_ = d->a.toVector();
49  d->Jc = d->fJf;
50  d->lwaMl.rotation(d->pinocchio->oMf[id_].rotation());
51  // BAUMGARTE P
52  if (gains_[0] != 0.) {
53  d->rMf = xref_.inverse() * d->pinocchio->oMf[id_];
54  d->a0_temp_ += gains_[0] * pinocchio::log6(d->rMf).toVector();
55  }
56  // BAUMGARTE V
57  if (gains_[1] != 0.) {
58  d->v = pinocchio::getFrameVelocity(*state_->get_pinocchio().get(),
59  *d->pinocchio, id_);
60  d->a0_temp_ += gains_[1] * d->v.toVector();
61  }
62  d->a0 = d->a0_temp_;
63  if (type_ == pinocchio::LOCAL_WORLD_ALIGNED || type_ == pinocchio::WORLD) {
64  d->a0 = d->lwaMl.toActionMatrix() * d->a0_temp_;
65  d->Jc = d->lwaMl.toActionMatrix() * d->fJf;
66  }
67 }
68 
69 template <typename Scalar>
71  const boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>& data,
72  const Eigen::Ref<const VectorXs>&) {
73  Data* d = static_cast<Data*>(data.get());
74  const pinocchio::JointIndex joint =
75  state_->get_pinocchio()->frames[d->frame].parent;
76  pinocchio::getJointAccelerationDerivatives(
77  *state_->get_pinocchio().get(), *d->pinocchio, joint, pinocchio::LOCAL,
79  const std::size_t nv = state_->get_nv();
80  d->da0_dx_temp_.leftCols(nv).noalias() = d->fXj * d->a_partial_dq;
81  d->da0_dx_temp_.rightCols(nv).noalias() = d->fXj * d->a_partial_dv;
82  if (gains_[0] != 0.) {
83  pinocchio::Jlog6(d->rMf, d->rMf_Jlog6);
84  d->da0_dx_temp_.leftCols(nv).noalias() += gains_[0] * d->rMf_Jlog6 * d->fJf;
85  }
86  if (gains_[1] != 0.) {
87  d->da0_dx_temp_.leftCols(nv).noalias() +=
88  gains_[1] * d->fXj * d->v_partial_dq;
89  d->da0_dx_temp_.rightCols(nv).noalias() +=
90  gains_[1] * d->fXj * d->a_partial_da;
91  }
92 
93  d->da0_dx = d->da0_dx_temp_;
94 
95  if (type_ == pinocchio::LOCAL_WORLD_ALIGNED || type_ == pinocchio::WORLD) {
96  // Need to recompute classical acceleration + BG correction (may not be
97  // equal to drift a0 anymore)
98  d->a0_temp_ = pinocchio::getFrameAcceleration(
99  *state_->get_pinocchio().get(), *d->pinocchio, id_)
100  .toVector();
101  // BAUMGARTE P
102  if (gains_[0] != 0.) {
103  d->rMf = xref_.inverse() * d->pinocchio->oMf[id_];
104  d->a0_temp_ += gains_[0] * pinocchio::log6(d->rMf).toVector();
105  }
106  // BAUMGARTE V
107  if (gains_[1] != 0.) {
108  d->v = pinocchio::getFrameVelocity(*state_->get_pinocchio().get(),
109  *d->pinocchio, id_);
110  d->a0_temp_ += gains_[1] * d->v.toVector();
111  }
112  // Skew term due to LWA frame (is zero when classical acceleration = 0,
113  // which is the case in ContactFwdDynamics)
114  d->lwaMl.rotation(d->pinocchio->oMf[id_].rotation());
115  d->oRf = d->lwaMl.rotation();
116  pinocchio::skew(d->oRf * d->a0_temp_.tail(3), d->tmp_skew_ang_);
117  pinocchio::skew(d->oRf * d->a0_temp_.head(3), d->tmp_skew_lin_);
118  d->da0_dx.leftCols(nv).noalias() =
119  d->lwaMl.toActionMatrix() * d->da0_dx_temp_.leftCols(nv);
120  d->da0_dx.leftCols(nv).topRows(3).noalias() -=
121  d->tmp_skew_lin_ * d->oRf * d->fJf.template bottomRows<3>();
122  d->da0_dx.leftCols(nv).bottomRows(3).noalias() -=
123  d->tmp_skew_ang_ * d->oRf * d->fJf.template bottomRows<3>();
124  d->da0_dx.rightCols(nv).noalias() =
125  d->lwaMl.toActionMatrix() * d->da0_dx_temp_.rightCols(nv);
126  }
127 }
128 
129 template <typename Scalar>
131  const boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>& data,
132  const VectorXs& force) {
133  if (force.size() != 6) {
134  throw_pretty("Invalid argument: "
135  << "lambda has wrong dimension (it should be 6)");
136  }
137  Data* d = static_cast<Data*>(data.get());
138  d->oRf = d->pinocchio->oMf[id_].rotation();
139  d->lwaMl.rotation(d->oRf);
140  if (type_ == pinocchio::LOCAL) {
141  data->f = d->jMf.act(pinocchio::ForceTpl<Scalar>(force));
142  }
143  if (type_ == pinocchio::LOCAL_WORLD_ALIGNED || type_ == pinocchio::WORLD) {
144  data->f = d->jMf.act(d->lwaMl.actInv(pinocchio::ForceTpl<Scalar>(force)));
145  // Compute skew term to be added to rnea derivatives
146  pinocchio::skew(d->oRf.transpose() * force.tail(3), d->tmp_skew_ang_);
147  pinocchio::skew(d->oRf.transpose() * force.head(3), d->tmp_skew_lin_);
148  d->tmp_skew_.topRows(3) = d->tmp_skew_lin_ * d->fJf.bottomRows(3);
149  d->tmp_skew_.bottomRows(3) = d->tmp_skew_ang_ * d->fJf.bottomRows(3);
150  d->drnea_skew_term_ = -d->fJf.transpose() * d->tmp_skew_;
151  }
152 }
153 
154 template <typename Scalar>
155 boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>
156 ContactModel6DTpl<Scalar>::createData(pinocchio::DataTpl<Scalar>* const data) {
157  return boost::allocate_shared<Data>(Eigen::aligned_allocator<Data>(), this,
158  data);
159 }
160 
161 template <typename Scalar>
162 void ContactModel6DTpl<Scalar>::print(std::ostream& os) const {
163  os << "ContactModel6D {frame=" << state_->get_pinocchio()->frames[id_].name
164  << "}";
165 }
166 
167 template <typename Scalar>
168 const pinocchio::SE3Tpl<Scalar>& ContactModel6DTpl<Scalar>::get_reference()
169  const {
170  return xref_;
171 }
172 
173 template <typename Scalar>
174 const typename crocoddyl::MathBaseTpl<Scalar>::Vector2s&
176  return gains_;
177 }
178 
179 template <typename Scalar>
181  xref_ = reference;
182 }
183 
184 template <typename Scalar>
185 void ContactModel6DTpl<Scalar>::set_type(const pinocchio::ReferenceFrame type) {
186  type_ = type;
187 }
188 
189 template <typename Scalar>
190 const pinocchio::ReferenceFrame& ContactModel6DTpl<Scalar>::get_type() const {
191  return type_;
192 }
193 
194 } // namespace newcontacts
195 } // namespace sobec
sobec::newcontacts::ContactData6DTpl::a0_temp_
Vector6s a0_temp_
Definition: contact6d.hpp:229
sobec::newcontacts::ContactData6DTpl::a_partial_da
MatrixXs a_partial_da
Definition: contact6d.hpp:220
sobec::newcontacts::ContactData6DTpl::rMf_Jlog6
Matrix6s rMf_Jlog6
Definition: contact6d.hpp:223
sobec::newcontacts::ContactData6DTpl
Definition: contact6d.hpp:157
sobec::newcontacts::ContactData6DTpl::a_partial_dq
MatrixXs a_partial_dq
Definition: contact6d.hpp:218
sobec::newcontacts::ContactModel6DTpl::print
virtual void print(std::ostream &os) const
Print relevant information of the 6d contact model.
Definition: contact6d.hxx:162
sobec::newcontacts::ContactModel6DTpl::SE3
pinocchio::SE3Tpl< Scalar > SE3
Definition: contact6d.hpp:36
sobec::newcontacts::ContactData6DTpl::a_partial_dv
MatrixXs a_partial_dv
Definition: contact6d.hpp:219
sobec::newcontacts::ContactData6DTpl::lwaMl
pinocchio::SE3Tpl< Scalar > lwaMl
Definition: contact6d.hpp:222
sobec::newcontacts::ContactModel6DTpl::get_type
const pinocchio::ReferenceFrame & get_type() const
Get pinocchio::ReferenceFrame.
Definition: contact6d.hxx:190
sobec::newcontacts::ContactModel6DTpl::set_reference
void set_reference(const SE3 &reference)
Modify the reference frame translation.
Definition: contact6d.hxx:180
sobec::newcontacts::ContactData6DTpl::tmp_skew_lin_
Matrix3s tmp_skew_lin_
Definition: contact6d.hpp:226
sobec::newcontacts::ContactModel6DTpl::get_reference
const SE3 & get_reference() const
Return the reference frame translation.
Definition: contact6d.hxx:168
sobec::newcontacts::ContactModel6DTpl::~ContactModel6DTpl
virtual ~ContactModel6DTpl()
Definition: contact6d.hxx:35
sobec::newcontacts::ContactModel6DTpl::set_type
void set_type(const pinocchio::ReferenceFrame type)
Modify pinocchio::ReferenceFrame.
Definition: contact6d.hxx:185
sobec::newcontacts::ContactData6DTpl::tmp_skew_ang_
Matrix3s tmp_skew_ang_
Definition: contact6d.hpp:225
sobec::newcontacts::ContactModel6DTpl::calcDiff
virtual void calcDiff(const boost::shared_ptr< crocoddyl::ContactDataAbstractTpl< Scalar >> &data, const Eigen::Ref< const VectorXs > &x)
Compute the derivatives of the 6d contact holonomic constraint.
Definition: contact6d.hxx:70
sobec::newcontacts::ContactData6DTpl::drnea_skew_term_
MatrixXs drnea_skew_term_
Definition: contact6d.hpp:230
sobec::newcontacts::ContactData6DTpl::fJf
MatrixXs fJf
Definition: contact6d.hpp:216
sobec::newcontacts::ContactData6DTpl::v
pinocchio::MotionTpl< Scalar > v
Definition: contact6d.hpp:214
contact6d.hpp
sobec::newcontacts::ContactModel6DTpl::calc
virtual void calc(const boost::shared_ptr< crocoddyl::ContactDataAbstractTpl< Scalar >> &data, const Eigen::Ref< const VectorXs > &x)
Compute the 6d contact Jacobian and drift.
Definition: contact6d.hxx:38
sobec::newcontacts::ContactModel6DTpl::updateForce
virtual void updateForce(const boost::shared_ptr< crocoddyl::ContactDataAbstractTpl< Scalar >> &data, const VectorXs &force)
Convert the force into a stack of spatial forces.
Definition: contact6d.hxx:130
sobec::newcontacts::ContactData6DTpl::v_partial_dq
MatrixXs v_partial_dq
Definition: contact6d.hpp:217
sobec::newcontacts::ContactData6DTpl::rMf
pinocchio::SE3Tpl< Scalar > rMf
Definition: contact6d.hpp:221
sobec::newcontacts::ContactData6DTpl::tmp_skew_
MatrixXs tmp_skew_
Definition: contact6d.hpp:224
sobec
Definition: activation-quad-ref.hpp:19
sobec::newcontacts::ContactData6DTpl::da0_dx_temp_
MatrixXs da0_dx_temp_
Definition: contact6d.hpp:228
sobec::newcontacts::x
@ x
Definition: contact1d.hpp:26
sobec::newcontacts::ContactModel6DTpl::VectorXs
MathBase::VectorXs VectorXs
Definition: contact6d.hpp:40
sobec::newcontacts::ContactModel6DTpl::Vector2s
MathBase::Vector2s Vector2s
Definition: contact6d.hpp:38
sobec::newcontacts::ContactModel6DTpl::createData
virtual boost::shared_ptr< crocoddyl::ContactDataAbstractTpl< Scalar > > createData(pinocchio::DataTpl< Scalar > *const data)
Create the 6d contact data.
Definition: contact6d.hxx:156
sobec::newcontacts::ContactModel6DTpl::Base
crocoddyl::ContactModel6DTpl< Scalar > Base
Definition: contact6d.hpp:34
sobec::newcontacts::ContactModel6DTpl::ContactModel6DTpl
ContactModel6DTpl(boost::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const SE3 &xref, const std::size_t nu, const Vector2s &gains=Vector2s::Zero(), const pinocchio::ReferenceFrame type=pinocchio::LOCAL)
Initialize the 6d contact model.
Definition: contact6d.hxx:15
sobec::newcontacts::ContactData6DTpl::oRf
Matrix3s oRf
Definition: contact6d.hpp:231
sobec::newcontacts::ContactModel6DTpl::get_gains
const Vector2s & get_gains() const
Return the Baumgarte stabilization gains.
Definition: contact6d.hxx:175
sobec::newcontacts::ContactData6DTpl::a
pinocchio::MotionTpl< Scalar > a
Definition: contact6d.hpp:215