PreviewController.h
Go to the documentation of this file.
1 /* -*- coding:utf-8-unix mode:c++ -*- */
2 #ifndef PREVIEW_H_
3 #define PREVIEW_H_
4 #include <iostream>
5 #include <queue>
6 #include <deque>
7 #include <hrpUtil/Eigen3d.h>
8 #include "hrpsys/util/Hrpsys.h"
9 
10 namespace rats
11 {
12  static const double DEFAULT_GRAVITATIONAL_ACCELERATION = 9.80665; // [m/s^2]
13 
14  template <std::size_t dim>
16  {
17  Eigen::Matrix<double, dim, dim> A;
18  Eigen::Matrix<double, dim, 1> b;
19  Eigen::Matrix<double, 1, dim> c;
20  Eigen::Matrix<double, dim, dim> P;
21  Eigen::Matrix<double, 1, dim> K;
22  Eigen::Matrix<double, dim, dim> A_minus_bKt; /* for buffer */
23  double Q, R;
24  double R_btPb_inv; /* for buffer */
25 
26  riccati_equation() : A(Eigen::Matrix<double, dim, dim>::Zero()), b(Eigen::Matrix<double, dim, 1>::Zero()), c(Eigen::Matrix<double, 1, dim>::Zero()),
27  P(Eigen::Matrix<double, dim, dim>::Zero()), K(Eigen::Matrix<double, 1, dim>::Zero()),
28  A_minus_bKt(Eigen::Matrix<double, dim, dim>::Zero()), Q(0), R(0), R_btPb_inv(0) {};
29  riccati_equation(const Eigen::Matrix<double, dim, dim>& _A, const Eigen::Matrix<double, dim, 1>& _b,
30  const Eigen::Matrix<double, 1, dim>& _c, const double _Q, const double _R)
31  : A(_A), b(_b), c(_c), P(Eigen::Matrix<double, dim, dim>::Zero()), K(Eigen::Matrix<double, 1, dim>::Zero()), A_minus_bKt(Eigen::Matrix<double, dim, dim>::Zero()), Q(_Q), R(_R), R_btPb_inv(0) {};
32  virtual ~riccati_equation() {};
33  bool solve() {
34  Eigen::Matrix<double, dim, dim> prev_P;
35  for (int i = 0; i < 10000; i++) {
36  R_btPb_inv = (1.0 / (R + (b.transpose() * P * b)(0,0)));
37  Eigen::Matrix<double, dim, dim> tmp_pa(P * A);
38  K = R_btPb_inv * b.transpose() * tmp_pa;
39  prev_P = A.transpose() * tmp_pa + c.transpose() * Q * c - A.transpose() * P * b * K;
40  if ((abs((P - prev_P).array()) < 5.0e-10).all()) {
41  A_minus_bKt = (A - b * K).transpose();
42  return true;
43  }
44  P = prev_P;
45  }
46  return false;
47  }
48  };
49 
50  template <std::size_t dim>
52  {
53  protected:
55  Eigen::Matrix<double, 3, 3> tcA;
56  Eigen::Matrix<double, 3, 1> tcb;
57  Eigen::Matrix<double, 1, 3> tcc;
58  Eigen::Matrix<double, 3, 2> x_k;
59  Eigen::Matrix<double, 1, 2> u_k;
61  std::deque<Eigen::Matrix<double, 2, 1> > p;
62  std::deque<double> pz;
63  std::deque< std::vector<hrp::Vector3> > qdata;
64  double zmp_z, cog_z;
65  size_t delay, ending_count;
66  virtual void calc_f() = 0;
67  virtual void calc_u() = 0;
68  virtual void calc_x_k() = 0;
69  void init_riccati(const Eigen::Matrix<double, dim, dim>& A,
70  const Eigen::Matrix<double, dim, 1>& b,
71  const Eigen::Matrix<double, 1, dim>& c,
72  const double q = 1.0, const double r = 1.0e-6)
73  {
74  riccati = riccati_equation<dim>(A, b, c, q, r);
75  riccati.solve();
76  calc_f();
77  };
78  /* inhibit copy constructor and copy insertion not by implementing */
80  preview_control_base &operator=(const preview_control_base &_p);
81  public:
82  /* dt = [s], zc = [mm], d = [s] */
83  preview_control_base(const double dt, const double zc,
84  const hrp::Vector3& init_xk, const double _gravitational_acceleration, const double d = 1.6)
85  : riccati(), x_k(Eigen::Matrix<double, 3, 2>::Zero()), u_k(Eigen::Matrix<double, 1, 2>::Zero()), p(), pz(), qdata(),
86  zmp_z(0), cog_z(zc), delay(static_cast<size_t>(round(d / dt))), ending_count(1+delay)
87  {
88  tcA << 1, dt, 0.5 * dt * dt,
89  0, 1, dt,
90  0, 0, 1;
91  tcb << 1 / 6.0 * dt * dt * dt,
92  0.5 * dt * dt,
93  dt;
94  tcc << 1.0, 0.0, -zc / _gravitational_acceleration;
95  x_k(0,0) = init_xk(0);
96  x_k(0,1) = init_xk(1);
97  };
99  {
100  p.clear();
101  pz.clear();
102  qdata.clear();
103  };
104  virtual void update_x_k(const hrp::Vector3& pr, const std::vector<hrp::Vector3>& qdata);
105  virtual void update_x_k()
106  {
107  hrp::Vector3 pr;
108  pr(0) = p.back()(0);
109  pr(1) = p.back()(1);
110  pr(2) = pz.back();
111  update_x_k(pr, qdata.back());
112  ending_count--;
113  };
114  // void update_zc(double zc);
115  size_t get_delay () { return delay; };
116  double get_preview_f (const size_t idx) { return f(idx); };
117  void get_refcog (double* ret)
118  {
119  ret[0] = x_k(0,0);
120  ret[1] = x_k(0,1);
121  ret[2] = cog_z;
122  };
123  void get_refcog_vel (double* ret)
124  {
125  ret[0] = x_k(1,0);
126  ret[1] = x_k(1,1);
127  ret[2] = 0;
128  };
129  void get_refcog_acc (double* ret)
130  {
131  ret[0] = x_k(2,0);
132  ret[1] = x_k(2,1);
133  ret[2] = 0;
134  };
135  void get_cart_zmp (double* ret)
136  {
137  Eigen::Matrix<double, 1, 2> _p(tcc * x_k);
138  ret[0] = _p(0, 0);
139  ret[1] = _p(0, 1);
140  ret[2] = pz.front();
141  };
142  void get_current_refzmp (double* ret)
143  {
144  ret[0] = p.front()(0);
145  ret[1] = p.front()(1);
146  ret[2] = pz.front();
147  };
148  void get_current_qdata (std::vector<hrp::Vector3>& _qdata)
149  {
150  _qdata = qdata.front();
151  };
152  bool is_doing () { return p.size() >= 1 + delay; };
153  bool is_end () { return ending_count <= 0 ; };
154  void remove_preview_queue(const size_t remain_length)
155  {
156  size_t num = p.size() - remain_length;
157  for (size_t i = 0; i < num; i++) {
158  p.pop_back();
159  pz.pop_back();
160  qdata.pop_back();
161  }
162  };
163  void remove_preview_queue() // Remove all queue
164  {
165  p.clear();
166  pz.clear();
167  qdata.clear();
168  };
169  void set_preview_queue(const hrp::Vector3& pr, const std::vector<hrp::Vector3>& q, const size_t idx)
170  {
171  Eigen::Matrix<double, 2, 1> tmpv;
172  tmpv(0,0) = pr(0);
173  tmpv(1,0) = pr(1);
174  p[idx] = tmpv;
175  pz[idx] = pr(2);
176  qdata[idx] = q;
177  };
179  {
180  return p.size();
181  };
183  {
184  std::cerr << "(list ";
185  for (size_t i = 0; i < p.size(); i++) {
186  std::cerr << "#f(" << p[i](0) << " " << p[i](1) << ") ";
187  }
188  std::cerr << ")" << std::endl;
189  }
190  };
191 
193  {
194  private:
195  void calc_f();
196  void calc_u();
197  void calc_x_k();
198  public:
199  preview_control(const double dt, const double zc,
200  const hrp::Vector3& init_xk, const double _gravitational_acceleration = DEFAULT_GRAVITATIONAL_ACCELERATION, const double q = 1.0,
201  const double r = 1.0e-6, const double d = 1.6)
202  : preview_control_base<3>(dt, zc, init_xk, _gravitational_acceleration, d)
203  {
204  init_riccati(tcA, tcb, tcc, q, r);
205  };
206  virtual ~preview_control() {};
207  };
208 
210  {
211  private:
212  Eigen::Matrix<double, 4, 2> x_k_e;
213  void calc_f();
214  void calc_u();
215  void calc_x_k();
216  public:
217  extended_preview_control(const double dt, const double zc,
218  const hrp::Vector3& init_xk, const double _gravitational_acceleration = DEFAULT_GRAVITATIONAL_ACCELERATION, const double q = 1.0,
219  const double r = 1.0e-6, const double d = 1.6)
220  : preview_control_base<4>(dt, zc, init_xk, _gravitational_acceleration, d), x_k_e(Eigen::Matrix<double, 4, 2>::Zero())
221  {
222  Eigen::Matrix<double, 4, 4> A;
223  Eigen::Matrix<double, 4, 1> b;
224  Eigen::Matrix<double, 1, 4> c;
225  Eigen::Matrix<double, 1, 3> tmpca(tcc * tcA);
226  Eigen::Matrix<double, 1, 1> tmpcb(tcc * tcb);
227  A << 1.0, tmpca(0,0), tmpca(0,1), tmpca(0,2),
228  0.0, tcA(0,0), tcA(0,1), tcA(0,2),
229  0.0, tcA(1,0), tcA(1,1), tcA(1,2),
230  0.0, tcA(2,0), tcA(2,1), tcA(2,2);
231  b << tmpcb(0,0),
232  tcb(0,0),
233  tcb(1,0),
234  tcb(2,0);
235  c << 1,0,0,0;
236  x_k_e(0,0) = init_xk(0);
237  x_k_e(0,1) = init_xk(1);
238  init_riccati(A, b, c, q, r);
239  };
241  };
242 
243  template <class previw_T>
245  {
247  bool finishedp;
248  public:
250  preview_dynamics_filter(const double dt, const double zc, const hrp::Vector3& init_xk, const double _gravitational_acceleration = DEFAULT_GRAVITATIONAL_ACCELERATION, const double q = 1.0, const double r = 1.0e-6, const double d = 1.6)
251  : preview_controller(dt, zc, init_xk, _gravitational_acceleration, q, r, d), finishedp(false) {};
253  bool update(hrp::Vector3& p_ret, hrp::Vector3& x_ret, std::vector<hrp::Vector3>& qdata_ret, const hrp::Vector3& pr, const std::vector<hrp::Vector3>& qdata, const bool updatep)
254  {
255  bool flg;
256  if (updatep) {
257  preview_controller.update_x_k(pr, qdata);
258  flg = preview_controller.is_doing();
259  } else {
260  if ( !preview_controller.is_end() )
261  preview_controller.update_x_k();
262  flg = !preview_controller.is_end();
263  }
264 
265  if (flg) {
266  preview_controller.get_current_refzmp(p_ret.data());
267  preview_controller.get_refcog(x_ret.data());
268  preview_controller.get_current_qdata(qdata_ret);
269  }
270  return flg;
271  };
272  void remove_preview_queue(const size_t remain_length)
273  {
274  preview_controller.remove_preview_queue(remain_length);
275  };
277  {
278  preview_controller.remove_preview_queue();
279  };
280  void set_preview_queue(const hrp::Vector3& pr, const std::vector<hrp::Vector3>& qdata, const size_t idx)
281  {
282  preview_controller.set_preview_queue(pr, qdata, idx);
283  }
285  {
286  return preview_controller.get_preview_queue_size();
287  };
289  {
290  preview_controller.print_all_queue();
291  }
292 
293  void get_cart_zmp (double* ret) { preview_controller.get_cart_zmp(ret);}
294  void get_refcog_vel (double* ret) { preview_controller.get_refcog_vel(ret);}
295  void get_refcog_acc (double* ret) { preview_controller.get_refcog_acc(ret);}
296  void get_current_refzmp (double* ret) { preview_controller.get_current_refzmp(ret);}
297  //void get_current_qdata (double* ret) { preview_controller.get_current_qdata(ret);}
298  size_t get_delay () { return preview_controller.get_delay(); };
299  double get_preview_f (const size_t idx) { return preview_controller.get_preview_f(idx); };
300  };
301 }
302 #endif /*PREVIEW_H_*/
d
riccati_equation< dim > riccati
std::deque< std::vector< hrp::Vector3 > > qdata
double get_preview_f(const size_t idx)
Eigen::Matrix< double, 3, 1 > tcb
static const double DEFAULT_GRAVITATIONAL_ACCELERATION
Eigen::Matrix< double, 1, dim > c
std::deque< double > pz
extended_preview_control(const double dt, const double zc, const hrp::Vector3 &init_xk, const double _gravitational_acceleration=DEFAULT_GRAVITATIONAL_ACCELERATION, const double q=1.0, const double r=1.0e-6, const double d=1.6)
std::deque< Eigen::Matrix< double, 2, 1 > > p
void get_cart_zmp(double *ret)
Eigen::Matrix< double, dim, dim > A_minus_bKt
png_uint_32 i
void remove_preview_queue(const size_t remain_length)
Eigen::VectorXd dvector
Eigen::Matrix< double, dim, dim > A
Eigen::Vector3d Vector3
riccati_equation(const Eigen::Matrix< double, dim, dim > &_A, const Eigen::Matrix< double, dim, 1 > &_b, const Eigen::Matrix< double, 1, dim > &_c, const double _Q, const double _R)
void init_riccati(const Eigen::Matrix< double, dim, dim > &A, const Eigen::Matrix< double, dim, 1 > &b, const Eigen::Matrix< double, 1, dim > &c, const double q=1.0, const double r=1.0e-6)
void get_current_refzmp(double *ret)
void get_current_refzmp(double *ret)
void get_refcog_vel(double *ret)
Eigen::Matrix< double, dim, 1 > b
void remove_preview_queue(const size_t remain_length)
Eigen::Matrix< double, 1, 2 > u_k
void get_current_qdata(std::vector< hrp::Vector3 > &_qdata)
void set_preview_queue(const hrp::Vector3 &pr, const std::vector< hrp::Vector3 > &qdata, const size_t idx)
void set_preview_queue(const hrp::Vector3 &pr, const std::vector< hrp::Vector3 > &q, const size_t idx)
void get_refcog_acc(double *ret)
preview_control_base(const double dt, const double zc, const hrp::Vector3 &init_xk, const double _gravitational_acceleration, const double d=1.6)
Eigen::Matrix< double, 4, 2 > x_k_e
preview_dynamics_filter(const double dt, const double zc, const hrp::Vector3 &init_xk, const double _gravitational_acceleration=DEFAULT_GRAVITATIONAL_ACCELERATION, const double q=1.0, const double r=1.0e-6, const double d=1.6)
int num
double get_preview_f(const size_t idx)
Eigen::Matrix< double, 1, 3 > tcc
bool update(hrp::Vector3 &p_ret, hrp::Vector3 &x_ret, std::vector< hrp::Vector3 > &qdata_ret, const hrp::Vector3 &pr, const std::vector< hrp::Vector3 > &qdata, const bool updatep)
Eigen::Matrix< double, 3, 2 > x_k
Eigen::Matrix< double, 3, 3 > tcA
preview_control(const double dt, const double zc, const hrp::Vector3 &init_xk, const double _gravitational_acceleration=DEFAULT_GRAVITATIONAL_ACCELERATION, const double q=1.0, const double r=1.0e-6, const double d=1.6)
Eigen::Matrix< double, 1, dim > K
Eigen::Matrix< double, dim, dim > P


hrpsys
Author(s): AIST, Fumio Kanehiro
autogenerated on Thu May 6 2021 02:41:50