12 namespace newcontacts {
14 template <
typename Scalar>
16 boost::shared_ptr<StateMultibody> state,
const pinocchio::FrameIndex
id,
25 template <
typename Scalar>
27 boost::shared_ptr<StateMultibody> state,
const pinocchio::FrameIndex
id,
29 const pinocchio::ReferenceFrame type)
36 template <
typename Scalar>
39 template <
typename Scalar>
41 const boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>& data,
42 const Eigen::Ref<const VectorXs>&
x) {
43 Data* d =
static_cast<Data*
>(data.get());
44 pinocchio::updateFramePlacement(*state_->get_pinocchio().get(), *d->pinocchio,
46 pinocchio::getFrameJacobian(*state_->get_pinocchio().get(), *d->pinocchio,
47 id_, pinocchio::LOCAL, d->
fJf);
49 pinocchio::getFrameClassicalAcceleration(
50 *state_->get_pinocchio().get(), *d->pinocchio, id_, pinocchio::LOCAL)
52 d->
vv = d->
fJf.template topRows<3>() *
x.tail(state_->get_nv());
53 d->
vw = d->
fJf.template bottomRows<3>() *
x.tail(state_->get_nv());
54 d->
oRf = d->pinocchio->oMf[id_].rotation();
55 d->Jc.row(0) = d->
fJf.row(mask_);
57 if (gains_[0] != 0.) {
58 d->
a0_3d_ += gains_[0] * d->
oRf.transpose() *
59 (d->pinocchio->oMf[id_].translation() - xref_);
62 if (gains_[1] != 0.) {
66 d->a0[0] = d->
a0_3d_[mask_];
68 if (type_ == pinocchio::LOCAL_WORLD_ALIGNED || type_ == pinocchio::WORLD) {
70 d->Jc.row(0) = (d->
oRf * d->
fJf.template topRows<3>()).row(mask_);
74 template <
typename Scalar>
76 const boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>& data,
77 const Eigen::Ref<const VectorXs>&) {
78 Data* d =
static_cast<Data*
>(data.get());
79 const pinocchio::JointIndex joint =
80 state_->get_pinocchio()->frames[d->frame].parent;
81 pinocchio::getJointAccelerationDerivatives(
82 *state_->get_pinocchio().get(), *d->pinocchio, joint, pinocchio::LOCAL,
84 const std::size_t nv = state_->get_nv();
104 if (gains_[0] != 0.) {
106 d->
oRf.transpose() * (d->pinocchio->oMf[id_].translation() - xref_),
109 gains_[0] * (d->
tmp_skew_ * d->
fJf.template bottomRows<3>() +
110 d->
fJf.template topRows<3>());
113 if (gains_[1] != 0.) {
115 gains_[1] * d->
fXjdv_dq.template topRows<3>();
117 gains_[1] * d->
fJf.template topRows<3>();
122 if (type_ == pinocchio::LOCAL_WORLD_ALIGNED || type_ == pinocchio::WORLD) {
125 d->
a0_3d_ = pinocchio::getFrameClassicalAcceleration(
126 *state_->get_pinocchio().get(), *d->pinocchio, id_,
129 if (gains_[0] != 0.) {
130 d->
a0_3d_ += gains_[0] * d->
oRf.transpose() *
131 (d->pinocchio->oMf[id_].translation() - xref_);
133 if (gains_[1] != 0.) {
139 d->da0_dx.leftCols(nv).row(0) =
143 d->da0_dx.rightCols(nv).row(0) =
148 template <
typename Scalar>
150 const boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>& data,
152 if (force.size() != 1) {
153 throw_pretty(
"Invalid argument: "
154 <<
"lambda has wrong dimension (it should be 1)");
156 Data* d =
static_cast<Data*
>(data.get());
157 d->
oRf = d->pinocchio->oMf[id_].rotation();
158 if (type_ == pinocchio::LOCAL) {
159 data->f.linear() = d->jMf.rotation().col(mask_) * force[0];
160 data->f.angular() = d->jMf.translation().cross(data->f.linear());
162 if (type_ == pinocchio::LOCAL_WORLD_ALIGNED || type_ == pinocchio::WORLD) {
163 data->f = d->jMf.act(pinocchio::ForceTpl<Scalar>(
164 d->
oRf.transpose().col(mask_) * force[0], Vector3s::Zero()));
166 pinocchio::skew(d->
oRf.transpose().col(mask_) * force[0], d->
tmp_skew_);
172 template <
typename Scalar>
173 boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>
175 return boost::allocate_shared<Data>(Eigen::aligned_allocator<Data>(),
this,
179 template <
typename Scalar>
181 os <<
"ContactModel1D {frame=" << state_->get_pinocchio()->frames[id_].name
185 template <
typename Scalar>
186 const typename crocoddyl::MathBaseTpl<Scalar>::Vector3s&
191 template <
typename Scalar>
192 const typename crocoddyl::MathBaseTpl<Scalar>::Vector2s&
197 template <
typename Scalar>
202 template <
typename Scalar>
207 template <
typename Scalar>
212 template <
typename Scalar>
217 template <
typename Scalar>