zmp-tracking-gain-estimator.hpp
Go to the documentation of this file.
1 
12 #ifndef ZMPTRACKINGGAINESTIMATOR_HPP
13 #define ZMPTRACKINGGAINESTIMATOR_HPP
14 
15 #include <state-observation/api.h>
19 
20 namespace stateObservation
21 {
22 
26 
27 class STATE_OBSERVATION_DLLAPI ZmpTrackingGainEstimator
28 {
29 private:
30  constexpr static double defaultDt_ = 0.005;
31  constexpr static double defaultGain_ = 1;
32 
33 public:
35  constexpr static double defaultGainDriftSecond = 0.002;
36 
38  constexpr static double defaultZmpProcessErrorStd = 0.005;
39 
41  constexpr static double defaultZmpMeasurementErrorStd = 0.005;
42 
45  constexpr static double defaultGainMinimum = .01;
46 
48  constexpr static double defaultZmpUncertainty = 0.005;
49 
51  constexpr static double defaultGainUncertainty = 20;
52 
69  ZmpTrackingGainEstimator(double dt = defaultDt_,
70  const Vector2 & zmpMeasureErrorStd = Vector2::Constant(defaultZmpMeasurementErrorStd),
71  const Vector3 & gainDriftPerSecond = Vector3::Constant(defaultGainDriftSecond),
72  const Vector2 & zmpProcessErrorStd = Vector2::Constant(defaultZmpProcessErrorStd),
73  double minimumGain = defaultGainMinimum,
74  const Vector2 & initZMP = Vector2::Zero(),
75  const Vector3 & initGain = Vector3::Zero(),
76  const Vector2 & initZMPUncertainty = Vector2::Constant(defaultZmpUncertainty),
77  const Vector3 & initGainUncertainty = Vector3::Constant(defaultGainUncertainty));
78 
88  void resetWithMeasurements(const Vector2 & initZMP = Vector2::Zero(),
89  const Vector3 & initGain = Vector3::Zero(),
90  const Matrix2 & yaw = Matrix2::Identity(),
91  const Vector2 & initZMPUncertainty = Vector2::Constant(defaultZmpUncertainty),
92  const Vector3 & initGainUncertainty = Vector3::Constant(defaultGainUncertainty));
93 
103  inline void resetWithMeasurements(const Vector2 & initZMP,
104  const Vector3 & initGain,
105  double yaw,
106  const Vector2 & initZMPUncertainty = Vector2::Constant(defaultZmpUncertainty),
107  const Vector3 & initGainUncertainty = Vector3::Constant(defaultGainUncertainty))
108  {
109  resetWithMeasurements(initZMP, initGain, Rotation2D(yaw).toRotationMatrix(), initZMPUncertainty,
110  initGainUncertainty);
111  }
112 
124  inline void resetWithMeasurements(const Vector2 & initZMP,
125  const Vector3 & initGain,
126  const Matrix3 & rotation,
127  const Vector2 & initZMPUncertainty = Vector2::Constant(defaultZmpUncertainty),
128  const Vector3 & initGainUncertainty = Vector3::Constant(defaultGainUncertainty))
129  {
130  resetWithMeasurements(initZMP, initGain, kine::rotationMatrixToYawAxisAgnostic(rotation), initZMPUncertainty,
131  initGainUncertainty);
132  }
133 
136 
140  void setSamplingTime(double dt);
141 
146  void setGain(const Vector3 & gain);
147 
151  void setGain(const Vector3 & gain, const Vector3 & uncertainty);
152 
157  void setGainDriftPerSecond(const Vector3 &);
158 
162  void setMinimumGain(const double & minGain);
163 
167  void setZMPProcesError(const Vector2 &);
168 
171  void setZmpMeasureErrorStd(const Vector2 &);
172 
182  inline void setInputs(const Vector2 & zmpErr, const Vector2 & zmp, const Matrix3 & orientation)
183  {
184  setInputs(zmpErr, zmp, kine::rotationMatrixToYawAxisAgnostic(orientation));
185  }
186 
193  inline void setInputs(const Vector2 & zmpErr, const Vector2 & zmp, double yaw)
194  {
195  setInputs(zmpErr, zmp, Rotation2D(yaw).toRotationMatrix());
196  }
197 
203  void setInputs(const Vector2 & zmpErr, const Vector2 & zmp, const Matrix2 & R = Matrix2::Identity());
204 
208  void update();
209 
214  inline Matrix2 getEstimatedGain() const
215  {
217  return (previousOrientation_ * getEstimatedLocalGain().triangularView<Eigen::Upper>()
218  * previousOrientation_.transpose())
219  .selfadjointView<Eigen::Upper>();
220  }
221 
225  Matrix2 getEstimatedLocalGain() const;
226 
231  {
232  return filter_;
233  }
234 
237  inline const LinearKalmanFilter & getFilter() const
238  {
239  return filter_;
240  }
241 
242 protected:
243  typedef Eigen::Matrix<double, 2, 5> Matrix25;
244  typedef Eigen::Matrix<double, 2, 3> Matrix23;
245 
246  double dt_;
247 
248  double minimumGain_;
249 
253 
255 
260 
263 
266 
268 
270  inline static Matrix2 Vec2ToSqDiag_(const Vector2 & v)
271  {
272  return Vector2(v.array().square()).asDiagonal();
273  }
274 
276  inline static Matrix3 Vec3ToSqDiag_(const Vector3 & v)
277  {
278  return Vector3(v.array().square()).asDiagonal();
279  }
280 
281  inline void updateR_()
282  {
283  R_ = Vec2ToSqDiag_(zmpMeasureErrorstd_);
284  filter_.setMeasurementCovariance(R_);
285  }
286 
287  inline void updateQ_()
288  {
289  Q_.topLeftCorner<2, 2>() = Vec2ToSqDiag_(zmpProcessErrorStd_);
290  Q_.bottomRightCorner<3, 3>() = Vec3ToSqDiag_(gainDriftPerSecondStd_);
291  filter_.setProcessCovariance(Q_);
292  }
293 
294 public:
295  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
296 };
297 
298 } // namespace stateObservation
299 
300 #endif
stateObservation::ZmpTrackingGainEstimator::Q_
Matrix5 Q_
process noise
Definition: zmp-tracking-gain-estimator.hpp:265
stateObservation::ZmpTrackingGainEstimator::Vec3ToSqDiag_
static Matrix3 Vec3ToSqDiag_(const Vector3 &v)
builds a diagonal out of the square valued of the Vec3
Definition: zmp-tracking-gain-estimator.hpp:276
stateObservation::ZmpTrackingGainEstimator::resetWithMeasurements
void resetWithMeasurements(const Vector2 &initZMP, const Vector3 &initGain, const Matrix3 &rotation, const Vector2 &initZMPUncertainty=Vector2::Constant(defaultZmpUncertainty), const Vector3 &initGainUncertainty=Vector3::Constant(defaultGainUncertainty))
Resets the estimator with first measurements.
Definition: zmp-tracking-gain-estimator.hpp:124
stateObservation::KalmanFilterBase::setProcessCovariance
void setProcessCovariance(const Qmatrix &Q)
Definition: kalman-filter-base.hpp:136
stateObservation::ZmpTrackingGainEstimator::getFilter
const LinearKalmanFilter & getFilter() const
Get the Kalman Filter object This can be used to run specific Advanced Kalman filter related funcions...
Definition: zmp-tracking-gain-estimator.hpp:237
stateObservation::Matrix4
Eigen::Matrix4d Matrix4
4x4 Scalar Matrix
Definition: definitions.hpp:115
stateObservation::ZmpTrackingGainEstimator::setInputs
void setInputs(const Vector2 &zmpErr, const Vector2 &zmp, double yaw)
Set the Inputs of the estimator.
Definition: zmp-tracking-gain-estimator.hpp:193
stateObservation::ZmpTrackingGainEstimator::A_
Matrix4 A_
Definition: zmp-tracking-gain-estimator.hpp:257
stateObservation::ZmpTrackingGainEstimator::updateQ_
void updateQ_()
Definition: zmp-tracking-gain-estimator.hpp:287
stateObservation::ZmpTrackingGainEstimator::gainDriftPerSecondStd_
Vector3 gainDriftPerSecondStd_
Definition: zmp-tracking-gain-estimator.hpp:251
stateObservation::Vector2
Eigen::Matrix< double, 2, 1 > Vector2
2d Vector
Definition: definitions.hpp:82
stateObservation::Matrix5
Eigen::Matrix< double, 5, 5 > Matrix5
5x5 Scalar Matrix
Definition: definitions.hpp:118
stateObservation::ZmpTrackingGainEstimator::minimumGain_
double minimumGain_
Definition: zmp-tracking-gain-estimator.hpp:248
stateObservation::ZmpTrackingGainEstimator::Matrix25
Eigen::Matrix< double, 2, 5 > Matrix25
Definition: zmp-tracking-gain-estimator.hpp:243
stateObservation::ZmpTrackingGainEstimator::Matrix23
Eigen::Matrix< double, 2, 3 > Matrix23
Definition: zmp-tracking-gain-estimator.hpp:244
stateObservation::ZmpTrackingGainEstimator::getFilter
LinearKalmanFilter & getFilter()
Get the Kalman Filter object This can be used to run specific Advanced Kalman filter related funcions...
Definition: zmp-tracking-gain-estimator.hpp:230
stateObservation::ZmpTrackingGainEstimator
Definition: zmp-tracking-gain-estimator.hpp:27
stateObservation::LinearKalmanFilter
The class of a Linear Kalman filter.
Definition: linear-kalman-filter.hpp:47
stateObservation::ZmpTrackingGainEstimator::R_
Matrix2 R_
measurement noise
Definition: zmp-tracking-gain-estimator.hpp:262
stateObservation::KalmanFilterBase::setMeasurementCovariance
void setMeasurementCovariance(const Rmatrix &R)
Definition: kalman-filter-base.hpp:119
stateObservation::kine::rotationMatrixToYawAxisAgnostic
double rotationMatrixToYawAxisAgnostic(const Matrix3 &rotation)
take 3x3 matrix represeting a rotation and gives a corresponding angle around upward vertical axis
rigid-body-kinematics.hpp
Implements integrators for the kinematics, in terms or rotations and translations.
stateObservation::Matrix2
Eigen::Matrix2d Matrix2
2D scalar Matrix
Definition: definitions.hpp:106
linear-kalman-filter.hpp
Defines the class of a Linear Kalman filter.
stateObservation::Matrix3
Eigen::Matrix3d Matrix3
3x3 Scalar Matrix
Definition: definitions.hpp:109
stateObservation::ZmpTrackingGainEstimator::~ZmpTrackingGainEstimator
~ZmpTrackingGainEstimator()
Destroy the Lipm Dcm Bias Estimator object.
Definition: zmp-tracking-gain-estimator.hpp:135
stateObservation::ZmpTrackingGainEstimator::dt_
double dt_
Definition: zmp-tracking-gain-estimator.hpp:246
stateObservation::ZmpTrackingGainEstimator::filter_
LinearKalmanFilter filter_
Definition: zmp-tracking-gain-estimator.hpp:256
stateObservation::ZmpTrackingGainEstimator::Vec2ToSqDiag_
static Matrix2 Vec2ToSqDiag_(const Vector2 &v)
builds a diagonal out of the square valued of the Vec2
Definition: zmp-tracking-gain-estimator.hpp:270
stateObservation::ZmpTrackingGainEstimator::zmpMeasureErrorstd_
Vector2 zmpMeasureErrorstd_
Definition: zmp-tracking-gain-estimator.hpp:250
miscellaneous-algorithms.hpp
Gathers many kinds of algorithms.
stateObservation::ZmpTrackingGainEstimator::zmpProcessErrorStd_
Vector2 zmpProcessErrorStd_
Definition: zmp-tracking-gain-estimator.hpp:252
stateObservation::Vector3
Eigen::Vector3d Vector3
3D vector
Definition: definitions.hpp:85
stateObservation::ZmpTrackingGainEstimator::resetWithMeasurements
void resetWithMeasurements(const Vector2 &initZMP, const Vector3 &initGain, double yaw, const Vector2 &initZMPUncertainty=Vector2::Constant(defaultZmpUncertainty), const Vector3 &initGainUncertainty=Vector3::Constant(defaultGainUncertainty))
Resets the estimator.
Definition: zmp-tracking-gain-estimator.hpp:103
stateObservation::ZmpTrackingGainEstimator::getEstimatedGain
Matrix2 getEstimatedGain() const
Get the Unbiased DCM filtered by the estimator.
Definition: zmp-tracking-gain-estimator.hpp:214
stateObservation::Rotation2D
Eigen::Rotation2D< double > Rotation2D
2D rotations
Definition: definitions.hpp:136
stateObservation
Definition: bidim-elastic-inv-pendulum-dyn-sys.hpp:20
stateObservation::ZmpTrackingGainEstimator::C_
Matrix25 C_
The B matrix is zero.
Definition: zmp-tracking-gain-estimator.hpp:259
stateObservation::ZmpTrackingGainEstimator::yaw_
Matrix2 yaw_
Definition: zmp-tracking-gain-estimator.hpp:254
stateObservation::ZmpTrackingGainEstimator::updateR_
void updateR_()
Definition: zmp-tracking-gain-estimator.hpp:281
stateObservation::ZmpTrackingGainEstimator::previousOrientation_
Matrix2 previousOrientation_
Definition: zmp-tracking-gain-estimator.hpp:267
stateObservation::ZmpTrackingGainEstimator::setInputs
void setInputs(const Vector2 &zmpErr, const Vector2 &zmp, const Matrix3 &orientation)
Set the Inputs of the estimator.
Definition: zmp-tracking-gain-estimator.hpp:182