TVM  0.9.4
VelocityDamper.h
Go to the documentation of this file.
1 /*
2  * Copyright 2017-2020 CNRS-AIST JRL and CNRS-UM LIRMM
3  */
4 
5 #pragma once
6 
8 
9 #include <optional>
10 
11 namespace tvm
12 {
13 
14 namespace task_dynamics
15 {
16 
45 {
46 public:
51  {
52  public:
65  Config(double di, double ds, double xsi, double xsiOff = 0);
66 
67  double di_;
68  double ds_;
69  double xsi_;
70  double xsiOff_;
71  };
72 
77  {
78  public:
94  const VectorConstRef & ds,
95  const VectorConstRef & xsi,
96  const std::optional<VectorConstRef> & xsiOff = std::nullopt);
97 
102  AnisotropicConfig(const Config & config);
103 
104  Eigen::VectorXd di_;
105  Eigen::VectorXd ds_;
106  Eigen::VectorXd xsi_;
107  Eigen::VectorXd xsiOff_;
108  };
109 
111  {
112  public:
113  // First order dynamics
116  const Eigen::VectorXd & rhs,
117  bool autoXsi,
118  const Eigen::VectorXd & di,
119  const Eigen::VectorXd & ds,
120  const Eigen::VectorXd & xsi,
121  double big);
122  // Second order dynamics
125  const Eigen::VectorXd & rhs,
126  double dt,
127  bool autoXsi,
128  const Eigen::VectorXd & di,
129  const Eigen::VectorXd & ds,
130  const Eigen::VectorXd & xsi,
131  double big);
132 
133  void updateValue() override;
134 
135  ~Impl() override = default;
136 
137  private:
139  void updateValue_(double s);
140 
141  double dt_;
142  Eigen::VectorXd ds_;
143  Eigen::VectorXd di_;
144  Eigen::VectorXd xsiOff_;
145  Eigen::VectorXd a_; // -1 / (di - ds)
146  double big_;
147 
148  bool autoXsi_;
149  Eigen::VectorXd d_;
150  Eigen::VectorXd axsi_; // a * xsi = -xsi / (di - ds)
151  std::vector<bool> active_;
152  };
153 
166  VelocityDamper(const Config & config, double big = constant::big_number);
167 
178  VelocityDamper(const AnisotropicConfig & config, double big = constant::big_number);
179 
189  VelocityDamper(double dt, const Config & config, double big = constant::big_number);
190 
200  VelocityDamper(double dt, const AnisotropicConfig & config, double big = constant::big_number);
201 
202  ~VelocityDamper() override = default;
203 
204 protected:
205  std::unique_ptr<abstract::TaskDynamicsImpl> impl_(FunctionPtr f,
207  const Eigen::VectorXd & rhs) const override;
208  Order order_() const override;
209 
210  template<typename Derived, typename... Args>
211  std::unique_ptr<abstract::TaskDynamicsImpl> impl_(FunctionPtr f,
213  const Eigen::VectorXd & rhs,
214  Args &&... args) const
215  {
216  if(dt_ > 0)
217  {
218  return std::make_unique<Derived>(f, t, rhs, std::forward<Args>(args)..., dt_, autoXsi_, di_, ds_, xsi_, big_);
219  }
220  return std::make_unique<Derived>(f, t, rhs, std::forward<Args>(args)..., autoXsi_, di_, ds_, xsi_, big_);
221  }
222 
223 private:
224  double dt_;
225  Eigen::VectorXd xsi_;
226  Eigen::VectorXd ds_;
227  Eigen::VectorXd di_;
228  double big_;
229  bool autoXsi_;
230 };
231 
232 } // namespace task_dynamics
233 
234 } // namespace tvm
#define TVM_DLLAPI
Definition: api.h:35
Eigen::VectorXd xsi_
Definition: VelocityDamper.h:106
Eigen::VectorXd di_
Definition: VelocityDamper.h:104
Eigen::VectorXd ds_
Definition: VelocityDamper.h:105
Eigen::VectorXd xsiOff_
Definition: VelocityDamper.h:107
AnisotropicConfig(const VectorConstRef &di, const VectorConstRef &ds, const VectorConstRef &xsi, const std::optional< VectorConstRef > &xsiOff=std::nullopt)
Definition: VelocityDamper.h:51
double xsi_
Definition: VelocityDamper.h:69
double ds_
Definition: VelocityDamper.h:68
double xsiOff_
Definition: VelocityDamper.h:70
Config(double di, double ds, double xsi, double xsiOff=0)
double di_
Definition: VelocityDamper.h:67
Definition: VelocityDamper.h:111
Impl(FunctionPtr f, constraint::Type t, const Eigen::VectorXd &rhs, double dt, bool autoXsi, const Eigen::VectorXd &di, const Eigen::VectorXd &ds, const Eigen::VectorXd &xsi, double big)
Impl(FunctionPtr f, constraint::Type t, const Eigen::VectorXd &rhs, bool autoXsi, const Eigen::VectorXd &di, const Eigen::VectorXd &ds, const Eigen::VectorXd &xsi, double big)
Definition: VelocityDamper.h:45
VelocityDamper(double dt, const AnisotropicConfig &config, double big=constant::big_number)
Velocity damper for second order dynamics.
VelocityDamper(double dt, const Config &config, double big=constant::big_number)
Velocity damper for second order dynamics.
~VelocityDamper() override=default
std::unique_ptr< abstract::TaskDynamicsImpl > impl_(FunctionPtr f, constraint::Type t, const Eigen::VectorXd &rhs) const override
Order order_() const override
VelocityDamper(const AnisotropicConfig &config, double big=constant::big_number)
Velocity damper for first order dynamics.
std::unique_ptr< abstract::TaskDynamicsImpl > impl_(FunctionPtr f, constraint::Type t, const Eigen::VectorXd &rhs, Args &&... args) const
Definition: VelocityDamper.h:211
VelocityDamper(const Config &config, double big=constant::big_number)
Velocity damper for first order dynamics.
Definition: TaskDynamicsImpl.h:33
Definition: TaskDynamics.h:37
Type
Definition: enums.h:15
Order
Definition: enums.h:14
Definition: Clock.h:12
std::shared_ptr< function::abstract::Function > FunctionPtr
Definition: defs.h:57
Eigen::Ref< const Eigen::VectorXd > VectorConstRef
Definition: defs.h:50