9 #include <crocoddyl/core/utils/exception.hpp>
10 #include <pinocchio/algorithm/frames-derivatives.hpp>
11 #include <pinocchio/algorithm/frames.hpp>
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,
23 :
Base(state, 2, nu, true, false, false),
25 support_translation_(support_translation),
26 separation_(separation),
27 orientation_(orientation),
29 pin_model_(state->get_pinocchio()) {
31 pointF_ = support_translation_;
32 pointF_(0) -= separation_ * sin(orientation_);
33 pointF_(1) += separation_ * cos(orientation_);
36 pointA_(0) += cos(orientation_ + alpha_);
37 pointA_(1) -= sin(orientation_ + alpha_);
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);
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),
57 support_translation_(support_translation),
58 separation_(separation),
59 orientation_(orientation),
61 pin_model_(state->get_pinocchio()) {
63 pointF_ = support_translation_;
64 pointF_(0) -= separation_ * sin(orientation_);
65 pointF_(1) += separation_ * cos(orientation_);
68 pointA_(0) += cos(orientation_ + alpha_);
69 pointA_(1) -= sin(orientation_ + alpha_);
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);
82 template <
typename Scalar>
85 template <
typename Scalar>
87 const boost::shared_ptr<ResidualDataAbstract>& data,
88 const Eigen::Ref<const VectorXs>& ,
89 const Eigen::Ref<const VectorXs>&) {
92 Data* d =
static_cast<Data*
>(data.get());
94 pinocchio::updateFramePlacement(*pin_model_.get(), *d->
pinocchio, frame_id);
95 data->r = A_ * d->
pinocchio->oMf[frame_id].translation().head(2);
99 template <
typename Scalar>
101 const boost::shared_ptr<ResidualDataAbstract>& data,
102 const Eigen::Ref<const VectorXs>& ,
103 const Eigen::Ref<const VectorXs>&) {
104 Data* d =
static_cast<Data*
>(data.get());
105 const std::size_t nv = state_->get_nv();
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>();
114 template <
typename Scalar>
115 boost::shared_ptr<ResidualDataAbstractTpl<Scalar> >
118 return boost::allocate_shared<Data>(Eigen::aligned_allocator<Data>(),
this,
122 template <
typename Scalar>
123 const typename pinocchio::FrameIndex&
128 template <
typename Scalar>
130 const pinocchio::FrameIndex& fid) {
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);
142 pointA_(0) += cos(orientation + alpha_);
143 pointA_(1) -= sin(orientation + alpha_);
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);