ocra-wbi-plugins
Doxygen documentation for the ocra-wbi-plugins repository
ocra-wbi-plugins/ocra-icub-clients/walking-client/include/walking-client/ZmpPreviewController.h
Go to the documentation of this file.
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 //     std::vector<Eigen::Vector2d> Pr;
00093 //     std::vector<Eigen::Vector2d> Hr;
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 //     AOptimal = Hp.transpose()*Nb*Hp + Nu + Hh.transpose()*Nw*Hh;
00158 //     bOptimal = Hp.transpose()*Nb*(zmpRef - Gp*hk) + Hh.transpose()*Nw*(comVelRef - Gh*hk);
00159 //     optimalU = AOptimal.colPivHouseholderQr().solve(bOptimal);
00160 
00161 //         double start = yarp::os::Time::now();
00162         //TODO: Remember that the bOptimal I have to use is actually the next line, not Weiber's because it doesn't take into account com velocity references.
00163 //         bOptimal = Hp.transpose()*Nb*(zmpRef - Gp*hk) + Hh.transpose()*Nw*(comVelRef - Gh*hk);
00164 //         OCRA_INFO("Time to compute bOptimal is: " << yarp::os::Time::now() - start);
00165         bOptimal = Hp.transpose() * (zmpRef - Gp * hk);
00166 //         start = yarp::os::Time::now();
00167 //         optimalU = AOptimal.colPivHouseholderQr().solve(Hp.transpose() * (bOptimal));
00168         // Using Cholesky decomposition
00169         optimalU = (AOptimal).llt().solve(bOptimal);
00170 //         OCRA_INFO("Time to compute optimalU using Cholesky decomposition : " << yarp::os::Time::now() - start);
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines