mc_rtc  2.16.0
TasksQPSolver.h
Go to the documentation of this file.
1 /*
2  * Copyright 2015-2022 CNRS-UM LIRMM, CNRS-AIST JRL
3  */
4 
5 #pragma once
6 
7 #include <mc_solver/QPSolver.h>
8 
9 #include <Tasks/QPMotionConstr.h>
10 #include <Tasks/QPSolver.h>
11 
12 namespace mc_solver
13 {
14 
20 {
21  TasksQPSolver(mc_rbdyn::RobotsPtr robots, double timeStep) : QPSolver(robots, timeStep, QPSolver::Backend::Tasks)
22  { positive_lambda_constraint_.addToSolver(this->robots().mbs(), solver_); }
23 
24  TasksQPSolver(double timeStep) : QPSolver(timeStep, QPSolver::Backend::Tasks)
25  { positive_lambda_constraint_.addToSolver(robots().mbs(), solver_); }
26 
27  ~TasksQPSolver() final = default;
28 
29  using QPSolver::addTask;
30 
35  void addTask(tasks::qp::Task * task);
36 
38  inline void addTask(std::shared_ptr<tasks::qp::Task> task)
39  {
40  if(task)
41  {
42  addTask(task.get());
43  shPtrTasksStorage.emplace_back(task);
44  }
45  }
46 
48 
53 
54  void setContacts(ControllerToken, const std::vector<mc_rbdyn::Contact> & contacts) final;
55 
60  template<typename... Fun>
62  {
63  constraint->addToSolver(robots().mbs(), solver_);
64  solver_.updateConstrSize();
65  solver_.updateNrVars(robots().mbs());
66  }
67 
71  template<typename... Fun>
73  {
74  constraint->removeFromSolver(solver_);
75  solver_.updateConstrSize();
76  solver_.updateNrVars(robots().mbs());
77  }
78 
84  std::pair<int, const tasks::qp::BilateralContact &> contactById(const tasks::qp::ContactId & id) const;
85 
90  Eigen::VectorXd lambdaVec(int cIndex) const;
91 
92  const sva::ForceVecd desiredContactForce(const mc_rbdyn::Contact & id) const final;
93 
99  void updateNrVars();
100 
102  void updateNrVars(const mc_rbdyn::Robots & robots);
103 
111 
113  inline tasks::qp::SolverData & data() noexcept { return solver_.data(); }
114 
116  inline const tasks::qp::SolverData & data() const noexcept { return solver_.data(); }
117 
119  tasks::qp::QPSolver & solver() noexcept { return solver_; }
120 
122  const tasks::qp::QPSolver & solver() const noexcept { return solver_; }
123 
130  static inline TasksQPSolver & from_solver(QPSolver & solver) noexcept
131  {
132  assert(solver.backend() == QPSolver::Backend::Tasks);
133  return static_cast<TasksQPSolver &>(solver);
134  }
135 
142  static inline const TasksQPSolver & from_solver(const QPSolver & solver) noexcept
143  {
144  assert(solver.backend() == QPSolver::Backend::Tasks);
145  return static_cast<const TasksQPSolver &>(solver);
146  }
147 
148  double solveTime() final;
149 
150  double solveAndBuildTime() final;
151 
152  const Eigen::VectorXd & result() const;
153 
154 private:
156  tasks::qp::QPSolver solver_;
158  tasks::qp::PositiveLambda positive_lambda_constraint_;
160  std::vector<tasks::qp::UnilateralContact> uniContacts_;
162  std::vector<tasks::qp::BilateralContact> biContacts_;
164  bool runOpenLoop();
166  bool runJointsFeedback(bool wVelocity);
187  bool runClosedLoop(bool integrateControlState);
188 
190  std::vector<std::vector<double>> prev_encoders_{};
191  std::vector<std::vector<double>> encoders_alpha_{};
192  std::vector<std::vector<std::vector<double>>> control_q_{};
193  std::vector<std::vector<std::vector<double>>> control_alpha_{};
194 
196  std::vector<mc_solver::DynamicsConstraint *> dynamicsConstraints_;
197 
198  bool run_impl(FeedbackType fType = FeedbackType::None) final;
199 
200  void addDynamicsConstraint(mc_solver::DynamicsConstraint * dynamics) final;
201 
202  void removeDynamicsConstraint(mc_solver::ConstraintSet * maybe_dynamics) final;
203 };
204 
211 inline TasksQPSolver & tasks_solver(QPSolver & solver) noexcept
212 { return TasksQPSolver::from_solver(solver); }
213 
214 /* const version */
215 inline const TasksQPSolver & tasks_solver(const QPSolver & solver) noexcept
216 { return TasksQPSolver::from_solver(solver); }
217 
218 } // namespace mc_solver
void removeFromSolver(QPSolver &sol)
void addToSolver(QPSolver &sol)
#define MC_SOLVER_DLLAPI
Definition: api.h:50
std::shared_ptr< Robots > RobotsPtr
Definition: fwd.h:17
Definition: Contact.h:18
TasksQPSolver & tasks_solver(QPSolver &solver) noexcept
Definition: TasksQPSolver.h:211
Definition: Contact.h:49
Definition: Robots.h:17
This class is a basis to wrap Constraint functions from Tasks. The aim of such wrappers should be two...
Definition: ConstraintSet.h:21
Definition: DynamicsConstraint.h:21
Definition: QPSolver.h:104
Definition: QPSolver.h:88
void removeTask(mc_tasks::MetaTask *task)
Backend
Definition: QPSolver.h:93
Definition: TasksQPSolver.h:20
tasks::qp::QPSolver & solver() noexcept
Definition: TasksQPSolver.h:119
static const TasksQPSolver & from_solver(const QPSolver &solver) noexcept
Definition: TasksQPSolver.h:142
const tasks::qp::QPSolver & solver() const noexcept
Definition: TasksQPSolver.h:122
~TasksQPSolver() final=default
const sva::ForceVecd desiredContactForce(const mc_rbdyn::Contact &id) const final
tasks::qp::SolverData & data() noexcept
Definition: TasksQPSolver.h:113
double solveTime() final
std::pair< int, const tasks::qp::BilateralContact & > contactById(const tasks::qp::ContactId &id) const
TasksQPSolver(mc_rbdyn::RobotsPtr robots, double timeStep)
Definition: TasksQPSolver.h:21
void updateNrVars(const mc_rbdyn::Robots &robots)
const tasks::qp::SolverData & data() const noexcept
Definition: TasksQPSolver.h:116
void removeConstraint(tasks::qp::ConstraintFunction< Fun... > *constraint)
Definition: TasksQPSolver.h:72
void removeTask(tasks::qp::Task *task)
static TasksQPSolver & from_solver(QPSolver &solver) noexcept
Definition: TasksQPSolver.h:130
void addConstraint(tasks::qp::ConstraintFunction< Fun... > *constraint)
Definition: TasksQPSolver.h:61
Eigen::VectorXd lambdaVec(int cIndex) const
void setContacts(ControllerToken, const std::vector< mc_rbdyn::Contact > &contacts) final
TasksQPSolver(double timeStep)
Definition: TasksQPSolver.h:24