From b76f775016cbb32be525b3e2946b8343d253797b Mon Sep 17 00:00:00 2001 From: Masaki Murooka Date: Thu, 28 Dec 2023 16:22:50 +0900 Subject: [PATCH 1/2] Add StepMpc. --- include/CCC/StepMpc.h | 239 ++++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 1 + src/StepMpc.cpp | 247 ++++++++++++++++++++++++++++++++++++ tests/CMakeLists.txt | 1 + tests/src/FootstepManager.h | 69 ++++++++++ tests/src/TestStepMpc.cpp | 143 +++++++++++++++++++++ 6 files changed, 700 insertions(+) create mode 100644 include/CCC/StepMpc.h create mode 100644 src/StepMpc.cpp create mode 100644 tests/src/TestStepMpc.cpp diff --git a/include/CCC/StepMpc.h b/include/CCC/StepMpc.h new file mode 100644 index 0000000..a302a8c --- /dev/null +++ b/include/CCC/StepMpc.h @@ -0,0 +1,239 @@ +/* Author: Masaki Murooka */ + +#pragma once + +#include + +namespace CCC +{ +/** \brief Linear MPC based on one-dimensional discrete dynamics on step switching. + + See the following for a detailed formulation. + - S Xin, et al. Online relative footstep optimization for legged robots dynamic walking using discrete-time model + predictive control. IROS, 2019. + */ +class StepMpc1d +{ + friend class StepMpc; + +public: + /** \brief Type of state-space model with fixed state dimension. */ + using _StateSpaceModel = StateSpaceModel<2, Eigen::Dynamic, Eigen::Dynamic>; + + /** \brief Discrete dynamics on step switching. */ + class StepModel : public _StateSpaceModel + { + public: + /** \brief Constructor. + \param com_height height of robot CoM [m] + \param step_duration step duration [sec] + */ + StepModel(double com_height, double step_duration); + }; + + /** \brief Reference data. */ + struct RefData + { + /** \brief Element of reference data. */ + struct Element + { + //! Whether it is in single support phase + bool is_single_support = true; + + //! ZMP [m] + double zmp = 0; + + //! End time [sec] + double end_time = 0; + }; + + /** \brief List of reference element. + + The number of elements must be at least one. + Consecutive double support phases are not allowed. (In contrast, consecutive single support phases are allowed.) + */ + std::vector element_list; + }; + + /** \brief Planned data. */ + struct PlannedData + { + //! Current ZMP [m] + double current_zmp = 0; + + /** \brief ZMP of next foot [m] + + null if the single support phase of the next foot is not included in the horizon + */ + std::optional next_foot_zmp; + }; + + /** \brief Initial parameter. + + First element is CoM position, and second element is CoM velocity. + */ + using InitialParam = Eigen::Vector2d; + + /** \brief Weight parameter. */ + struct WeightParam + { + //! Weight of free ZMP (for future contacts) + double free_zmp; + + //! Weight of fixed ZMP (for existing contacts) + double fixed_zmp; + + //! Weight of ZMP in double support phase + double double_support; + + //! Weight of CoM position + double pos; + + //! Weight of CoM velocity + double vel; + + //! Weight of absolute position of capture point + double capture_point_abs; + + //! Weight of relative position of capture point and ZMP + double capture_point_rel; + + /** \brief Constructor. + \param _free_zmp weight of free ZMP (for future contacts) + \param _fixed_zmp weight of fixed ZMP (for existing contacts) + \param _double_support weight of ZMP in double support phase + \param _pos weight of CoM position + \param _vel weight of CoM velocity + \param _capture_point_abs weight of absolute position of capture point + \param _capture_point_rel weight of relative position of capture point and ZMP + */ + WeightParam(double _free_zmp = 1e-2, + double _fixed_zmp = 1e0, + double _double_support = 1e0, + double _pos = 0.0, + double _vel = 0.0, + double _capture_point_abs = 1e1, + double _capture_point_rel = 1e1) + : free_zmp(_free_zmp), fixed_zmp(_fixed_zmp), double_support(_double_support), pos(_pos), vel(_vel), + capture_point_abs(_capture_point_abs), capture_point_rel(_capture_point_rel) + { + } + }; + +public: + /** \brief Constructor. + \param com_height height of robot CoM [m] + \param weight_param objective weight parameter + */ + StepMpc1d(double com_height, const WeightParam & weight_param = WeightParam()) + : com_height_(com_height), weight_param_(weight_param) + { + } + + /** \brief Plan one step. + \param ref_data reference data + \param initial_param initial parameter + \param current_time current time (i.e., start time of horizon) [sec] + \returns planned ZMP + */ + PlannedData planOnce(const RefData & ref_data, const InitialParam & initial_param, double current_time); + +protected: + //! Height of robot CoM [m] + double com_height_ = 0; + + //! Weight parameter + WeightParam weight_param_; + + //! Sequential extension of state-space model + std::shared_ptr> seq_ext_; +}; + +/** \brief Linear MPC based on discrete dynamics on step switching. + + See the following for a detailed formulation. + - S Xin, et al. Online relative footstep optimization for legged robots dynamic walking using discrete-time model + predictive control. IROS, 2019. + + \todo It is assumed that the left and right feet alternate in stepping (i.e., the same foot does not step in + succession). + */ +class StepMpc +{ +public: + /** \brief Reference data. */ + struct RefData + { + /** \brief Element of reference data. */ + struct Element + { + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + + //! Whether it is in single support phase + bool is_single_support = true; + + //! ZMP [m] + Eigen::Vector2d zmp = Eigen::Vector2d::Zero(); + + //! End time [sec] + double end_time = 0; + }; + + /** \brief List of reference element. + + The number of elements must be at least one. + Consecutive double support phases are not allowed. (In contrast, consecutive single support phases are allowed.) + */ + std::vector element_list; + }; + + /** \brief Planned data. */ + struct PlannedData + { + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + + //! Current ZMP [m] + Eigen::Vector2d current_zmp = Eigen::Vector2d::Zero(); + + /** \brief ZMP of next foot [m] + + null if the single support phase of the next foot is not included in the horizon + */ + std::optional next_foot_zmp; + }; + + /** \brief Initial parameter. */ + struct InitialParam + { + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + + //! CoM position [m] + Eigen::Vector2d pos = Eigen::Vector2d::Zero(); + + //! CoM velocity [m/s] + Eigen::Vector2d vel = Eigen::Vector2d::Zero(); + }; + +public: + /** \brief Constructor. + \param com_height height of robot CoM [m] + \param weight_param objective weight parameter + */ + StepMpc(double com_height, const StepMpc1d::WeightParam & weight_param = StepMpc1d::WeightParam()) + : mpc_1d_(std::make_shared(com_height, weight_param)) + { + } + + /** \brief Plan one step. + \param ref_data reference data + \param initial_param initial parameter + \param current_time current time (i.e., start time of horizon) [sec] + \returns planned ZMP + */ + PlannedData planOnce(const RefData & ref_data, const InitialParam & initial_param, double current_time); + +protected: + //! One-dimensional linear MPC + std::shared_ptr mpc_1d_; +}; +} // namespace CCC diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5b695b8..14d885f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -7,6 +7,7 @@ add_library(CCC LinearMpcZmp.cpp IntrinsicallyStableMpc.cpp SingularPreviewControlZmp.cpp + StepMpc.cpp LinearMpcZ.cpp LinearMpcXY.cpp PreviewControlCentroidal.cpp diff --git a/src/StepMpc.cpp b/src/StepMpc.cpp new file mode 100644 index 0000000..957b368 --- /dev/null +++ b/src/StepMpc.cpp @@ -0,0 +1,247 @@ +/* Author: Masaki Murooka */ + +#include +#include + +using namespace CCC; + +StepMpc1d::StepModel::StepModel(double com_height, double step_duration) : _StateSpaceModel(2, 1, 3) +{ + double omega = std::sqrt(constants::g / com_height); + double exp_omega = std::exp(omega * step_duration); + double exp_omega_inv = 1.0 / exp_omega; + Ad_.resize(2, 2); + Ad_ << 0.5 * (exp_omega + exp_omega_inv), 0.5 * (exp_omega - exp_omega_inv) / omega, + 0.5 * omega * (exp_omega - exp_omega_inv), 0.5 * (exp_omega + exp_omega_inv); + Bd_.resize(2, 1); + Bd_ << 1.0 - 0.5 * (exp_omega + exp_omega_inv), 0.5 * omega * (exp_omega_inv - exp_omega); + Ed_.setZero(2); + + C_.resize(3, 2); + C_ << 1.0, 0.0, 0.0, 1.0, 1.0, 1.0 / omega; + D_.setZero(3, 1); + F_.setZero(3); +} + +StepMpc1d::PlannedData StepMpc1d::planOnce(const RefData & ref_data, + const InitialParam & initial_param, + double current_time) +{ + size_t num_var = ref_data.element_list.size(); + Eigen::MatrixXd eq_mat = Eigen::MatrixXd::Zero(num_var, num_var); + Eigen::MatrixXd eq_vec = Eigen::VectorXd::Zero(num_var); + + // Setup sequential extension + std::vector> model_list; + for(size_t i = 0; i < ref_data.element_list.size(); i++) + { + double step_duration; + if(i == 0) + { + step_duration = ref_data.element_list[i].end_time - current_time; + } + else + { + step_duration = ref_data.element_list[i].end_time - ref_data.element_list[i - 1].end_time; + } + model_list.push_back(std::make_shared(com_height_, step_duration)); + } + seq_ext_ = std::make_shared>(model_list, true); + + // Set coefficients for ZMP + Eigen::VectorXd ref_zmp_vec(num_var); + for(size_t i = 0; i < num_var; i++) + { + ref_zmp_vec[i] = ref_data.element_list[i].zmp; + } + Eigen::VectorXd eq_mat_diag_zmp = Eigen::VectorXd::Constant(num_var, weight_param_.free_zmp); + eq_mat_diag_zmp[0] = weight_param_.fixed_zmp; + if(num_var > 1 && !ref_data.element_list[0].is_single_support) + { + eq_mat_diag_zmp[1] = weight_param_.fixed_zmp; + } + eq_mat.diagonal() += eq_mat_diag_zmp; + eq_vec += -1 * eq_mat_diag_zmp.cwiseProduct(ref_zmp_vec); + + // Set coefficients for double support + Eigen::Matrix3d eq_mat_double_support; + eq_mat_double_support << 1.0, -2.0, 1.0, -2.0, 4.0, -2.0, 1.0, -2.0, 1.0; + eq_mat_double_support *= weight_param_.double_support; + for(size_t i = 0; i < num_var; i++) + { + if(i != 0 && i != num_var - 1) + { + if(ref_data.element_list[i - 1].is_single_support && !ref_data.element_list[i].is_single_support + && ref_data.element_list[i + 1].is_single_support) + { + eq_mat.block<3, 3>(i - 1, i - 1) += eq_mat_double_support; + } + } + } + + // Set coefficients for CoM position + if(weight_param_.pos > 0.0) + { + Eigen::VectorXd ref_pos_vec(num_var); + Eigen::MatrixXd select_mat_pos = Eigen::MatrixXd::Zero(num_var, 3 * num_var); + for(size_t i = 0; i < num_var; i++) + { + ref_pos_vec[i] = ref_data.element_list[std::min(i + 1, num_var - 1)].zmp; + select_mat_pos(i, 3 * i) = 1.0; + } + Eigen::MatrixXd eq_mat_pos_sub = weight_param_.pos * seq_ext_->B_seq_.transpose() * select_mat_pos.transpose(); + eq_mat += eq_mat_pos_sub * select_mat_pos * seq_ext_->B_seq_; + eq_vec += eq_mat_pos_sub * (select_mat_pos * seq_ext_->A_seq_ * initial_param - ref_pos_vec); + } + + // Set coefficients for CoM velocity + if(weight_param_.vel > 0.0) + { + Eigen::MatrixXd select_mat_vel = Eigen::MatrixXd::Zero(num_var, 3 * num_var); + for(size_t i = 0; i < num_var; i++) + { + select_mat_vel(i, 3 * i + 1) = 1.0; + } + Eigen::MatrixXd eq_mat_vel_sub = + weight_param_.vel * seq_ext_->B_seq_.transpose() * select_mat_vel.transpose() * select_mat_vel; + eq_mat += eq_mat_vel_sub * seq_ext_->B_seq_; + eq_vec += eq_mat_vel_sub * seq_ext_->A_seq_ * initial_param; + } + + // Set coefficients for absolute position of capture point + if(weight_param_.capture_point_abs > 0.0) + { + size_t num_future_single_support = 0; + for(size_t i = 0; i < num_var; i++) + { + if(i >= 1 && ref_data.element_list[i].is_single_support) + { + num_future_single_support++; + } + } + Eigen::VectorXd ref_cp_vec(num_var); + Eigen::MatrixXd select_mat_cp = Eigen::MatrixXd::Zero(num_var, 3 * num_var); + if(num_future_single_support == 0) + { + for(size_t i = 0; i < num_var; i++) + { + if(i >= 1 || !ref_data.element_list[i].is_single_support) + { + ref_cp_vec[i] = ref_data.element_list[i].zmp; + select_mat_cp(i, 3 * i + 2) = 1.0; + } + } + } + else + { + for(size_t i = 0; i < num_var; i++) + { + if(i >= 1 && ref_data.element_list[i].is_single_support) + { + ref_cp_vec[i] = ref_data.element_list[i].zmp; + select_mat_cp(i, 3 * (i - 1) + 2) = 1.0; + } + } + } + Eigen::MatrixXd eq_mat_cp_sub = + weight_param_.capture_point_abs * seq_ext_->B_seq_.transpose() * select_mat_cp.transpose(); + eq_mat += eq_mat_cp_sub * select_mat_cp * seq_ext_->B_seq_; + eq_vec += eq_mat_cp_sub * (select_mat_cp * seq_ext_->A_seq_ * initial_param - ref_cp_vec); + } + + // Set coefficients for relative position of capture point and ZMP + if(weight_param_.capture_point_rel > 0.0) + { + size_t num_future_single_support = 0; + for(size_t i = 0; i < num_var; i++) + { + if(i >= 1 && ref_data.element_list[i].is_single_support) + { + num_future_single_support++; + } + } + if(num_future_single_support >= 1) + { + Eigen::MatrixXd select_mat_cp = Eigen::MatrixXd::Zero(num_var, 3 * num_var); + Eigen::MatrixXd select_mat_zmp = Eigen::MatrixXd::Zero(num_var, num_var); + for(size_t i = 0; i < num_var; i++) + { + if(i >= 1 && ref_data.element_list[i].is_single_support) + { + select_mat_cp(i, 3 * (i - 1) + 2) = 1.0; + select_mat_zmp(i, i) = 1.0; + } + } + Eigen::MatrixXd eq_mat_cp_sub = + weight_param_.capture_point_rel * (select_mat_cp * seq_ext_->B_seq_ - select_mat_zmp).transpose(); + eq_mat += eq_mat_cp_sub * (select_mat_cp * seq_ext_->B_seq_ - select_mat_zmp); + eq_vec += eq_mat_cp_sub * select_mat_cp * seq_ext_->A_seq_ * initial_param; + } + } + + // Solve equation + Eigen::VectorXd eq_sol = eq_mat.colPivHouseholderQr().solve(-1 * eq_vec); + + // Set planned data + PlannedData planned_data; + planned_data.current_zmp = eq_sol[0]; + if(num_var > 1) + { + for(size_t i = 1; i < num_var; i++) + { + if(ref_data.element_list[i].is_single_support) + { + planned_data.next_foot_zmp = eq_sol[i]; + break; + } + } + } + return planned_data; +} + +StepMpc::PlannedData StepMpc::planOnce(const RefData & ref_data, + const InitialParam & initial_param, + double current_time) +{ + PlannedData planned_data; + StepMpc1d::RefData ref_data_1d; + StepMpc1d::InitialParam initial_param_1d; + StepMpc1d::PlannedData planned_data_1d; + + ref_data_1d.element_list.clear(); + for(const auto & element : ref_data.element_list) + { + StepMpc1d::RefData::Element element_1d; + element_1d.is_single_support = element.is_single_support; + element_1d.zmp = element.zmp.x(); + element_1d.end_time = element.end_time; + ref_data_1d.element_list.push_back(element_1d); + } + initial_param_1d << initial_param.pos.x(), initial_param.vel.x(); + planned_data_1d = mpc_1d_->planOnce(ref_data_1d, initial_param_1d, current_time); + planned_data.current_zmp.x() = planned_data_1d.current_zmp; + if(planned_data_1d.next_foot_zmp) + { + planned_data.next_foot_zmp = Eigen::Vector2d::Zero(); + planned_data.next_foot_zmp->x() = planned_data_1d.next_foot_zmp.value(); + } + + ref_data_1d.element_list.clear(); + for(const auto & element : ref_data.element_list) + { + StepMpc1d::RefData::Element element_1d; + element_1d.is_single_support = element.is_single_support; + element_1d.zmp = element.zmp.y(); + element_1d.end_time = element.end_time; + ref_data_1d.element_list.push_back(element_1d); + } + initial_param_1d << initial_param.pos.y(), initial_param.vel.y(); + planned_data_1d = mpc_1d_->planOnce(ref_data_1d, initial_param_1d, current_time); + planned_data.current_zmp.y() = planned_data_1d.current_zmp; + if(planned_data.next_foot_zmp) + { + planned_data.next_foot_zmp->y() = planned_data_1d.next_foot_zmp.value(); + } + + return planned_data; +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f13da7d..d671d98 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -27,6 +27,7 @@ set(CCC_gtest_list TestLinearMpcZmp TestIntrinsicallyStableMpc TestSingularPreviewControlZmp + TestStepMpc TestLinearMpcZ TestLinearMpcXY TestPreviewControlCentroidal diff --git a/tests/src/FootstepManager.h b/tests/src/FootstepManager.h index 783501f..9faae4c 100644 --- a/tests/src/FootstepManager.h +++ b/tests/src/FootstepManager.h @@ -13,6 +13,7 @@ #include #include #include +#include #include /** \brief Foot. */ @@ -378,6 +379,74 @@ class FootstepManager return ref_data; } + /** \brief Make StepMpc::RefData instance. + \param current_time current time + */ + inline CCC::StepMpc::RefData makeStepMpcRefData(double current_time) const + { + // Add small values to avoid numerical instability at inequality bounds + constexpr double epsilon_t = 1e-6; + current_time -= epsilon_t; + + CCC::StepMpc::RefData ref_data; + constexpr double constant_zmp_duration = 0.2; // [sec] + constexpr double horizon_duration = 3.0; // [sec] + if(footstep_list_.size() == 0) + { + CCC::StepMpc::RefData::Element element; + element.is_single_support = false; + element.zmp = footstance_.midPos(); + element.end_time = current_time + constant_zmp_duration; + ref_data.element_list.push_back(element); + } + else + { + Footstance tmp_footstance = footstance_; + if(current_time < footstep_list_.front().swing_start_time) + { + CCC::StepMpc::RefData::Element element; + element.is_single_support = false; + element.zmp = tmp_footstance.midPos(); + element.end_time = footstep_list_.front().swing_start_time; + ref_data.element_list.push_back(element); + } + for(size_t i = 0; i < footstep_list_.size(); i++) + { + const auto & footstep = footstep_list_[i]; + if(i > 0 || current_time < footstep.swing_end_time) + { + CCC::StepMpc::RefData::Element element; + element.is_single_support = true; + element.zmp = tmp_footstance.at(opposite(footstep.foot)); + element.end_time = footstep.swing_end_time; + ref_data.element_list.push_back(element); + + tmp_footstance.at(footstep.foot) = footstep.pos; + } + { + CCC::StepMpc::RefData::Element element; + element.is_single_support = false; + element.zmp = tmp_footstance.midPos(); + if(i == footstep_list_.size() - 1) + { + element.end_time = footstep.transit_end_time; + } + else + { + element.end_time = footstep_list_[i + 1].swing_start_time; + } + ref_data.element_list.push_back(element); + } + + if(ref_data.element_list.back().end_time > current_time + horizon_duration) + { + break; + } + } + } + return ref_data; + } + public: //! Footstance Footstance footstance_; diff --git a/tests/src/TestStepMpc.cpp b/tests/src/TestStepMpc.cpp new file mode 100644 index 0000000..bcdfc45 --- /dev/null +++ b/tests/src/TestStepMpc.cpp @@ -0,0 +1,143 @@ +/* Author: Masaki Murooka */ + +#include + +#include +#include +#include +#include + +#include +#include + +#include "FootstepManager.h" +#include "SimModels.h" + +TEST(TestStepMpc, Test1) +{ + double sim_dt = 0.005; // [sec] + double com_height = 1.0; // [m] + std::vector disturb_time_list = {4.5, 8.5}; // [sec] + Eigen::Vector2d disturb_impulse_per_mass = Eigen::Vector2d(0.05, 0.05); // [m/s] + + // Setup foot-guided control + std::vector computation_duration_list; + CCC::StepMpc step_mpc(com_height); + + // Setup footstep + FootstepManager footstep_manager; + double transit_duration = 0.2; // [sec] + double swing_duration = 0.8; // [sec] + footstep_manager.appendFootstep( + Footstep(Foot::Left, Eigen::Vector2d(0.2, 0.1), 2.0, transit_duration, swing_duration)); + footstep_manager.appendFootstep( + Footstep(Foot::Right, Eigen::Vector2d(0.4, -0.1), 3.0, transit_duration, swing_duration)); + footstep_manager.appendFootstep( + Footstep(Foot::Left, Eigen::Vector2d(0.6, 0.1), 4.0, transit_duration, swing_duration)); + footstep_manager.appendFootstep( + Footstep(Foot::Right, Eigen::Vector2d(0.8, -0.1), 5.0, transit_duration, swing_duration)); + footstep_manager.appendFootstep( + Footstep(Foot::Left, Eigen::Vector2d(0.6, 0.1), 6.0, transit_duration, swing_duration)); + footstep_manager.appendFootstep( + Footstep(Foot::Right, Eigen::Vector2d(0.6, -0.1), 7.0, transit_duration, swing_duration)); + + // Setup simulation + ComZmpSim2d sim(com_height, sim_dt); + + // Setup dump file + std::string file_path = "/tmp/TestStepMpc.txt"; + std::ofstream ofs(file_path); + ofs << "time com_pos_x com_pos_y planned_zmp_x planned_zmp_y ref_zmp_x ref_zmp_y capture_point_x capture_point_y " + "computation_time" + << std::endl; + + // Setup control loop + Eigen::Vector2d planned_zmp = Eigen::Vector2d::Zero(); + + // Run control loop + constexpr double end_time = 10.0; // [sec] + double t = 0; + while(t < end_time) + { + // Plan + auto start_time = std::chrono::system_clock::now(); + footstep_manager.update(t); + CCC::StepMpc::InitialParam initial_param; + initial_param.pos = sim.state_.pos(); + initial_param.vel = sim.state_.vel(); + const auto & ref_data = footstep_manager.makeStepMpcRefData(t); + const auto & planned_data = step_mpc.planOnce(ref_data, initial_param, t); + planned_zmp = planned_data.current_zmp; + computation_duration_list.push_back( + 1e3 + * std::chrono::duration_cast>(std::chrono::system_clock::now() - start_time) + .count()); + + // Dump + Eigen::Vector2d ref_zmp = footstep_manager.refZmp(t); + Eigen::Vector2d capture_point = sim.state_.pos() + std::sqrt(com_height / CCC::constants::g) * sim.state_.vel(); + ofs << t << " " << sim.state_.pos().transpose() << " " << planned_zmp.transpose() << " " << ref_zmp.transpose() + << " " << capture_point.transpose() << " " << computation_duration_list.back() << std::endl; + + // Check + EXPECT_LT((planned_zmp - ref_zmp).norm(), 0.2); // [m] + + // Simulate + t += sim_dt; + sim.update(planned_zmp); + + // Add disturbance + for(double disturb_time : disturb_time_list) + { + if(disturb_time <= t && t < disturb_time + sim_dt) + { + sim.addDisturb(disturb_impulse_per_mass); + break; + } + } + + // Update footstep + constexpr bool enable_footstep_update = true; + if constexpr(enable_footstep_update) + { + if(!footstep_manager.footstep_list_.empty()) + { + constexpr double pre_duration = 0.1; // [sec] + double pre_swing_end_time = footstep_manager.footstep_list_.front().swing_end_time - pre_duration; + if(pre_swing_end_time <= t && t < pre_swing_end_time + sim_dt) + { + if(planned_data.next_foot_zmp) + { + footstep_manager.footstep_list_.front().pos = planned_data.next_foot_zmp.value(); + } + } + } + } + } + + // Final check + Eigen::Vector2d ref_zmp = footstep_manager.refZmp(t); + EXPECT_LT((planned_zmp - ref_zmp).norm(), 1e-2); + EXPECT_LT((sim.state_.pos() - ref_zmp).norm(), 1e-2); + EXPECT_LT(sim.state_.vel().norm(), 1e-2); + + Eigen::Map computation_duration_vec(computation_duration_list.data(), + computation_duration_list.size()); + std::cout << "Computation time per control cycle:\n" + << " mean: " << computation_duration_vec.mean() << " [ms], stdev: " + << std::sqrt((computation_duration_vec.array() - computation_duration_vec.mean()).square().mean()) + << " [ms], max: " << computation_duration_vec.maxCoeff() << " [ms]" << std::endl; + + std::cout << "Run the following commands in gnuplot:\n" + << " set key autotitle columnhead\n" + << " set key noenhanced\n" + << " plot \"" << file_path << "\" u 1:2 w lp, \"\" u 1:4 w lp, \"\" u 1:6 w l lw 2, \"\" u 1:8 w lp # x\n" + << " plot \"" << file_path << "\" u 1:3 w lp, \"\" u 1:5 w lp, \"\" u 1:7 w l lw 2, \"\" u 1:9 w lp # y\n" + << " plot \"" << file_path << "\" u 1:10 w lp # computation_time\n"; +} + +int main(int argc, char ** argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} From aeab7aab15e5942d9609fbaf42b2271b58253dac Mon Sep 17 00:00:00 2001 From: Masaki Murooka Date: Sun, 31 Dec 2023 14:51:00 +0900 Subject: [PATCH 2/2] [README] Add Step MPC. --- README.md | 10 ++++++++++ doc/images/StepMpc.png | Bin 0 -> 85337 bytes tests/scripts/plotTestZmpBasedMethodResults.py | 1 + 3 files changed, 11 insertions(+) create mode 100644 doc/images/StepMpc.png diff --git a/README.md b/README.md index 18327f2..f21ce17 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,16 @@ $ rosrun centroidal_control_collection plotTestZmpBasedMethodResults.py --method ![FootGuidedControl](doc/images/FootGuidedControl.png) +#### [StepMpc](https://isri-aist.github.io/CentroidalControlCollection/doxygen/classCCC_1_1StepMpc.html) +- S Xin, et al. Online relative footstep optimization for legged robots dynamic walking using discrete-time model predictive control. IROS, 2019. + +```bash +$ rosrun centroidal_control_collection TestStepMpc +$ rosrun centroidal_control_collection plotTestZmpBasedMethodResults.py --method StepMpc +``` + +![StepMpc](doc/images/StepMpc.png) + #### [LinearMpcZmp](https://isri-aist.github.io/CentroidalControlCollection/doxygen/classCCC_1_1LinearMpcZmp.html) - PB Wieber. Trajectory Free Linear Model Predictive Control for Stable Walking in the Presence of Strong Perturbations. Humanoids, 2006. diff --git a/doc/images/StepMpc.png b/doc/images/StepMpc.png new file mode 100644 index 0000000000000000000000000000000000000000..0e11b5e1d35890171a97cded8b79e6321c20103c GIT binary patch literal 85337 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%0AO!X4-$>Sv8Bk+S@6pF(k==-x%UAxH^BsMnL#9 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⁡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 B%T)jX literal 0 HcmV?d00001 diff --git a/tests/scripts/plotTestZmpBasedMethodResults.py b/tests/scripts/plotTestZmpBasedMethodResults.py index bbeb2d3..63fcd3d 100755 --- a/tests/scripts/plotTestZmpBasedMethodResults.py +++ b/tests/scripts/plotTestZmpBasedMethodResults.py @@ -100,6 +100,7 @@ def __init__(self, "DdpZmp", "DcmTracking", "FootGuidedControl", + "StepMpc", "LinearMpcZmp", "IntrinsicallyStableMpc", "SingularPreviewControlZmp"