ocra-wbi-plugins
Doxygen documentation for the ocra-wbi-plugins repository
ocra-wbi-plugins/ocra-icub-clients/walking-client/include/walking-client/MIQPController.h
Go to the documentation of this file.
00001 
00008 /*
00009  *  This file is part of ocra-recipes.
00010  *  Copyright (C) 2016 Institut des Systèmes Intelligents et de Robotique (ISIR)
00011  *
00012  *  This program is free software: you can redistribute it and/or modify
00013  *  it under the terms of the GNU General Public License as published by
00014  *  the Free Software Foundation, either version 3 of the License, or
00015  *  (at your option) any later version.
00016  *
00017  *  This program is distributed in the hope that it will be useful,
00018  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00019  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020  *  GNU General Public License for more details.
00021  *
00022  *  You should have received a copy of the GNU General Public License
00023  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
00024  */
00025 
00026 #ifndef _MIQP_CONTROLLER_H_
00027 #define _MIQP_CONTROLLER_H_
00028 
00029 #include "gurobi_c++.h"
00030 #include <walking-client/utils.h>
00031 #include <ocra-icub/OcraWbiModel.h>
00032 #include <ocra/util/FileOperations.h>
00033 #include <yarp/os/RateThread.h>
00034 #include <yarp/os/Semaphore.h>
00035 #include <Eigen/Dense>
00036 #include <Eigen/Lgsm>
00037 #include "unsupported/Eigen/MatrixFunctions"
00038 #include <walking-client/constraints/MIQPLinearConstraints.h>
00039 #include <walking-client/MIQPState.h>
00040 #include "Gurobi.h" // eigen-gurobi
00041 
00042 namespace MIQP{
00043     enum InputVectorIndex{
00044         A_X_IN=0,
00045         A_Y_IN,
00046         B_X_IN,
00047         B_Y_IN,
00048         ALPHA_X_IN,
00049         ALPHA_Y_IN,
00050         BETA_X_IN,
00051         BETA_Y_IN,
00052         DELTA_IN,
00053         GAMMA_IN,
00054         U_X_IN,
00055         U_Y_IN
00056     };
00057 }
00058 
00059 class MIQPController : public yarp::os::RateThread {
00060 public:
00070     MIQPController(MIQPParameters params, ocra::Model::Ptr robotModel, std::shared_ptr<StepController> stepController, const Eigen::MatrixXd &comStateRef);
00071 
00075     virtual ~MIQPController();
00076 
00085     virtual bool threadInit();
00086 
00090     virtual void threadRelease();
00091 
00104     virtual void run();
00105 
00111     void setCOMStateRefInPreviewWindow(unsigned int k, Eigen::VectorXd &comStateRef);
00112         
00116     yarp::os::Semaphore semaphore;
00117     
00118     void getSolution(Eigen::VectorXd &X_kn);
00119 
00120 protected:
00121     // MARK: - PROTECTED METHODS
00128     void setLinearPartObjectiveFunction();
00129 
00135     void setLowerAndUpperBounds();
00136 
00142     void updateStateVector();
00143 
00151     void buildAh(int dt, Eigen::MatrixXd &output);
00152 
00160     void buildBh(int dt, Eigen::MatrixXd &output);
00161 
00168     void buildQ(Eigen::MatrixXd &output);
00169 
00176     void buildT(Eigen::MatrixXd &output);
00177 
00184     void buildC_H(Eigen::MatrixXd &output);
00185 
00192     void buildC_P(Eigen::MatrixXd &output);
00193 
00200     void buildC_B(Eigen::MatrixXd &output);
00201 
00208     void buildH_N(Eigen::MatrixXd &output);
00209     
00210     
00218     void buildNb(Eigen::MatrixXd &output, double wb);
00219     
00226     void buildNx(Eigen::MatrixXd &output);
00227 
00232     void buildGenericRegMat(MIQP::InputVectorIndex whichVariable, double weight, Eigen::MatrixXd &output);
00233     
00241     void buildSw(Eigen::MatrixXd &output, MIQPParameters miqpParams);
00242 
00243     
00258     void buildPreviewStateMatrix(const Eigen::MatrixXd &C, Eigen::MatrixXd &P);
00259 
00260     
00276     void buildPreviewInputMatrix(const Eigen::MatrixXd &C, Eigen::MatrixXd &R);
00277     
00313     void buildEqualityConstraintsMatrices(const Eigen::VectorXd &x_k, Eigen::MatrixXd& Aeq, Eigen::VectorXd& Beq);
00314 
00322     void updateEqualityConstraints(const Eigen::VectorXd &x_k, Eigen::VectorXd &Beq);
00323     
00329     void buildRegularizationTerms(MIQPParameters &miqpParams);
00330     
00331     void buildCoMJerkReg(MIQPParameters &miqpParams);
00332     
00333     void buildAvoidOneFootRestReg(MIQPParameters &miqpParams);
00334     
00335     void buildMinimizeSteppingReg(MIQPParameters &miqpParams);
00336     
00337     void setBinaryVariables();
00338     
00346     void writeToFile(const double& time, const Eigen::VectorXd& X_kn, std::string& home);
00347     
00348 private:
00349     // MARK: - PRIVATE VARIABLES
00350     /*
00351      * Pointer to robot model which will be used by MIQPController::updateStateVector() to update the state vector by retrieving robot information set up by the hosting client (`walking-client`) and coordinated by the controller server.
00352      */
00353     ocra::Model::Ptr _robotModel;
00354     
00355     /*
00356      * Pointer to step controller started by the walking-client
00357      * 
00358      * @todo This is really NOT desireable at all. Find another way to get this object down to MIQPLinearConstraints.
00359      */
00360     std::shared_ptr<StepController> _stepController;
00361 
00365     MIQPParameters _miqpParams;
00366 
00372     Eigen::MatrixXd _comStateRef;
00373 
00375     int _period;
00376     
00378     bool _addRegularization;
00379 
00396     Eigen::VectorXd _linearTermTransObjFunc;
00397 
00402     Eigen::VectorXd _lb;
00403 
00408     Eigen::VectorXd _ub;
00409 
00410     // TODO: Document
00411     std::string _variablesNames[INPUT_VECTOR_SIZE];
00412 
00427     Eigen::VectorXd _xi_k;
00428 
00431     Eigen::VectorXd _X_kn;
00432 
00451     Eigen::MatrixXd _Ah;
00452 
00472     Eigen::MatrixXd _Bh;
00473 
00490     Eigen::MatrixXd _Q;
00491 
00510     Eigen::MatrixXd _T;
00511 
00531     Eigen::MatrixXd _C_H;
00532 
00552     Eigen::MatrixXd _C_P;
00553 
00574     Eigen::MatrixXd _C_B;
00575 
00596     Eigen::MatrixXd _P_H;
00597 
00618     Eigen::MatrixXd _P_P;
00619 
00641     Eigen::MatrixXd _P_B;
00642 
00663     Eigen::MatrixXd _R_H;
00664 
00687     Eigen::MatrixXd _R_P;
00688 
00712     Eigen::MatrixXd _R_B;
00713 
00720     Eigen::MatrixXd _Sw;
00721 
00725     Eigen::MatrixXd _Nb;
00726     
00731     Eigen::MatrixXd _Nx;
00732 
00747     Eigen::MatrixXd _H_N;
00748 
00749 
00757     Eigen::MatrixXd _Aineq;
00758 
00766     Eigen::VectorXd _Bineq;
00767         
00776     Eigen::MatrixXd _Aeq;
00777     
00786     Eigen::VectorXd _Beq;
00787     
00794     Eigen::MatrixXd _Ci_eq;
00795     
00799     Eigen::VectorXd _fcbar_eq;
00800     
00806     Eigen::MatrixXd _rhs_2_eq;
00807 
00809     Eigen::GurobiDense _eigGurobi;
00810 
00812     std::shared_ptr<MIQPLinearConstraints> _constraints;
00813     
00815     std::shared_ptr<MIQP::MIQPState> _state;
00816 
00818     Eigen::VectorXd _H_N_r;
00819 
00821     unsigned int _k;   
00822     
00824     Eigen::MatrixXd _S_wu;
00825     Eigen::MatrixXd _S_gamma;
00826     Eigen::MatrixXd _P_Gamma;
00827     Eigen::MatrixXd _R_Gamma;
00828     Eigen::VectorXd _One_Gamma;
00829     Eigen::MatrixXd _S_alpha;
00830     Eigen::MatrixXd _S_beta;
00831     Eigen::MatrixXd _P_Alpha;
00832     Eigen::MatrixXd _R_Alpha;
00833     Eigen::MatrixXd _P_Beta;
00834     Eigen::MatrixXd _R_Beta;
00835 };
00836 
00837 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines