TrajectoryTaskGeneric.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/MetaTask.h>
8 
10 
11 #include <mc_rbdyn/Robots.h>
12 
13 #include <mc_rtc/logging.h>
14 #include <mc_rtc/void_ptr.h>
15 
16 #include <Tasks/QPTasks.h>
17 
18 namespace mc_tasks
19 {
20 
27 {
30 
46  TrajectoryTaskGeneric(const mc_rbdyn::Robots & robots, unsigned int robotIndex, double stiffness, double weight);
47 
63  TrajectoryTaskGeneric(const mc_rbdyn::RobotFrame & frame, double stiffness, double weight);
64 
65  virtual ~TrajectoryTaskGeneric() = default;
66 
70  void reset() override;
71 
77  void refVel(const Eigen::VectorXd & vel);
78 
82  const Eigen::VectorXd & refVel() const;
83 
89  void refAccel(const Eigen::VectorXd & accel);
90 
94  const Eigen::VectorXd & refAccel() const;
95 
103  void stiffness(double stiffness);
104 
114  void stiffness(const Eigen::VectorXd & stiffness);
115 
121  void damping(double damping);
122 
130  void damping(const Eigen::VectorXd & damping);
131 
139  void setGains(double stiffness, double damping);
140 
150  void setGains(const Eigen::VectorXd & stiffness, const Eigen::VectorXd & damping);
151 
153  double stiffness() const;
154 
156  double damping() const;
157 
159  const Eigen::VectorXd & dimStiffness() const;
160 
162  const Eigen::VectorXd & dimDamping() const;
163 
169  void weight(double w);
170 
172  double weight() const;
173 
174  void dimWeight(const Eigen::VectorXd & dimW) override;
175 
176  Eigen::VectorXd dimWeight() const override;
177 
191  void selectActiveJoints(const std::vector<std::string> & activeJointsName,
192  const std::map<std::string, std::vector<std::array<int, 2>>> & activeDofs = {},
193  bool checkJoints = true);
194 
207  void selectActiveJoints(mc_solver::QPSolver & solver,
208  const std::vector<std::string> & activeJointsName,
209  const std::map<std::string, std::vector<std::array<int, 2>>> & activeDofs = {}) override;
210 
224  void selectUnactiveJoints(const std::vector<std::string> & unactiveJointsName,
225  const std::map<std::string, std::vector<std::array<int, 2>>> & unactiveDofs = {},
226  bool checkJoints = true);
227 
240  void selectUnactiveJoints(mc_solver::QPSolver & solver,
241  const std::vector<std::string> & unactiveJointsName,
242  const std::map<std::string, std::vector<std::array<int, 2>>> & unactiveDofs = {}) override;
243 
244  virtual void resetJointsSelector();
245 
246  void resetJointsSelector(mc_solver::QPSolver & solver) override;
247 
248  Eigen::VectorXd eval() const override;
249 
250  Eigen::VectorXd speed() const override;
251 
252  const Eigen::VectorXd & normalAcc() const;
253 
254  void load(mc_solver::QPSolver & solver, const mc_rtc::Configuration & config) override;
255 
256 protected:
265  template<Backend backend, typename ErrorT, typename... Args>
266  inline void finalize(Args &&... args)
267  {
268  assert(backend == backend_);
269  errorT = mc_rtc::make_void_ptr<ErrorT>(std::forward<Args>(args)...);
270  if constexpr(backend == Backend::Tasks)
271  {
272  trajectoryT_ = mc_rtc::make_void_ptr<tasks::qp::TrajectoryTask>(
273  robots.mbs(), rIndex, static_cast<ErrorT *>(errorT.get()), stiffness_(0), damping_(0), weight_);
274  auto & trajectory = *static_cast<tasks::qp::TrajectoryTask *>(trajectoryT_.get());
275  stiffness_ = trajectory.stiffness();
276  damping_ = trajectory.damping();
277  if(refVel_.size() != trajectory.refVel().size()) { refVel_ = trajectory.refVel(); }
278  if(refAccel_.size() != trajectory.refAccel().size()) { refAccel_ = trajectory.refAccel(); }
279  }
280  else if constexpr(backend == Backend::TVM)
281  {
282  auto error = static_cast<ErrorT *>(errorT.get());
283  trajectoryT_ = mc_rtc::make_void_ptr<details::TVMTrajectoryTaskGenericPtr>(
284  std::make_shared<details::TVMTrajectoryTaskGeneric>());
285  static_cast<details::TVMTrajectoryTaskGenericPtr *>(trajectoryT_.get())->get()->init<ErrorT>(error);
286  int size = error->size();
287  stiffness_ = Eigen::VectorXd::Constant(size, 1, stiffness_(0));
288  damping_ = Eigen::VectorXd::Constant(size, 1, damping_(0));
289  if constexpr(details::has_refVel_v<ErrorT>) { refVel_ = error->refVel(); }
290  if constexpr(details::has_refAccel_v<ErrorT>) { refAccel_ = error->refAccel(); }
291  }
292  else { mc_rtc::log::error_and_throw("[{} task] Not implemented for backend: {}", backend_); }
293  }
294 
295  void addToGUI(mc_rtc::gui::StateBuilder &) override;
296 
297  void addToLogger(mc_rtc::Logger & logger) override;
298 
299  std::function<bool(const mc_tasks::MetaTask & task, std::string &)> buildCompletionCriteria(
300  double dt,
301  const mc_rtc::Configuration & config) const override;
302 
304  unsigned int rIndex;
309  mc_rtc::void_ptr errorT{nullptr, nullptr};
310  Eigen::VectorXd refVel_;
311  Eigen::VectorXd refAccel_;
312  bool inSolver_ = false;
321  mc_rtc::void_ptr trajectoryT_{nullptr, nullptr};
322 
323  void addToSolver(mc_solver::QPSolver & solver) override;
324 
325  Eigen::VectorXd stiffness_;
326  Eigen::VectorXd damping_;
327  double weight_;
336  mc_rtc::void_ptr selectorT_{nullptr, nullptr};
337 
338  void removeFromSolver(mc_solver::QPSolver & solver) override;
339 
340  void update(mc_solver::QPSolver &) override;
341 };
342 
343 } // namespace mc_tasks
mc_rtc::Configuration
Simplify access to values hold within a JSON file.
Definition: Configuration.h:165
mc_rbdyn::Robots
Definition: Robots.h:15
void_ptr.h
mc_tasks::TrajectoryTaskGeneric::damping_
Eigen::VectorXd damping_
Definition: TrajectoryTaskGeneric.h:326
mc_tasks::MetaTask
Represents a generic task.
Definition: MetaTask.h:39
mc_tasks::TrajectoryTaskGeneric::stiffness_
Eigen::VectorXd stiffness_
Definition: TrajectoryTaskGeneric.h:325
MC_TASKS_DLLAPI
#define MC_TASKS_DLLAPI
Definition: api.h:50
mc_solver::QPSolver
Definition: QPSolver.h:85
mc_rtc::Logger
Logs controller data to disk.
Definition: Logger.h:29
mc_tasks::TrajectoryTaskGeneric::weight_
double weight_
Definition: TrajectoryTaskGeneric.h:327
mc_rbdyn::RobotFrame
Definition: RobotFrame.h:21
mc_tasks::TrajectoryTaskGeneric::refAccel_
Eigen::VectorXd refAccel_
Definition: TrajectoryTaskGeneric.h:311
mc_rtc::void_ptr
std::unique_ptr< void, void(*)(void *)> void_ptr
Definition: void_ptr.h:14
mc_tasks::TrajectoryTaskGeneric::rIndex
unsigned int rIndex
Definition: TrajectoryTaskGeneric.h:304
mc_tasks::TrajectoryTaskGeneric::finalize
void finalize(Args &&... args)
Definition: TrajectoryTaskGeneric.h:266
mc_rtc::gui::StateBuilder
Definition: StateBuilder.h:27
Robots.h
mc_rtc::log::error_and_throw
void error_and_throw(Args &&... args)
Definition: logging.h:47
mc_tasks::TrajectoryTaskGeneric::robots
const mc_rbdyn::Robots & robots
Definition: TrajectoryTaskGeneric.h:303
logging.h
mc_rtc::log::error
void error(Args &&... args)
Definition: logging.h:63
MetaTask.h
mc_tasks::details::TVMTrajectoryTaskGenericPtr
std::shared_ptr< TVMTrajectoryTaskGeneric > TVMTrajectoryTaskGenericPtr
Definition: TVMTrajectoryTaskGeneric.h:54
mc_tasks::TrajectoryTaskGeneric::refVel_
Eigen::VectorXd refVel_
Definition: TrajectoryTaskGeneric.h:310
TVMTrajectoryTaskGeneric.h
mc_tasks
Definition: StabilizerStandingState.h:11
mc_tasks::TrajectoryTaskGeneric
Generic wrapper for a trajectory dynamic over an error function.
Definition: TrajectoryTaskGeneric.h:26