#ifndef CHEETAH_SOFTWARE_CONVEXMPCLOCOMOTION_H #define CHEETAH_SOFTWARE_CONVEXMPCLOCOMOTION_H #include #include #include #include "cppTypes.h" #include "Gait.h" #include using Eigen::Array4f; using Eigen::Array4i; template struct CMPC_Result { LegControllerCommand commands[4]; Vec4 contactPhase; }; struct CMPC_Jump { static constexpr int START_SEG = 6; static constexpr int END_SEG = 0; static constexpr int END_COUNT = 2; bool jump_pending = false; bool jump_in_progress = false; bool pressed = false; int seen_end_count = 0; int last_seg_seen = 0; int jump_wait_counter = 0; void debug(int seg) { (void)seg; //printf("[%d] pending %d running %d\n", seg, jump_pending, jump_in_progress); } void trigger_pressed(int seg, bool trigger) { (void)seg; if(!pressed && trigger) { if(!jump_pending && !jump_in_progress) { jump_pending = true; //printf("jump pending @ %d\n", seg); } } pressed = trigger; } bool should_jump(int seg) { debug(seg); if(jump_pending && seg == START_SEG) { jump_pending = false; jump_in_progress = true; //printf("jump begin @ %d\n", seg); seen_end_count = 0; last_seg_seen = seg; return true; } if(jump_in_progress) { if(seg == END_SEG && seg != last_seg_seen) { seen_end_count++; if(seen_end_count == END_COUNT) { seen_end_count = 0; jump_in_progress = false; //printf("jump end @ %d\n", seg); last_seg_seen = seg; return false; } } last_seg_seen = seg; return true; } last_seg_seen = seg; return false; } }; class ConvexMPCLocomotion { public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW ConvexMPCLocomotion(float _dt, int _iterations_between_mpc, MIT_UserParameters* parameters); void initialize(); template void run(ControlFSMData& data); bool currently_jumping = false; 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 _SetupCommand(ControlFSMData & data); float _yaw_turn_rate; float _yaw_des; float _roll_des; float _pitch_des; float _x_vel_des = 0.; float _y_vel_des = 0.; // High speed running //float _body_height = 0.34; float _body_height = 0.29; float _body_height_running = 0.29; float _body_height_jumping = 0.36; void recompute_timing(int iterations_per_mpc); void updateMPCIfNeeded(int* mpcTable, ControlFSMData& data, bool omniMode); void solveDenseMPC(int *mpcTable, ControlFSMData &data); void solveSparseMPC(int *mpcTable, ControlFSMData &data); void initSparseMPC(); int iterationsBetweenMPC; int horizonLength; int default_iterations_between_mpc; float dt; float dtMPC; int iterationCounter = 0; Vec3 f_ff[4]; Vec4 swingTimes; FootSwingTrajectory footSwingTrajectories[4]; OffsetDurationGait trotting, bounding, pronking, jumping, galloping, standing, trotRunning, walking, walking2, pacing; MixedFrequncyGait random, random2; 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; float x_comp_integral = 0; Vec3 pFoot[4]; CMPC_Result result; float trajAll[12*36]; MIT_UserParameters* _parameters = nullptr; CMPC_Jump jump_state; vectorAligned> _sparseTrajectory; SparseCMPC _sparseCMPC; }; #endif //CHEETAH_SOFTWARE_CONVEXMPCLOCOMOTION_H