00001
00057 #ifndef _ZMPPREVIEWCONTROLLER_
00058 #define _ZMPPREVIEWCONTROLLER_
00059
00060 #include <ocra-icub/Utilities.h>
00061 #include <ocra/util/ErrorsHelper.h>
00062 #include <Eigen/Dense>
00063 #include <vector>
00064 #include "walking-client/utils.h"
00065
00066
00067 struct ZmpPreviewParams {
00071 int Nc;
00075 int Np;
00079 double cz;
00083 double nu;
00087 double nw;
00091 double nb;
00092
00093
00094
00098 ZmpPreviewParams(int Np,
00099 int Nc,
00100 double cz,
00101 double nu,
00102 double nw,
00103 double nb):
00104 Np(Np),
00105 Nc(Nc),
00106 cz(cz),
00107 nu(nu),
00108 nw(nw),
00109 nb(nb){}
00110
00111 };
00112
00113 class ZmpPreviewController
00114 {
00115 public:
00121 ZmpPreviewController(const double period, std::shared_ptr<ZmpPreviewParams> parameters);
00122
00123 virtual ~ZmpPreviewController();
00124
00125
00132 bool initialize();
00133
00152 template <typename Derived>
00153 void computeOptimalInput(const Eigen::MatrixBase<Derived>& zmpRef,
00154 const Eigen::MatrixBase<Derived>& comVelRef,
00155 const Eigen::MatrixBase<Derived>& hk,
00156 Eigen::MatrixBase<Derived>& optimalU) {
00157
00158
00159
00160
00161
00162
00163
00164
00165 bOptimal = Hp.transpose() * (zmpRef - Gp * hk);
00166
00167
00168
00169 optimalU = (AOptimal).llt().solve(bOptimal);
00170
00171 }
00172
00185 void integrateCom(Eigen::VectorXd comJerk, Eigen::VectorXd hk, Eigen::VectorXd &hkk);
00186
00187
00201 void tableCartModel(Eigen::Vector2d hk, Eigen::VectorXd ddhk, Eigen::Vector2d& p);
00202
00219 void tableCartModel(Eigen::VectorXd hkk, Eigen::Vector2d& p);
00220
00228 Eigen::MatrixXd buildAh(const double dt);
00229
00237 Eigen::MatrixXd buildBh(const double dt);
00238
00248 Eigen::MatrixXd buildCp(const double cz, const double g);
00249
00260 Eigen::MatrixXd buildGp(Eigen::MatrixXd Cp, Eigen::MatrixXd Ah, const int Np);
00261
00274 Eigen::MatrixXd buildHp(Eigen::MatrixXd Cp, Eigen::MatrixXd Bh, Eigen::MatrixXd Ah, const int Nc, const int Np);
00275
00282 Eigen::MatrixXd buildCh();
00283
00294 Eigen::MatrixXd buildGh(Eigen::MatrixXd Ch, Eigen::MatrixXd Ah, const int Np);
00295
00309 Eigen::MatrixXd buildHh(Eigen::MatrixXd Ch, Eigen::MatrixXd Bh, Eigen::MatrixXd Ah, const int Nc, const int Np);
00310
00320 Eigen::MatrixXd buildNu(const double nu, const int Nc);
00321
00331 Eigen::MatrixXd buildNw(const double nw, const int Np);
00332
00342 Eigen::MatrixXd buildNb(const double nb, const int Np);
00343
00371 bool computeFootZMP(FOOT whichFoot,
00372 Eigen::VectorXd wrench,
00373 Eigen::Vector2d &footZMP,
00374 Eigen::VectorXd &wrenchInWorldRef,
00375 ocra::Model::Ptr model,
00376 const double tolerance=1e-3);
00377
00378
00405 bool computeGlobalZMPFromSensors(Eigen::VectorXd rawLeftFootWrench,
00406 Eigen::VectorXd rawRightFootWrench,
00407 ocra::Model::Ptr model,
00408 Eigen::Vector2d &globalZMP);
00409
00418 void getFTSensorAdjointMatrix(FOOT whichFoot, Eigen::MatrixXd &T, Eigen::Vector3d &sensorPosition, ocra::Model::Ptr model);
00419
00420
00421 private:
00425 const double cz;
00429 const double g = 9.8;
00433 const double dt;
00437 const int Nc;
00441 const int Np;
00445 const double nu;
00449 const double nw;
00453 const double nb;
00457 const Eigen::MatrixXd Nu;
00461 const Eigen::MatrixXd Nw;
00465 const Eigen::MatrixXd Nb;
00476 const Eigen::MatrixXd Ah;
00487 const Eigen::MatrixXd Bh;
00496 const Eigen::MatrixXd Cp;
00507 const Eigen::MatrixXd Gp;
00519 const Eigen::MatrixXd Hp;
00528 const Eigen::MatrixXd Ch;
00539 const Eigen::MatrixXd Gh;
00551 const Eigen::MatrixXd Hh;
00552
00556 Eigen::MatrixXd AOptimal;
00557
00561 Eigen::MatrixXd bOptimal;
00562
00563
00564
00565 };
00566
00567 #endif