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  {
23  positive_lambda_constraint_.addToSolver(this->robots().mbs(), solver_);
24  }
25 
26  TasksQPSolver(double timeStep) : QPSolver(timeStep, QPSolver::Backend::Tasks)
27  {
28  positive_lambda_constraint_.addToSolver(robots().mbs(), solver_);
29  }
30 
31  ~TasksQPSolver() final = default;
32 
33  using QPSolver::addTask;
34 
39  void addTask(tasks::qp::Task * task);
40 
42  inline void addTask(std::shared_ptr<tasks::qp::Task> task)
43  {
44  if(task)
45  {
46  addTask(task.get());
47  shPtrTasksStorage.emplace_back(task);
48  }
49  }
50 
52 
56  void removeTask(tasks::qp::Task * task);
57 
58  void setContacts(ControllerToken, const std::vector<mc_rbdyn::Contact> & contacts) final;
59 
64  template<typename... Fun>
65  void addConstraint(tasks::qp::ConstraintFunction<Fun...> * constraint)
66  {
67  constraint->addToSolver(robots().mbs(), solver_);
68  solver_.updateConstrSize();
69  solver_.updateNrVars(robots().mbs());
70  }
71 
75  template<typename... Fun>
76  void removeConstraint(tasks::qp::ConstraintFunction<Fun...> * constraint)
77  {
78  constraint->removeFromSolver(solver_);
79  solver_.updateConstrSize();
80  solver_.updateNrVars(robots().mbs());
81  }
82 
88  std::pair<int, const tasks::qp::BilateralContact &> contactById(const tasks::qp::ContactId & id) const;
89 
94  Eigen::VectorXd lambdaVec(int cIndex) const;
95 
96  const sva::ForceVecd desiredContactForce(const mc_rbdyn::Contact & id) const final;
97 
103  void updateNrVars();
104 
106  void updateNrVars(const mc_rbdyn::Robots & robots);
107 
114  void updateConstrSize();
115 
117  inline tasks::qp::SolverData & data() noexcept { return solver_.data(); }
118 
120  inline const tasks::qp::SolverData & data() const noexcept { return solver_.data(); }
121 
123  tasks::qp::QPSolver & solver() noexcept { return solver_; }
124 
126  const tasks::qp::QPSolver & solver() const noexcept { return solver_; }
127 
134  static inline TasksQPSolver & from_solver(QPSolver & solver) noexcept
135  {
136  assert(solver.backend() == QPSolver::Backend::Tasks);
137  return static_cast<TasksQPSolver &>(solver);
138  }
139 
146  static inline const TasksQPSolver & from_solver(const QPSolver & solver) noexcept
147  {
148  assert(solver.backend() == QPSolver::Backend::Tasks);
149  return static_cast<const TasksQPSolver &>(solver);
150  }
151 
152  double solveTime() final;
153 
154  double solveAndBuildTime() final;
155 
156  const Eigen::VectorXd & result() const;
157 
158 private:
160  tasks::qp::QPSolver solver_;
162  tasks::qp::PositiveLambda positive_lambda_constraint_;
164  std::vector<tasks::qp::UnilateralContact> uniContacts_;
166  std::vector<tasks::qp::BilateralContact> biContacts_;
168  bool runOpenLoop();
170  bool runJointsFeedback(bool wVelocity);
191  bool runClosedLoop(bool integrateControlState);
192 
194  std::vector<std::vector<double>> prev_encoders_{};
195  std::vector<std::vector<double>> encoders_alpha_{};
196  std::vector<std::vector<std::vector<double>>> control_q_{};
197  std::vector<std::vector<std::vector<double>>> control_alpha_{};
198 
200  std::vector<mc_solver::DynamicsConstraint *> dynamicsConstraints_;
201 
202  bool run_impl(FeedbackType fType = FeedbackType::None) final;
203 
204  void addDynamicsConstraint(mc_solver::DynamicsConstraint * dynamics) final;
205 
206  void removeDynamicsConstraint(mc_solver::ConstraintSet * maybe_dynamics) final;
207 };
208 
215 inline TasksQPSolver & tasks_solver(QPSolver & solver) noexcept
216 {
217  return TasksQPSolver::from_solver(solver);
218 }
219 
220 /* const version */
221 inline const TasksQPSolver & tasks_solver(const QPSolver & solver) noexcept
222 {
223  return TasksQPSolver::from_solver(solver);
224 }
225 
226 } // namespace mc_solver
mc_solver::DynamicsConstraint
Definition: DynamicsConstraint.h:20
mc_solver::TasksQPSolver
Definition: TasksQPSolver.h:19
mc_rbdyn::Robots
Definition: Robots.h:15
mc_solver::QPSolver::removeTask
void removeTask(mc_tasks::MetaTask *task)
mc_solver::TasksQPSolver::solver
const tasks::qp::QPSolver & solver() const noexcept
Definition: TasksQPSolver.h:126
mc_solver::QPSolver
Definition: QPSolver.h:85
mc_solver::TasksQPSolver::data
tasks::qp::SolverData & data() noexcept
Definition: TasksQPSolver.h:117
mc_rbdyn::RobotsPtr
std::shared_ptr< Robots > RobotsPtr
Definition: fwd.h:17
mc_solver::TasksQPSolver::solver
tasks::qp::QPSolver & solver() noexcept
Definition: TasksQPSolver.h:123
mc_solver::ConstraintSet
This class is a basis to wrap Constraint functions from Tasks. The aim of such wrappers should be two...
Definition: ConstraintSet.h:20
mc_solver::TasksQPSolver::removeConstraint
void removeConstraint(tasks::qp::ConstraintFunction< Fun... > *constraint)
Definition: TasksQPSolver.h:76
mc_solver::TasksQPSolver::from_solver
static TasksQPSolver & from_solver(QPSolver &solver) noexcept
Definition: TasksQPSolver.h:134
mc_solver::TasksQPSolver::TasksQPSolver
TasksQPSolver(mc_rbdyn::RobotsPtr robots, double timeStep)
Definition: TasksQPSolver.h:21
mc_solver::QPSolver::Backend
Backend
Definition: QPSolver.h:90
mc_solver::tasks_solver
TasksQPSolver & tasks_solver(QPSolver &solver) noexcept
Definition: TasksQPSolver.h:215
mc_solver::TasksQPSolver::from_solver
static const TasksQPSolver & from_solver(const QPSolver &solver) noexcept
Definition: TasksQPSolver.h:146
mc_solver::TasksQPSolver::addConstraint
void addConstraint(tasks::qp::ConstraintFunction< Fun... > *constraint)
Definition: TasksQPSolver.h:65
mc_solver::TasksQPSolver::TasksQPSolver
TasksQPSolver(double timeStep)
Definition: TasksQPSolver.h:26
std
Definition: Contact.h:66
mc_solver::TasksQPSolver::data
const tasks::qp::SolverData & data() const noexcept
Definition: TasksQPSolver.h:120
mc_rbdyn::Contact
Definition: Contact.h:48
mc_solver
Definition: Contact.h:17
mc_solver::QPSolver::Backend::Tasks
@ Tasks
MC_SOLVER_DLLAPI
#define MC_SOLVER_DLLAPI
Definition: api.h:50
QPSolver.h