#ifndef CHEETAH_SOFTWARE_VISION_MPCLOCOMOTION_H #define CHEETAH_SOFTWARE_VISION_MPCLOCOMOTION_H #include #include #include "cppTypes.h" using Eigen::Array4f; using Eigen::Array4i; class VisionGait { public: VisionGait(int nMPC_segments, Vec4 offsets, Vec4 durations, const std::string& name=""); ~VisionGait(); Vec4 getContactState(); Vec4 getSwingState(); int* mpc_gait(); void setIterations(int iterationsPerMPC, int currentIteration); int _stance; int _swing; private: int _nMPC_segments; int* _mpc_table; Array4i _offsets; // offset in mpc segments Array4i _durations; // duration of step in mpc segments Array4f _offsetsFloat; // offsets in phase (0 to 1) Array4f _durationsFloat; // durations in phase (0 to 1) int _iteration; int _nIterations; float _phase; }; class VisionMPCLocomotion { public: VisionMPCLocomotion(float _dt, int _iterations_between_mpc, MIT_UserParameters* parameters); void initialize(); template void run(ControlFSMData& data, const Vec3 & vel_cmd, const DMat & height_map, const DMat & idx_map); Vec3 pBody_des; Vec3 vBody_des; Vec3 aBody_des; Vec3 pBody_RPY_des; Vec3 vBody_Ori_des; Vec3 pFoot_des[4]; Vec3 vFoot_des[4]; Vec3 aFoot_des[4]; Vec3 Fr_des[4]; Vec4 contact_state; private: void _UpdateFoothold(Vec3 & foot, const Vec3 & body_pos, const DMat & height_map, const DMat & idx_map); void _IdxMapChecking(int x_idx, int y_idx, int & x_idx_selected, int & y_idx_selected, const DMat & idx_map); Vec3 _fin_foot_loc[4]; float grid_size = 0.015; Vec3 v_des_world; Vec3 rpy_des; Vec3 v_rpy_des; float _body_height = 0.31; void updateMPCIfNeeded(int* mpcTable, ControlFSMData& data); void solveDenseMPC(int *mpcTable, ControlFSMData &data); int iterationsBetweenMPC; int horizonLength; float dt; float dtMPC; int iterationCounter = 0; Vec3 f_ff[4]; Vec4 swingTimes; FootSwingTrajectory footSwingTrajectories[4]; VisionGait trotting, bounding, pronking, galloping, standing, trotRunning; Mat3 Kp, Kd, Kp_stance, Kd_stance; bool firstRun = true; bool firstSwing[4]; float swingTimeRemaining[4]; float stand_traj[6]; int current_gait; int gaitNumber; Vec3 world_position_desired; Vec3 rpy_int; Vec3 rpy_comp; Vec3 pFoot[4]; float trajAll[12*36]; MIT_UserParameters* _parameters = nullptr; }; #endif //CHEETAH_SOFTWARE_VISION_MPCLOCOMOTION_H