Go to the documentation of this file.00001
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
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"
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
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
00350
00351
00352
00353 ocra::Model::Ptr _robotModel;
00354
00355
00356
00357
00358
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
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