TVM  0.9.9
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 
50 {
51 public:
56  {
57  public:
72  Config(double di, double ds, double xsi, double xsiOff = 0, double m = 0, double lambda = 0);
73 
74  double di_;
75  double ds_;
76  double xsi_;
77  double xsiOff_;
78  double m_;
79  double lambda_;
80  };
81 
86  {
87  public:
105  const VectorConstRef & ds,
106  const VectorConstRef & xsi,
107  const std::optional<VectorConstRef> & xsiOff = std::nullopt,
108  const std::optional<VectorConstRef> & m = std::nullopt,
109  const std::optional<VectorConstRef> & lambda = std::nullopt);
110 
115  AnisotropicConfig(const Config & config);
116 
117  Eigen::VectorXd di_;
118  Eigen::VectorXd ds_;
119  Eigen::VectorXd xsi_;
120  Eigen::VectorXd xsiOff_;
121  Eigen::VectorXd m_;
122  Eigen::VectorXd lambda_;
123  };
124 
126  {
127  public:
128  // First order dynamics
131  const Eigen::VectorXd & rhs,
132  bool autoXsi,
133  const Eigen::VectorXd & di,
134  const Eigen::VectorXd & ds,
135  const Eigen::VectorXd & xsi,
136  double big);
137  // Second order dynamics
140  const Eigen::VectorXd & rhs,
141  double dt,
142  bool autoXsi,
143  const Eigen::VectorXd & di,
144  const Eigen::VectorXd & ds,
145  const Eigen::VectorXd & xsi,
146  double big,
147  const Eigen::VectorXd & m,
148  const Eigen::VectorXd & lambda);
149 
150  void updateValue() override;
151 
152  ~Impl() override = default;
153 
154  private:
156  void updateValue_(double s);
157 
158  double dt_;
159  Eigen::VectorXd ds_;
160  Eigen::VectorXd di_;
161  Eigen::VectorXd xsiOff_;
162  Eigen::VectorXd a_; // -1 / (di - ds)
163  double big_;
164 
165  bool autoXsi_;
166  Eigen::VectorXd d_;
167  Eigen::VectorXd axsi_; // a * xsi = -xsi / (di - ds)
168  std::vector<bool> active_;
169 
170  Eigen::VectorXd m_;
171  Eigen::VectorXd lambda_;
172  };
173 
186  VelocityDamper(const Config & config, double big = constant::big_number);
187 
198  VelocityDamper(const AnisotropicConfig & config, double big = constant::big_number);
199 
209  VelocityDamper(double dt, const Config & config, double big = constant::big_number);
210 
220  VelocityDamper(double dt, const AnisotropicConfig & config, double big = constant::big_number);
221 
222  ~VelocityDamper() override = default;
223 
224 protected:
225  std::unique_ptr<abstract::TaskDynamicsImpl> impl_(FunctionPtr f,
227  const Eigen::VectorXd & rhs) const override;
228  Order order_() const override;
229 
230  template<typename Derived, typename... Args>
231  std::unique_ptr<abstract::TaskDynamicsImpl> impl_(FunctionPtr f,
233  const Eigen::VectorXd & rhs,
234  Args &&... args) const
235  {
236  if(dt_ > 0)
237  {
238  return std::make_unique<Derived>(f, t, rhs, std::forward<Args>(args)..., dt_, autoXsi_, di_, ds_, xsi_, big_, m_,
239  lambda_);
240  }
241  return std::make_unique<Derived>(f, t, rhs, std::forward<Args>(args)..., autoXsi_, di_, ds_, xsi_, big_);
242  }
243 
244 private:
245  double dt_;
246  Eigen::VectorXd xsi_;
247  Eigen::VectorXd ds_;
248  Eigen::VectorXd di_;
249  double big_;
250  bool autoXsi_;
251  Eigen::VectorXd m_;
252  Eigen::VectorXd lambda_;
253 };
254 
255 } // namespace task_dynamics
256 
257 } // namespace tvm
#define TVM_DLLAPI
Definition: api.h:35
Eigen::VectorXd lambda_
Definition: VelocityDamper.h:122
Eigen::VectorXd xsi_
Definition: VelocityDamper.h:119
Eigen::VectorXd m_
Definition: VelocityDamper.h:121
Eigen::VectorXd di_
Definition: VelocityDamper.h:117
Eigen::VectorXd ds_
Definition: VelocityDamper.h:118
AnisotropicConfig(const VectorConstRef &di, const VectorConstRef &ds, const VectorConstRef &xsi, const std::optional< VectorConstRef > &xsiOff=std::nullopt, const std::optional< VectorConstRef > &m=std::nullopt, const std::optional< VectorConstRef > &lambda=std::nullopt)
Eigen::VectorXd xsiOff_
Definition: VelocityDamper.h:120
Definition: VelocityDamper.h:56
double xsi_
Definition: VelocityDamper.h:76
double lambda_
Definition: VelocityDamper.h:79
double ds_
Definition: VelocityDamper.h:75
double m_
Definition: VelocityDamper.h:78
double xsiOff_
Definition: VelocityDamper.h:77
Config(double di, double ds, double xsi, double xsiOff=0, double m=0, double lambda=0)
double di_
Definition: VelocityDamper.h:74
Definition: VelocityDamper.h:126
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, const Eigen::VectorXd &m, const Eigen::VectorXd &lambda)
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:50
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:231
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