Skip to content

Commit f532fb5

Browse files
committed
Iterate one horizon
1 parent a277bd5 commit f532fb5

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

include/simple-mpc/mpc.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ namespace simple_mpc
6868
std::vector<std::shared_ptr<StageData>> cycle_horizon_data_;
6969
std::vector<std::shared_ptr<StageModel>> one_horizon_;
7070
std::vector<std::shared_ptr<StageData>> one_horizon_data_;
71+
std::vector<std::map<std::string, bool>> one_contact_states_;
7172
std::vector<std::shared_ptr<StageModel>> standing_horizon_;
7273
std::vector<std::shared_ptr<StageData>> standing_horizon_data_;
7374
FootTrajectory foot_trajectories_;
@@ -99,6 +100,9 @@ namespace simple_mpc
99100
// the receding horizon
100101
void generateCycleHorizon(const std::vector<std::map<std::string, bool>> & contact_states);
101102

103+
// Generate a motion horizon problem for unique motion
104+
void generateOneHorizon(const std::vector<std::map<std::string, bool>> & contact_states);
105+
102106
// Perform one iteration of MPC
103107
void iterate(const ConstVectorRef & x);
104108

@@ -183,6 +187,7 @@ namespace simple_mpc
183187

184188
// Footstep timings for each end effector
185189
std::map<std::string, std::vector<int>> foot_takeoff_times_, foot_land_times_;
190+
std::size_t one_horizon_iterator_;
186191

187192
// Solution vectors for state and control
188193
std::vector<VectorXd> xs_;

src/mpc.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ namespace simple_mpc
9090

9191
com0_ = data_handler_->getData().com[0];
9292
now_ = WALKING;
93+
one_horizon_iterator_ = 0;
9394

9495
velocity_base_.setZero();
9596
next_pose_.setZero();
@@ -182,6 +183,65 @@ namespace simple_mpc
182183
}
183184
}
184185

186+
void MPC::generateOneHorizon(const std::vector<std::map<std::string, bool>> & contact_states)
187+
{
188+
one_contact_states_ = contact_states;
189+
190+
// Generate contact switch timings
191+
std::map<std::string, bool> previous_contacts;
192+
for (auto const & name : ee_names_)
193+
{
194+
previous_contacts.insert({name, true});
195+
}
196+
197+
// Generate the model stages for one horizon
198+
for (auto const & state : one_contact_states_)
199+
{
200+
int active_contacts = 0;
201+
for (auto const & contact : state)
202+
{
203+
if (contact.second)
204+
active_contacts += 1;
205+
}
206+
207+
Eigen::VectorXd force_ref(ocp_handler_->getReferenceForce(0, ocp_handler_->getModelHandler().getFootName(0)));
208+
Eigen::VectorXd force_zero(ocp_handler_->getReferenceForce(0, ocp_handler_->getModelHandler().getFootName(0)));
209+
force_ref.setZero();
210+
force_zero.setZero();
211+
force_ref[2] = settings_.support_force / active_contacts;
212+
213+
std::map<std::string, pinocchio::SE3> contact_poses;
214+
std::map<std::string, Eigen::VectorXd> force_map;
215+
216+
for (auto const & name : ee_names_)
217+
{
218+
contact_poses.insert({name, data_handler_->getFootPose(name)});
219+
if (state.at(name))
220+
force_map.insert({name, force_ref});
221+
else
222+
force_map.insert({name, force_zero});
223+
}
224+
std::map<std::string, bool> land_contacts;
225+
for (auto const & name : ee_names_)
226+
{
227+
if (!previous_contacts.at(name) and state.at(name))
228+
{
229+
land_contacts.insert({name, true});
230+
}
231+
else
232+
{
233+
land_contacts.insert({name, false});
234+
}
235+
}
236+
237+
std::shared_ptr<StageModel> sm =
238+
std::make_shared<StageModel>(ocp_handler_->createStage(state, contact_poses, force_map, land_contacts));
239+
one_horizon_.push_back(sm);
240+
one_horizon_data_.push_back(sm->createData());
241+
previous_contacts = state;
242+
}
243+
}
244+
185245
void MPC::iterate(const ConstVectorRef & x)
186246
{
187247

@@ -215,6 +275,21 @@ namespace simple_mpc
215275

216276
void MPC::recedeWithCycle()
217277
{
278+
if (now_ == MOTION)
279+
{
280+
ocp_handler_->getProblem().replaceStageCircular(*one_horizon_[0]);
281+
solver_->cycleProblem(ocp_handler_->getProblem(), one_horizon_data_[0]);
282+
283+
rotate_vec_left(one_horizon_);
284+
rotate_vec_left(one_horizon_data_);
285+
286+
one_horizon_iterator_ += 1;
287+
if (one_horizon_iterator_ == one_horizon_.size())
288+
{
289+
one_horizon_iterator_ = 0;
290+
now_ = STANDING;
291+
}
292+
}
218293
if (now_ == WALKING or ocp_handler_->getContactSupport(ocp_handler_->getSize() - 1) < ee_names_.size())
219294
{
220295

0 commit comments

Comments
 (0)