MetaTask.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_tasks/api.h>
8 
9 #include <mc_rtc/Configuration.h>
11 #include <mc_rtc/log/Logger.h>
12 
13 #include <mc_solver/QPSolver.h>
14 #include <mc_solver/api.h>
15 
16 #include <cmath>
17 
18 namespace mc_control
19 {
20 struct CompletionCriteria;
21 }
22 
23 namespace mc_solver
24 {
25 
26 struct TasksQPSolver;
27 struct TVMQPSolver;
28 
29 } // namespace mc_solver
30 
31 namespace mc_tasks
32 {
33 
40 {
41  friend struct mc_solver::QPSolver;
42  friend struct mc_solver::TasksQPSolver;
43  friend struct mc_solver::TVMQPSolver;
45 
48 
49 public:
50  inline MetaTask() : backend_(mc_solver::QPSolver::context_backend()) {}
51 
52  virtual ~MetaTask();
53 
55  const std::string & type() const { return type_; }
56 
64  virtual inline void name(const std::string & name) { name_ = name; }
65 
67  inline const std::string & name() const { return name_; }
68 
70  virtual void reset() = 0;
71 
80  virtual void dimWeight(const Eigen::VectorXd & dimW) = 0;
81 
83  virtual Eigen::VectorXd dimWeight() const = 0;
84 
101  const std::vector<std::string> & activeJointsName,
102  const std::map<std::string, std::vector<std::array<int, 2>>> & activeDofs = {}) = 0;
103 
119  virtual void selectUnactiveJoints(
120  mc_solver::QPSolver & solver,
121  const std::vector<std::string> & unactiveJointsName,
122  const std::map<std::string, std::vector<std::array<int, 2>>> & unactiveDofs = {}) = 0;
123 
129  virtual void resetJointsSelector(mc_solver::QPSolver & solver) = 0;
130 
136  virtual Eigen::VectorXd eval() const = 0;
137 
143  virtual Eigen::VectorXd speed() const = 0;
144 
146  virtual void load(mc_solver::QPSolver & solver, const mc_rtc::Configuration & config);
147 
149  inline size_t iterInSolver() const noexcept { return iterInSolver_; }
150 
152  inline void resetIterInSolver() noexcept { iterInSolver_ = 0; }
153 
155  inline void incrementIterInSolver() noexcept { iterInSolver_++; }
156 
157  inline Backend backend() const noexcept { return backend_; }
158 
159 protected:
165  virtual void addToSolver(mc_solver::QPSolver & solver) = 0;
166 
169  static inline void addToSolver(MetaTask & t, mc_solver::QPSolver & solver) { t.addToSolver(solver); }
170 
176  virtual void removeFromSolver(mc_solver::QPSolver & solver) = 0;
177 
180  static inline void removeFromSolver(MetaTask & t, mc_solver::QPSolver & solver) { t.removeFromSolver(solver); }
181 
189  virtual void update(mc_solver::QPSolver & solver) = 0;
190 
192  static inline void update(MetaTask & t, mc_solver::QPSolver & solver) { t.update(solver); }
193 
201  virtual void addToLogger(mc_rtc::Logger &) {}
202 
205  static inline void addToLogger(MetaTask & t, mc_rtc::Logger & logger) { t.addToLogger(logger); }
206 
215 
218  static inline void removeFromLogger(MetaTask & t, mc_rtc::Logger & logger) { t.removeFromLogger(logger); }
219 
229 
232  static inline void addToGUI(MetaTask & t, mc_rtc::gui::StateBuilder & gui) { t.addToGUI(gui); }
233 
242 
245  static inline void removeFromGUI(MetaTask & t, mc_rtc::gui::StateBuilder & gui) { t.removeFromGUI(gui); }
246 
247  inline static void ensureHasJoints(const mc_rbdyn::Robot & robot,
248  const std::vector<std::string> & joints,
249  const std::string & prefix)
250  {
251  for(const auto & jName : joints)
252  {
253  if(!robot.hasJoint(jName))
254  {
255  mc_rtc::log::error_and_throw("{} No joint named {} in robot {}", prefix, jName, robot.name());
256  }
257  }
258  }
259 
278  virtual std::function<bool(const mc_tasks::MetaTask & task, std::string &)> buildCompletionCriteria(
279  double dt,
280  const mc_rtc::Configuration & config) const;
281 
284 
285  std::string type_;
286  std::string name_;
287 
288  size_t iterInSolver_ = 0;
289 };
290 
291 using MetaTaskPtr = std::shared_ptr<MetaTask>;
292 
293 } // namespace mc_tasks
#define MC_SOLVER_DLLAPI
Definition: api.h:50
Definition: CompletionCriteria.h:11
void error_and_throw(Args &&... args)
Definition: logging.h:47
Definition: Contact.h:18
Definition: StabilizerStandingState.h:12
std::shared_ptr< MetaTask > MetaTaskPtr
Definition: MetaTask.h:291
Definition: CompletionCriteria.h:54
Definition: Robot.h:63
const std::string & name() const
bool hasJoint(const std::string &name) const
Simplify access to values hold within a JSON file.
Definition: Configuration.h:166
Logs controller data to disk.
Definition: Logger.h:30
Definition: StateBuilder.h:28
Definition: QPSolver.h:86
Backend
Definition: QPSolver.h:91
Definition: TVMQPSolver.h:24
Definition: TasksQPSolver.h:20
Represents a generic task.
Definition: MetaTask.h:40
size_t iterInSolver() const noexcept
Get the number of iterations since the task was added to the solver.
Definition: MetaTask.h:149
virtual void addToLogger(mc_rtc::Logger &)
Definition: MetaTask.h:201
virtual void removeFromLogger(mc_rtc::Logger &)
virtual void update(mc_solver::QPSolver &solver)=0
Update the task.
static void removeFromLogger(MetaTask &t, mc_rtc::Logger &logger)
Definition: MetaTask.h:218
virtual void load(mc_solver::QPSolver &solver, const mc_rtc::Configuration &config)
Load parameters from a Configuration object.
Backend backend() const noexcept
Definition: MetaTask.h:157
virtual Eigen::VectorXd speed() const =0
Returns the task velocity.
virtual void selectActiveJoints(mc_solver::QPSolver &solver, const std::vector< std::string > &activeJointsName, const std::map< std::string, std::vector< std::array< int, 2 >>> &activeDofs={})=0
Setup an active joints selector.
virtual void removeFromGUI(mc_rtc::gui::StateBuilder &)
static void update(MetaTask &t, mc_solver::QPSolver &solver)
Definition: MetaTask.h:192
static void ensureHasJoints(const mc_rbdyn::Robot &robot, const std::vector< std::string > &joints, const std::string &prefix)
Definition: MetaTask.h:247
virtual void addToGUI(mc_rtc::gui::StateBuilder &)
std::string name_
Definition: MetaTask.h:286
static void addToSolver(MetaTask &t, mc_solver::QPSolver &solver)
Definition: MetaTask.h:169
static void addToGUI(MetaTask &t, mc_rtc::gui::StateBuilder &gui)
Definition: MetaTask.h:232
virtual void resetJointsSelector(mc_solver::QPSolver &solver)=0
Reset active joints selection.
virtual std::function< bool(const mc_tasks::MetaTask &task, std::string &)> buildCompletionCriteria(double dt, const mc_rtc::Configuration &config) const
static void removeFromGUI(MetaTask &t, mc_rtc::gui::StateBuilder &gui)
Definition: MetaTask.h:245
virtual void reset()=0
Reset the task.
virtual void addToSolver(mc_solver::QPSolver &solver)=0
Add the task to a solver.
const std::string & name() const
Definition: MetaTask.h:67
virtual void dimWeight(const Eigen::VectorXd &dimW)=0
Set the task's dimension weight vector.
virtual void selectUnactiveJoints(mc_solver::QPSolver &solver, const std::vector< std::string > &unactiveJointsName, const std::map< std::string, std::vector< std::array< int, 2 >>> &unactiveDofs={})=0
Setup an unactive joints selector.
MetaTask()
Definition: MetaTask.h:50
virtual void name(const std::string &name)
Definition: MetaTask.h:64
void resetIterInSolver() noexcept
Set the number of iterations since the task was added to the solver to zero.
Definition: MetaTask.h:152
Backend backend_
Definition: MetaTask.h:283
const std::string & type() const
Definition: MetaTask.h:55
static void addToLogger(MetaTask &t, mc_rtc::Logger &logger)
Definition: MetaTask.h:205
virtual Eigen::VectorXd eval() const =0
Returns the task error.
void incrementIterInSolver() noexcept
Increment the number of iterations since the task was added to the solver.
Definition: MetaTask.h:155
std::string type_
Definition: MetaTask.h:285
virtual Eigen::VectorXd dimWeight() const =0
Get the current task's dim weight vector.
static void removeFromSolver(MetaTask &t, mc_solver::QPSolver &solver)
Definition: MetaTask.h:180
virtual void removeFromSolver(mc_solver::QPSolver &solver)=0
Remove the task from a solver.