ImpedanceGains.h
Go to the documentation of this file.
1 /*
2  * Copyright 2015-2021 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>
10 
11 namespace mc_tasks
12 {
13 
14 namespace force
15 {
16 
17 namespace details
18 {
19 
21 template<bool StrictlyPositive>
23 {
24  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
25 
26  ImpedanceVecd() : ImpedanceVecd(limit, limit) {}
27 
28  ImpedanceVecd(const sva::ImpedanceVecd & v) { vec(v); }
29 
30  ImpedanceVecd(double angular_, double linear_)
31  {
32  angular(angular_);
33  linear(linear_);
34  }
35 
36  ImpedanceVecd & operator=(const sva::ImpedanceVecd & v)
37  {
38  vec(v);
39  return *this;
40  }
41 
42  inline Eigen::Vector6d vector() const noexcept { return vec_.vector(); }
43 
44  inline void vec(const sva::ImpedanceVecd & v) noexcept
45  {
46  angular(v.angular());
47  linear(v.linear());
48  }
49 
50  inline void vec(const Eigen::Vector6d & v) noexcept
51  {
52  angular(v.head<3>());
53  linear(v.tail<3>());
54  }
55 
56  inline void vec(const Eigen::Vector3d & a, const Eigen::Vector3d & l) noexcept
57  {
58  angular(a);
59  linear(l);
60  }
61 
62  inline void vec(double a, double l) noexcept
63  {
64  angular(a);
65  linear(l);
66  }
67 
68  inline const sva::ImpedanceVecd & vec() const noexcept { return vec_; }
69 
70  inline void angular(const Eigen::Vector3d & v) noexcept { vec_.angular() = v.cwiseMax(limit); }
71 
72  inline void angular(double angular) noexcept { vec_.angular().setConstant(std::max(angular, limit)); }
73 
74  inline const Eigen::Vector3d & angular() const noexcept { return vec_.angular(); }
75 
76  inline void linear(const Eigen::Vector3d & v) noexcept { vec_.linear() = v.cwiseMax(limit); }
77 
78  inline void linear(double linear) noexcept { vec_.linear().setConstant(std::max(linear, limit)); }
79 
80  inline const Eigen::Vector3d & linear() const noexcept { return vec_.linear(); }
81 
82 private:
83  static constexpr double limit = StrictlyPositive ? 1e-6 : 0.0;
84  sva::ImpedanceVecd vec_;
85 };
86 
87 // Repeat static constexpr declarations
88 // See also https://stackoverflow.com/q/8016780
89 template<bool b>
90 constexpr double ImpedanceVecd<b>::limit;
91 
92 } // namespace details
93 
96 {
97  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
98 
100  inline const details::ImpedanceVecd<true> & M() const noexcept { return M_; }
102  inline details::ImpedanceVecd<true> & M() noexcept { return M_; }
104  inline const details::ImpedanceVecd<true> & mass() const noexcept { return M_; }
106  inline details::ImpedanceVecd<true> & mass() noexcept { return M_; }
107 
109  inline const details::ImpedanceVecd<false> & D() const noexcept { return D_; }
111  inline details::ImpedanceVecd<false> & D() noexcept { return D_; }
113  inline const details::ImpedanceVecd<false> & damper() const noexcept { return D_; }
115  inline details::ImpedanceVecd<false> & damper() noexcept { return D_; }
116 
118  inline const details::ImpedanceVecd<false> & K() const noexcept { return K_; }
120  inline details::ImpedanceVecd<false> & K() noexcept { return K_; }
122  inline const details::ImpedanceVecd<false> & spring() const noexcept { return K_; }
124  inline details::ImpedanceVecd<false> & spring() noexcept { return K_; }
125 
127  inline const details::ImpedanceVecd<false> & wrench() const noexcept { return wrench_; }
129  inline details::ImpedanceVecd<false> & wrench() noexcept { return wrench_; }
130 
132  inline static ImpedanceGains Default()
133  {
134  ImpedanceGains out;
135  out.mass().vec(10.0, 10.0);
136  out.damper().vec(1000.0, 1000.0);
137  out.spring().vec(1000.0, 1000.0);
138  out.wrench().vec(0.0, 0.0);
139  return out;
140  }
141 
142 protected:
151 };
152 
153 } // namespace force
154 
155 } // namespace mc_tasks
156 
157 namespace mc_rtc
158 {
159 
160 template<>
161 struct MC_TASKS_DLLAPI ConfigurationLoader<mc_tasks::force::ImpedanceGains>
162 {
164  {
166  if(config.has("mass"))
167  {
168  sva::ImpedanceVecd M = config("mass");
169  out.M().vec(M);
170  }
171  if(config.has("damper"))
172  {
173  sva::ImpedanceVecd D = config("damper");
174  out.D().vec(D);
175  }
176  if(config.has("spring"))
177  {
178  sva::ImpedanceVecd K = config("spring");
179  out.K().vec(K);
180  }
181  if(config.has("wrench"))
182  {
183  sva::ImpedanceVecd wrench = config("wrench");
184  out.wrench().vec(wrench);
185  }
186  return out;
187  }
189  {
191  out.add("mass", ig.M().vec());
192  out.add("damper", ig.D().vec());
193  out.add("spring", ig.K().vec());
194  out.add("wrench", ig.wrench().vec());
195  return out;
196  }
197 };
198 
199 } // namespace mc_rtc
mc_tasks::force::details::ImpedanceVecd::angular
void angular(const Eigen::Vector3d &v) noexcept
Definition: ImpedanceGains.h:70
mc_tasks::force::ImpedanceGains::wrench
details::ImpedanceVecd< false > & wrench() noexcept
Definition: ImpedanceGains.h:129
mc_rtc::Configuration
Simplify access to values hold within a JSON file.
Definition: Configuration.h:165
mc_tasks::force::details::ImpedanceVecd::ImpedanceVecd
ImpedanceVecd(const sva::ImpedanceVecd &v)
Definition: ImpedanceGains.h:28
mc_tasks::force::details::ImpedanceVecd::vec
const sva::ImpedanceVecd & vec() const noexcept
Definition: ImpedanceGains.h:68
mc_rtc::ConfigurationLoader< mc_tasks::force::ImpedanceGains >::save
static mc_rtc::Configuration save(const mc_tasks::force::ImpedanceGains &ig)
Definition: ImpedanceGains.h:188
api.h
mc_tasks::force::ImpedanceGains::Default
static ImpedanceGains Default()
Definition: ImpedanceGains.h:132
mc_tasks::force::ImpedanceGains::mass
details::ImpedanceVecd< true > & mass() noexcept
Definition: ImpedanceGains.h:106
mc_tasks::force::ImpedanceGains::K_
details::ImpedanceVecd< false > K_
Definition: ImpedanceGains.h:148
MC_TASKS_DLLAPI
#define MC_TASKS_DLLAPI
Definition: api.h:50
mc_tasks::force::ImpedanceGains::mass
const details::ImpedanceVecd< true > & mass() const noexcept
Definition: ImpedanceGains.h:104
mc_tasks::force::ImpedanceGains::M
const EIGEN_MAKE_ALIGNED_OPERATOR_NEW details::ImpedanceVecd< true > & M() const noexcept
Definition: ImpedanceGains.h:100
mc_tasks::force::ImpedanceGains::damper
details::ImpedanceVecd< false > & damper() noexcept
Definition: ImpedanceGains.h:115
mc_tasks::force::details::ImpedanceVecd
Definition: ImpedanceGains.h:22
mc_tasks::force::details::ImpedanceVecd::angular
const Eigen::Vector3d & angular() const noexcept
Definition: ImpedanceGains.h:74
mc_tasks::force::ImpedanceGains
Represent impedance gains for an ImpedanceTask.
Definition: ImpedanceGains.h:95
mc_tasks::force::ImpedanceGains::wrench
const details::ImpedanceVecd< false > & wrench() const noexcept
Definition: ImpedanceGains.h:127
mc_tasks::force::ImpedanceGains::spring
details::ImpedanceVecd< false > & spring() noexcept
Definition: ImpedanceGains.h:124
mc_tasks::force::details::ImpedanceVecd::angular
void angular(double angular) noexcept
Definition: ImpedanceGains.h:72
mc_tasks::force::ImpedanceGains::wrench_
details::ImpedanceVecd< false > wrench_
Definition: ImpedanceGains.h:150
mc_tasks::force::details::ImpedanceVecd::vec
void vec(const sva::ImpedanceVecd &v) noexcept
Definition: ImpedanceGains.h:44
mc_tasks::force::ImpedanceGains::spring
const details::ImpedanceVecd< false > & spring() const noexcept
Definition: ImpedanceGains.h:122
mc_tasks::force::ImpedanceGains::K
const details::ImpedanceVecd< false > & K() const noexcept
Definition: ImpedanceGains.h:118
mc_tasks::force::details::ImpedanceVecd::ImpedanceVecd
ImpedanceVecd(double angular_, double linear_)
Definition: ImpedanceGains.h:30
mc_rtc::Configuration::has
bool has(const std::string &key) const
Check if the key is part of the conf.
mc_tasks::force::details::ImpedanceVecd::ImpedanceVecd
EIGEN_MAKE_ALIGNED_OPERATOR_NEW ImpedanceVecd()
Definition: ImpedanceGains.h:26
mc_tasks::force::ImpedanceGains::D
const details::ImpedanceVecd< false > & D() const noexcept
Definition: ImpedanceGains.h:109
mc_tasks::force::details::ImpedanceVecd::vec
void vec(const Eigen::Vector3d &a, const Eigen::Vector3d &l) noexcept
Definition: ImpedanceGains.h:56
mc_rtc::ConfigurationLoader< mc_tasks::force::ImpedanceGains >::load
static mc_tasks::force::ImpedanceGains load(const mc_rtc::Configuration &config)
Definition: ImpedanceGains.h:163
mc_tasks::force::ImpedanceGains::M
details::ImpedanceVecd< true > & M() noexcept
Definition: ImpedanceGains.h:102
mc_tasks::force::details::ImpedanceVecd::linear
void linear(double linear) noexcept
Definition: ImpedanceGains.h:78
mc_rtc::Configuration::add
void add(const std::string &key, bool value)
Add a bool element to the Configuration.
mc_tasks::force::ImpedanceGains::M_
details::ImpedanceVecd< true > M_
Definition: ImpedanceGains.h:144
Configuration.h
mc_tasks::force::details::ImpedanceVecd::operator=
ImpedanceVecd & operator=(const sva::ImpedanceVecd &v)
Definition: ImpedanceGains.h:36
mc_tasks::force::ImpedanceGains::K
details::ImpedanceVecd< false > & K() noexcept
Definition: ImpedanceGains.h:120
mc_tasks::force::ImpedanceGains::damper
const details::ImpedanceVecd< false > & damper() const noexcept
Definition: ImpedanceGains.h:113
mc_tasks::force::details::ImpedanceVecd::vec
void vec(double a, double l) noexcept
Definition: ImpedanceGains.h:62
mc_tasks::force::details::ImpedanceVecd::linear
const Eigen::Vector3d & linear() const noexcept
Definition: ImpedanceGains.h:80
mc_tasks::force::details::ImpedanceVecd::vec
void vec(const Eigen::Vector6d &v) noexcept
Definition: ImpedanceGains.h:50
mc_tasks::force::ImpedanceGains::D
details::ImpedanceVecd< false > & D() noexcept
Definition: ImpedanceGains.h:111
mc_rtc::ConfigurationLoader
Definition: Configuration.h:55
mc_tasks::force::ImpedanceGains::D_
details::ImpedanceVecd< false > D_
Definition: ImpedanceGains.h:146
mc_tasks
Definition: StabilizerStandingState.h:11
mc_tasks::force::details::ImpedanceVecd::linear
void linear(const Eigen::Vector3d &v) noexcept
Definition: ImpedanceGains.h:76
mc_tasks::force::details::ImpedanceVecd::vector
Eigen::Vector6d vector() const noexcept
Definition: ImpedanceGains.h:42
mc_rtc
Definition: Contact.h:87