12 namespace newcontacts {
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)
24 template <
typename Scalar>
26 boost::shared_ptr<StateMultibody> state,
const pinocchio::FrameIndex
id,
28 const pinocchio::ReferenceFrame type)
34 template <
typename Scalar>
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,
44 pinocchio::getFrameJacobian(*state_->get_pinocchio().get(), *d->pinocchio,
45 id_, pinocchio::LOCAL, d->
fJf);
46 d->
a = pinocchio::getFrameAcceleration(*state_->get_pinocchio().get(),
50 d->
lwaMl.rotation(d->pinocchio->oMf[id_].rotation());
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();
57 if (gains_[1] != 0.) {
58 d->
v = pinocchio::getFrameVelocity(*state_->get_pinocchio().get(),
60 d->
a0_temp_ += gains_[1] * d->
v.toVector();
63 if (type_ == pinocchio::LOCAL_WORLD_ALIGNED || type_ == pinocchio::WORLD) {
65 d->Jc = d->
lwaMl.toActionMatrix() * d->
fJf;
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();
82 if (gains_[0] != 0.) {
86 if (gains_[1] != 0.) {
95 if (type_ == pinocchio::LOCAL_WORLD_ALIGNED || type_ == pinocchio::WORLD) {
98 d->
a0_temp_ = pinocchio::getFrameAcceleration(
99 *state_->get_pinocchio().get(), *d->pinocchio, id_)
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();
107 if (gains_[1] != 0.) {
108 d->
v = pinocchio::getFrameVelocity(*state_->get_pinocchio().get(),
110 d->
a0_temp_ += gains_[1] * d->
v.toVector();
114 d->
lwaMl.rotation(d->pinocchio->oMf[id_].rotation());
118 d->da0_dx.leftCols(nv).noalias() =
120 d->da0_dx.leftCols(nv).topRows(3).noalias() -=
122 d->da0_dx.leftCols(nv).bottomRows(3).noalias() -=
124 d->da0_dx.rightCols(nv).noalias() =
129 template <
typename Scalar>
131 const boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>& data,
133 if (force.size() != 6) {
134 throw_pretty(
"Invalid argument: "
135 <<
"lambda has wrong dimension (it should be 6)");
137 Data* d =
static_cast<Data*
>(data.get());
138 d->
oRf = d->pinocchio->oMf[id_].rotation();
140 if (type_ == pinocchio::LOCAL) {
141 data->f = d->jMf.act(pinocchio::ForceTpl<Scalar>(force));
143 if (type_ == pinocchio::LOCAL_WORLD_ALIGNED || type_ == pinocchio::WORLD) {
144 data->f = d->jMf.act(d->
lwaMl.actInv(pinocchio::ForceTpl<Scalar>(force)));
154 template <
typename Scalar>
155 boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>
157 return boost::allocate_shared<Data>(Eigen::aligned_allocator<Data>(),
this,
161 template <
typename Scalar>
163 os <<
"ContactModel6D {frame=" << state_->get_pinocchio()->frames[id_].name
167 template <
typename Scalar>
173 template <
typename Scalar>
174 const typename crocoddyl::MathBaseTpl<Scalar>::Vector2s&
179 template <
typename Scalar>
184 template <
typename Scalar>
189 template <
typename Scalar>