aligator 0.19.0
A versatile and efficient C++ library for real-time constrained trajectory optimization.
Loading...
Searching...
No Matches
constrained-rnea.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <pinocchio/algorithm/compute-all-terms.hpp>
6#include <pinocchio/algorithm/contact-jacobian.hpp>
7
8#include <Eigen/LU>
9
10namespace aligator {
11
12namespace {
13using pinocchio::DataTpl;
14using pinocchio::ModelTpl;
15using pinocchio::RigidConstraintDataTpl;
16using pinocchio::RigidConstraintModelTpl;
17} // namespace
18
19namespace details {
20template <typename Scalar, int Options>
22 const pinocchio::container::aligned_vector<
23 RigidConstraintModelTpl<Scalar, Options>> &constraint_models,
24 [[maybe_unused]] const pinocchio::container::aligned_vector<
25 RigidConstraintDataTpl<Scalar, Options>> &constraint_datas) {
26
27 int d = 0;
28 for (size_t k = 0; k < constraint_models.size(); ++k) {
29 const int constraint_size =
30#ifdef ALIGATOR_PINOCCHIO_V4
31 constraint_models[k].residualSize();
32#else
33 static_cast<int>(constraint_models[k].size());
34#endif
35 d += constraint_size;
36 }
37 return d;
38}
39} // namespace details
40
41template <typename Scalar, typename ConfigType, typename VelType,
42 typename MatrixType, typename OutType, int Options>
44 const ModelTpl<Scalar, Options> &model, DataTpl<Scalar, Options> &data,
45 const Eigen::MatrixBase<ConfigType> &q, Eigen::MatrixBase<VelType> const &v,
46 const Eigen::MatrixBase<MatrixType> &actMatrix,
47 const pinocchio::container::aligned_vector<
48 RigidConstraintModelTpl<Scalar, Options>> &constraint_models,
49 pinocchio::container::aligned_vector<
50 RigidConstraintDataTpl<Scalar, Options>> &constraint_datas,
51 const Eigen::MatrixBase<OutType> &res_) {
52 namespace pin = pinocchio;
53 using MatrixXs = Eigen::Matrix<Scalar, -1, -1>;
54 assert(constraint_models.size() == constraint_datas.size() &&
55 "constraint_models and constraint_datas do not have the same size");
56
57 OutType &res = res_.const_cast_derived();
58
59 const long nu = actMatrix.cols();
60 const long nv = model.nv;
61 assert(nv == actMatrix.rows() && "Actuation matrix dimension inconsistent.");
62
63 pin::computeAllTerms(model, data, q, v);
64 const auto &nle = data.nle;
65
66 const int d = details::computeRigidConstraintsTotalSize(constraint_models,
67 constraint_datas);
68
69 assert(res.size() == nu + d);
70 MatrixXs work(nv, nu + d);
71
72 work.leftCols(nu) = actMatrix;
73 auto JacT = work.rightCols(d);
74 pin::getConstraintsJacobian(model, data, constraint_models, constraint_datas,
75 JacT.transpose());
76 JacT *= -1;
77
78 Eigen::ColPivHouseholderQR<Eigen::Ref<MatrixXs>> qr(work);
79 res = qr.solve(nle);
80}
81
82#ifdef ALIGATOR_ENABLE_TEMPLATE_INSTANTIATION
84 context::Scalar, context::ConstVectorRef, context::ConstVectorRef,
85 context::ConstMatrixRef, context::VectorRef, context::Options>(
87 const Eigen::MatrixBase<context::ConstVectorRef> &,
88 const Eigen::MatrixBase<context::ConstVectorRef> &,
89 const Eigen::MatrixBase<context::ConstMatrixRef> &,
90 const context::RCMVector &, PINOCCHIO_ALIGNED_STD_VECTOR(context::RCD) &,
91 const Eigen::MatrixBase<context::VectorRef> &);
92#endif
93} // namespace aligator
pinocchio::ModelTpl< Scalar, Options > PinModel
Definition fwd.hpp:21
static constexpr int Options
Definition context.hpp:10
PINOCCHIO_ALIGNED_STD_VECTOR(RCM) RCMVector
Definition fwd.hpp:26
pinocchio::DataTpl< Scalar, Options > PinData
Definition fwd.hpp:22
pinocchio::RigidConstraintDataTpl< Scalar, Options > RCD
Definition fwd.hpp:25
int computeRigidConstraintsTotalSize(const pinocchio::container::aligned_vector< RigidConstraintModelTpl< Scalar, Options > > &constraint_models, const pinocchio::container::aligned_vector< RigidConstraintDataTpl< Scalar, Options > > &constraint_datas)
Main package namespace.
void underactuatedConstrainedInverseDynamics(const ModelTpl< Scalar, Options > &model, DataTpl< Scalar, Options > &data, const Eigen::MatrixBase< ConfigType > &q, Eigen::MatrixBase< VelType > const &v, const Eigen::MatrixBase< MatrixType > &actMatrix, const pinocchio::container::aligned_vector< RigidConstraintModelTpl< Scalar, Options > > &constraint_models, pinocchio::container::aligned_vector< RigidConstraintDataTpl< Scalar, Options > > &constraint_datas, const Eigen::MatrixBase< OutType > &res_)