flexibility_compensation.hpp
Go to the documentation of this file.
1 #ifndef _FLEXIBILITY_COMPENSATION_
2 #define _FLEXIBILITY_COMPENSATION_
3 
4 #include <Eigen/Dense>
5 #include <deque>
6 
7 #include "sobec/fwd.hpp"
8 
9 namespace sobec {
10 typedef Eigen::Array2d eArray2;
11 typedef Eigen::Matrix3d eMatrixRot;
12 typedef Eigen::VectorXd eVectorX;
13 typedef Eigen::Matrix2d eMatrix2;
14 
15 // enum side { LEFT, RIGHT };
16 
18 struct FlexSettings {
19  public:
20  eVector2 left_stiffness = eVector2(15000, 15000); // (y, x) [Nm/rad]
21  eVector2 left_damping = 2 * left_stiffness.cwiseSqrt(); // (y, x) [Nm/rad]
22  eVector2 right_stiffness = eVector2(15000, 15000); // (y, x) [Nm/rad]
23  eVector2 right_damping = 2 * right_stiffness.cwiseSqrt(); // (y, x) [Nm/rad]
24  Eigen::Array3i left_hip_indices = Eigen::Array3i::Zero();
25  Eigen::Array3i right_hip_indices = Eigen::Array3i::Zero();
26 
27  double dt = 0.002, MA_duration = 0.01; // [s]
28 
29  friend std::ostream &operator<<(std::ostream &out, const FlexSettings &obj) {
30  out << "FlexSettings:\n";
31  out << " left_stiffness: " << obj.left_stiffness << "\n";
32  out << " left_damping: " << obj.left_damping << "\n";
33  out << " right_stiffness: " << obj.right_stiffness << "\n";
34  out << " left_damping: " << obj.right_damping << "\n";
35  out << " left_hip_indices: " << obj.left_hip_indices << "\n";
36  out << " right_hip_indices: " << obj.right_hip_indices << "\n";
37  out << " MA_duration: " << obj.MA_duration << "\n";
38  out << " dt: " << obj.dt << "\n" << std::endl;
39  return out;
40  }
41 
42  friend bool operator==(const FlexSettings &lhs, const FlexSettings &rhs) {
43  bool test = true;
44  test &= lhs.left_stiffness == rhs.left_stiffness;
45  test &= lhs.left_damping == rhs.left_damping;
46  test &= lhs.right_stiffness == rhs.right_stiffness;
47  test &= lhs.right_damping == rhs.right_damping;
48  test &= lhs.dt == rhs.dt;
49  test &= lhs.left_hip_indices.matrix() == rhs.left_hip_indices.matrix();
50  test &= lhs.right_hip_indices.matrix() == rhs.right_hip_indices.matrix();
51  test &= lhs.MA_duration == rhs.MA_duration;
52  return test;
53  }
54 };
55 
56 class Flex {
57  private:
58  FlexSettings settings_;
59  unsigned long MA_samples_;
60  const eMatrix2 xy_to_yx = (eMatrix2() << 0, 1, 1, 0).finished();
61 
62  // memory pre-allocations:
63  std::deque<eArray2> queue_LH_, queue_RH_;
64  eVector3 resulting_angles_;
65  eVector2 computed_deflection_;
66  eArray2 temp_damping_, temp_actuation_, temp_full_torque_, temp_stiff_;
67  eArray2 temp_equiv_stiff_, temp_compliance_;
68  eArray2 summation_LH_, summation_RH_, average_;
69  unsigned long queueSize_;
70 
71  // equivalentAngles:
72  double qz_;
73 
74  // correctDeflections:
75  eVector2 leftFlex0_ = eVector2::Zero();
76  eVector2 rightFlex0_ = eVector2::Zero();
77  eVector2 leftFlex_, rightFlex_;
78  eVector2 leftFlexRate_, rightFlexRate_;
79 
80  // correctEstimatedDeflections:
81  eMatrix2 adaptLeftYawl_, adaptRightYawl_;
82 
83  // correctHip:
84  eMatrixRot rotationA_;
85  eMatrixRot rotationB_;
86  eMatrixRot rotationC_;
87  eMatrixRot rotationD_;
88  eMatrixRot rotationE_;
89  eVector3 flexRateY_, flexRateX_;
90  eVector3 dqZ_, dqX_, dqY_;
91  eVector3 legAngularVelocity_;
92  eMatrixRot rigidRotC_, rigidRotD_, M_;
93 
94  const eVector3 &equivalentAngles(const eMatrixRot &fullRotation);
95  void correctHip(const eVector2 &delta, const eVector2 &deltaDot, eVectorX &q,
96  eVectorX &dq, const Eigen::Array3i &hipIndices);
97 
98  // const eArray2 &movingAverage(const eArray2 &x, std::deque<eArray2> &queue);
99 
100  const eArray2 &movingAverage(const eArray2 &x, std::deque<eArray2> &queue,
101  eArray2 &summation);
102 
103  public:
104  Flex();
105 
106  Flex(const FlexSettings &settings);
107 
108  void initialize(const FlexSettings &settings);
109 
110  const eVector2 &computeDeflection(const eArray2 &torques,
111  const eArray2 &delta0,
112  const eArray2 &stiffness,
113  const eArray2 &damping, const double dt);
114 
115  void correctDeflections(const eVector2 &leftFlexingTorque,
116  const eVector2 &rightFlexingTorque, eVectorX &q,
117  eVectorX &dq);
118 
119  void correctEstimatedDeflections(const eVectorX &desiredTorque, eVectorX &q,
120  eVectorX &dq);
121 
122  const FlexSettings &getSettings() { return settings_; }
123 
124  void resetLeftFlex0() { leftFlex0_ = eVector2::Zero(); } // is it used?
125  void resetRightFlex0() { rightFlex0_ = eVector2::Zero(); } // is it used?
126 
127  void setLeftFlex0(const eVector2 &delta0) {
128  leftFlex0_ = delta0;
129  } // is it used?
130  void setRightFlex0(const eVector2 &delta0) {
131  rightFlex0_ = delta0;
132  } // is it used?
133 };
134 } // namespace sobec
135 
136 #endif
sobec::FlexSettings::left_hip_indices
Eigen::Array3i left_hip_indices
Definition: flexibility_compensation.hpp:24
sobec::Flex::initialize
void initialize(const FlexSettings &settings)
Definition: flexibility_compensation.cpp:11
sobec::FlexSettings::left_damping
eVector2 left_damping
Definition: flexibility_compensation.hpp:21
sobec::Flex::resetLeftFlex0
void resetLeftFlex0()
Definition: flexibility_compensation.hpp:124
sobec::Flex::correctDeflections
void correctDeflections(const eVector2 &leftFlexingTorque, const eVector2 &rightFlexingTorque, eVectorX &q, eVectorX &dq)
Definition: flexibility_compensation.cpp:81
sobec::eVector2
Eigen::Vector2d eVector2
Definition: fwd.hpp:144
sobec::FlexSettings::dt
double dt
Definition: flexibility_compensation.hpp:27
sobec::Flex::computeDeflection
const eVector2 & computeDeflection(const eArray2 &torques, const eArray2 &delta0, const eArray2 &stiffness, const eArray2 &damping, const double dt)
Definition: flexibility_compensation.cpp:16
sobec::Flex::correctEstimatedDeflections
void correctEstimatedDeflections(const eVectorX &desiredTorque, eVectorX &q, eVectorX &dq)
Definition: flexibility_compensation.cpp:118
fwd.hpp
sobec::eVectorX
Eigen::VectorXd eVectorX
Definition: flexibility_compensation.hpp:12
sobec::Flex::setRightFlex0
void setRightFlex0(const eVector2 &delta0)
Definition: flexibility_compensation.hpp:130
sobec::FlexSettings::operator==
friend bool operator==(const FlexSettings &lhs, const FlexSettings &rhs)
Definition: flexibility_compensation.hpp:42
sobec::Flex::getSettings
const FlexSettings & getSettings()
Definition: flexibility_compensation.hpp:122
sobec::FlexSettings::operator<<
friend std::ostream & operator<<(std::ostream &out, const FlexSettings &obj)
Definition: flexibility_compensation.hpp:29
sobec::FlexSettings::left_stiffness
eVector2 left_stiffness
Definition: flexibility_compensation.hpp:20
sobec
Definition: activation-quad-ref.hpp:19
sobec::FlexSettings
Definition: flexibility_compensation.hpp:18
sobec::FlexSettings::MA_duration
double MA_duration
Definition: flexibility_compensation.hpp:27
sobec::Flex::Flex
Flex()
Definition: flexibility_compensation.cpp:5
sobec::Flex::resetRightFlex0
void resetRightFlex0()
Definition: flexibility_compensation.hpp:125
sobec::newcontacts::x
@ x
Definition: contact1d.hpp:26
sobec::eArray2
Eigen::Array2d eArray2
Definition: flexibility_compensation.hpp:10
sobec::eMatrixRot
Eigen::Matrix3d eMatrixRot
Definition: flexibility_compensation.hpp:11
sobec::Flex
Definition: flexibility_compensation.hpp:56
sobec::FlexSettings::right_stiffness
eVector2 right_stiffness
Definition: flexibility_compensation.hpp:22
sobec::FlexSettings::right_damping
eVector2 right_damping
Definition: flexibility_compensation.hpp:23
sobec::Flex::setLeftFlex0
void setLeftFlex0(const eVector2 &delta0)
Definition: flexibility_compensation.hpp:127
sobec::eMatrix2
Eigen::Matrix2d eMatrix2
Definition: flexibility_compensation.hpp:13
sobec::eVector3
Eigen::Vector3d eVector3
Definition: fwd.hpp:143
sobec::FlexSettings::right_hip_indices
Eigen::Array3i right_hip_indices
Definition: flexibility_compensation.hpp:25