TVM  0.9.4
ProportionalDerivative.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 
7 // std::variant is basically unusable in clang 6 + libstdc++ due to a bug
8 // see, e.g. https://bugs.llvm.org/show_bug.cgi?id=33222
9 // We use https://github.com/mpark/variant/ instead
10 #include <mpark/variant.hpp>
11 
13 
14 namespace tvm
15 {
16 
17 namespace task_dynamics
18 {
19 
25 {
26 public:
27  using Gain = mpark::variant<double, Eigen::VectorXd, Eigen::MatrixXd>;
28 
30  {
31  public:
32  Impl(FunctionPtr f, constraint::Type t, const Eigen::VectorXd & rhs, const Gain & kp, const Gain & kv);
33  void updateValue() override;
34 
35  ~Impl() override = default;
36 
38  std::pair<const Gain &, const Gain &> gains() const;
50  void gains(double kp, double kv);
51  void gains(const Eigen::VectorXd & kp, const Eigen::VectorXd & kv);
52  void gains(const Eigen::MatrixXd & kp, const Eigen::MatrixXd & kv);
53  void gains(double kp, const Eigen::VectorXd & kv);
54  void gains(double kp, const Eigen::MatrixXd & kv);
55  void gains(const Eigen::VectorXd & kp, double kv);
56  void gains(const Eigen::VectorXd & kp, const Eigen::MatrixXd & kv);
57  void gains(const Eigen::MatrixXd & kp, double kv);
58  void gains(const Eigen::MatrixXd & kp, const Eigen::VectorXd & kv);
65  void gains(double kp);
70  void gains(const Eigen::VectorXd & kp);
79  void gains(const Eigen::MatrixXd & kp);
80 
82  const Gain & kp() const { return kp_; }
87  template<typename T>
88  const T & kp() const
89  { return mpark::get<T>(kp_); }
94  Gain & kp() { return kp_; }
101  template<typename T>
102  T & kp()
103  { return mpark::get<T>(kp_); }
104 
106  const Gain & kv() const { return kv_; }
111  template<typename T>
112  const T & kv() const
113  { return mpark::get<T>(kv_); }
118  Gain & kv() { return kv_; }
125  template<typename T>
126  T & kv()
127  { return mpark::get<T>(kv_); }
128 
129  private:
130  void checkGainSize(double k) const;
131  void checkGainSize(const Eigen::VectorXd & k) const;
132  void checkGainSize(const Eigen::MatrixXd & k) const;
133  template<typename T, typename U>
134  void gains_(const T & kp, const U & kv);
135 
136  Gain kp_; // Stiffness gain
137  Gain kv_; // Damping gain
138  };
139 
151  ProportionalDerivative(double kp, double kv);
152  ProportionalDerivative(const Eigen::VectorXd & kp, const Eigen::VectorXd & kv);
153  ProportionalDerivative(const Eigen::MatrixXd & kp, const Eigen::MatrixXd & kv);
154  ProportionalDerivative(double kp, const Eigen::VectorXd & kv);
155  ProportionalDerivative(double kp, const Eigen::MatrixXd & kv);
156  ProportionalDerivative(const Eigen::VectorXd & kp, double kv);
157  ProportionalDerivative(const Eigen::VectorXd & kp, const Eigen::MatrixXd & kv);
158  ProportionalDerivative(const Eigen::MatrixXd & kp, double kv);
159  ProportionalDerivative(const Eigen::MatrixXd & kp, const Eigen::VectorXd & kv);
171  ProportionalDerivative(const Eigen::VectorXd & kp);
180  ProportionalDerivative(const Eigen::MatrixXd & kp);
181 
182  ~ProportionalDerivative() override = default;
183 
184 protected:
185  std::unique_ptr<abstract::TaskDynamicsImpl> impl_(FunctionPtr f,
187  const Eigen::VectorXd & rhs) const override;
188  Order order_() const override;
189 
191 
192 private:
193  Gain kp_; // Stiffness gain
194  Gain kv_; // Damping gain
195 };
196 
199 
200 template<typename T, typename U>
201 inline void ProportionalDerivative::Impl::gains_(const T & kp, const U & kv)
202 {
203  checkGainSize(kp);
204  checkGainSize(kv);
205  kp_ = kp;
206  kv_ = kv;
207 }
208 } // namespace task_dynamics
209 
210 } // namespace tvm
#define TASK_DYNAMICS_DERIVED_FACTORY(...)
Definition: TaskDynamics.h:62
#define TVM_DLLAPI
Definition: api.h:35
Definition: ProportionalDerivative.h:30
void gains(const Eigen::MatrixXd &kp)
T & kp()
Definition: ProportionalDerivative.h:102
const Gain & kp() const
Definition: ProportionalDerivative.h:82
void gains(double kp, const Eigen::MatrixXd &kv)
T & kv()
Definition: ProportionalDerivative.h:126
std::pair< const Gain &, const Gain & > gains() const
Impl(FunctionPtr f, constraint::Type t, const Eigen::VectorXd &rhs, const Gain &kp, const Gain &kv)
Gain & kp()
Definition: ProportionalDerivative.h:94
void gains(const Eigen::VectorXd &kp)
const T & kp() const
Definition: ProportionalDerivative.h:88
void gains(const Eigen::MatrixXd &kp, const Eigen::VectorXd &kv)
const T & kv() const
Definition: ProportionalDerivative.h:112
void gains(double kp, const Eigen::VectorXd &kv)
void gains(const Eigen::VectorXd &kp, const Eigen::MatrixXd &kv)
void gains(const Eigen::VectorXd &kp, const Eigen::VectorXd &kv)
void gains(const Eigen::MatrixXd &kp, const Eigen::MatrixXd &kv)
void gains(const Eigen::MatrixXd &kp, double kv)
const Gain & kv() const
Definition: ProportionalDerivative.h:106
Gain & kv()
Definition: ProportionalDerivative.h:118
void gains(const Eigen::VectorXd &kp, double kv)
Definition: ProportionalDerivative.h:25
ProportionalDerivative(const Eigen::MatrixXd &kp, double kv)
ProportionalDerivative(double kp, double kv)
ProportionalDerivative(const Eigen::MatrixXd &kp, const Eigen::VectorXd &kv)
ProportionalDerivative(const Eigen::VectorXd &kp, const Eigen::MatrixXd &kv)
ProportionalDerivative(double kp, const Eigen::VectorXd &kv)
ProportionalDerivative(const Eigen::VectorXd &kp, const Eigen::VectorXd &kv)
ProportionalDerivative(const Eigen::VectorXd &kp)
mpark::variant< double, Eigen::VectorXd, Eigen::MatrixXd > Gain
Definition: ProportionalDerivative.h:27
std::unique_ptr< abstract::TaskDynamicsImpl > impl_(FunctionPtr f, constraint::Type t, const Eigen::VectorXd &rhs) const override
ProportionalDerivative(double kp, const Eigen::MatrixXd &kv)
ProportionalDerivative(const Eigen::MatrixXd &kp, const Eigen::MatrixXd &kv)
ProportionalDerivative(const Eigen::MatrixXd &kp)
ProportionalDerivative(const Eigen::VectorXd &kp, double kv)
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