Skip to content

Commit 2ea8ead

Browse files
committed
Add getContactState function to ocp_handler
1 parent 2a3746e commit 2ea8ead

File tree

10 files changed

+63
-0
lines changed

10 files changed

+63
-0
lines changed

bindings/expose-problem.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ namespace simple_mpc
7171
.def("getPoseBase", bp::pure_virtual(&OCPHandler::getPoseBase), bp::args("self", "t"))
7272
.def("getProblemState", bp::pure_virtual(&OCPHandler::getProblemState), bp::args("self", "data_handler"))
7373
.def("getContactSupport", bp::pure_virtual(&OCPHandler::getContactSupport), bp::args("self", "t"))
74+
.def("getContactState", bp::pure_virtual(&OCPHandler::getContactState), bp::args("self", "t"))
7475
.def(
7576
"createProblem", &OCPHandler::createProblem,
7677
("self"_a, "x0", "horizon", "force_size", "gravity", "terminal_constraint"))

include/simple-mpc/centroidal-dynamics.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ namespace simple_mpc
9696
void setPoseBase(const std::size_t t, const ConstVectorRef & pose_base) override;
9797
const Eigen::VectorXd getProblemState(const RobotDataHandler & data_handler) override;
9898
size_t getContactSupport(const std::size_t t) override;
99+
std::vector<bool> getContactState(const std::size_t t) override;
99100

100101
CentroidalSettings getSettings()
101102
{

include/simple-mpc/fulldynamics.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ namespace simple_mpc
101101
void setPoseBase(const std::size_t t, const ConstVectorRef & pose_base) override;
102102
const Eigen::VectorXd getProblemState(const RobotDataHandler & data_handler) override;
103103
size_t getContactSupport(const std::size_t t) override;
104+
std::vector<bool> getContactState(const std::size_t t) override;
104105
FullDynamicsSettings getSettings()
105106
{
106107
return settings_;

include/simple-mpc/kinodynamics.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ namespace simple_mpc
8989
void setVelocityBase(const std::size_t t, const ConstVectorRef & velocity_base) override;
9090
const Eigen::VectorXd getProblemState(const RobotDataHandler & data_handler) override;
9191
size_t getContactSupport(const std::size_t t) override;
92+
std::vector<bool> getContactState(const std::size_t t) override;
9293

9394
void computeControlFromForces(const std::map<std::string, Eigen::VectorXd> & force_refs);
9495

include/simple-mpc/ocp-handler.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ namespace simple_mpc
9595
virtual const Eigen::VectorXd getReferenceForce(const std::size_t t, const std::string & ee_name) = 0;
9696
virtual const Eigen::VectorXd getProblemState(const RobotDataHandler & data_handler) = 0;
9797
virtual size_t getContactSupport(const std::size_t t) = 0;
98+
virtual std::vector<bool> getContactState(const std::size_t t) = 0;
9899

99100
/// Common functions for all problems
100101

include/simple-mpc/python/py-ocp-handler.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,11 @@ namespace simple_mpc
165165
SIMPLE_MPC_PYTHON_OVERRIDE_PURE(std::size_t, "getContactSupport", t);
166166
}
167167

168+
std::vector<bool> getContactState(const std::size_t t) override
169+
{
170+
SIMPLE_MPC_PYTHON_OVERRIDE_PURE(std::vector<bool>, "getContactState", t);
171+
}
172+
168173
void setReferenceControl(const std::size_t t, const ConstVectorRef & u_ref)
169174
{
170175
SIMPLE_MPC_PYTHON_OVERRIDE(void, OCPHandler, setReferenceControl, t, u_ref);

src/centroidal-dynamics.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,18 @@ namespace simple_mpc
278278
return active_contacts;
279279
}
280280

281+
std::vector<bool> CentroidalOCP::getContactState(const std::size_t t)
282+
{
283+
std::vector<bool> contact_state;
284+
CentroidalFwdDynamics * ode =
285+
problem_->stages_[t]->getDynamics<IntegratorEuler>()->getDynamics<CentroidalFwdDynamics>();
286+
287+
for (auto name : model_handler_.getFeetNames())
288+
contact_state.push_back(ode->contact_map_.getContactState(name));
289+
290+
return contact_state;
291+
}
292+
281293
CostStack CentroidalOCP::createTerminalCost()
282294
{
283295
auto ter_space = VectorSpace(nx_);

src/fulldynamics.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,31 @@ namespace simple_mpc
373373
return ode->constraint_models_.size();
374374
}
375375

376+
std::vector<bool> FullDynamicsOCP::getContactState(const std::size_t t)
377+
{
378+
std::vector<bool> contact_state;
379+
MultibodyConstraintFwdDynamics * ode =
380+
problem_->stages_[t]->getDynamics<IntegratorSemiImplEuler>()->getDynamics<MultibodyConstraintFwdDynamics>();
381+
382+
for (auto name : model_handler_.getFeetNames())
383+
{
384+
std::size_t i;
385+
for (i = 0; i < ode->constraint_models_.size(); i++)
386+
{
387+
if (ode->constraint_models_[i].name == name)
388+
{
389+
contact_state.push_back(true);
390+
break;
391+
}
392+
}
393+
if (i == ode->constraint_models_.size())
394+
{
395+
contact_state.push_back(false);
396+
}
397+
}
398+
return contact_state;
399+
}
400+
376401
CostStack FullDynamicsOCP::createTerminalCost()
377402
{
378403
auto ter_space = MultibodyPhaseSpace(model_handler_.getModel());

src/kinodynamics.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,14 @@ namespace simple_mpc
322322
return active_contacts;
323323
}
324324

325+
std::vector<bool> KinodynamicsOCP::getContactState(const std::size_t t)
326+
{
327+
KinodynamicsFwdDynamics * ode =
328+
problem_->stages_[t]->getDynamics<IntegratorSemiImplEuler>()->getDynamics<KinodynamicsFwdDynamics>();
329+
330+
return ode->contact_states_;
331+
}
332+
325333
CostStack KinodynamicsOCP::createTerminalCost()
326334
{
327335
auto ter_space = MultibodyPhaseSpace(model_handler_.getModel());

tests/problem.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,10 @@ BOOST_AUTO_TEST_CASE(fulldynamics)
5555
QuadraticResidualCost * crc = csp->getComponent<QuadraticResidualCost>("centroidal_cost");
5656
QuadraticResidualCost * cpc = csp->getComponent<QuadraticResidualCost>("left_sole_link_pose_cost");
5757

58+
std::vector<bool> cs2 = {true, true};
5859
BOOST_CHECK_EQUAL(fdproblem.getSize(), 100);
5960
BOOST_CHECK_EQUAL(fdproblem.getContactSupport(2), 2);
61+
BOOST_TEST(fdproblem.getContactState(2) == cs2);
6062
BOOST_CHECK_EQUAL(cc->weights_, settings.w_u);
6163
BOOST_CHECK_EQUAL(crc->weights_, settings.w_cent);
6264
BOOST_CHECK_EQUAL(cpc->weights_, settings.w_frame);
@@ -137,7 +139,9 @@ BOOST_AUTO_TEST_CASE(kinodynamics)
137139
QuadraticResidualCost * crc = csp->getComponent<QuadraticResidualCost>("centroidal_cost");
138140
QuadraticResidualCost * cpc = csp->getComponent<QuadraticResidualCost>("left_sole_link_pose_cost");
139141

142+
std::vector<bool> cs2 = {true, true};
140143
BOOST_CHECK_EQUAL(knproblem.getContactSupport(2), 2);
144+
BOOST_TEST(knproblem.getContactState(2) == cs2);
141145
BOOST_CHECK_EQUAL(cc->weights_, settings.w_u);
142146
BOOST_CHECK_EQUAL(crc->weights_, settings.w_cent);
143147
BOOST_CHECK_EQUAL(cpc->weights_, settings.w_frame);
@@ -220,7 +224,9 @@ BOOST_AUTO_TEST_CASE(centroidal)
220224
QuadraticResidualCost * crc = csp->getComponent<QuadraticResidualCost>("linear_mom_cost");
221225
QuadraticResidualCost * cpc = csp->getComponent<QuadraticResidualCost>("angular_acc_cost");
222226

227+
std::vector<bool> cs2 = {true, true};
223228
BOOST_CHECK_EQUAL(cproblem.getContactSupport(2), 2);
229+
BOOST_TEST(cproblem.getContactState(2) == cs2);
224230
BOOST_CHECK_EQUAL(cc->weights_, settings.w_u);
225231
BOOST_CHECK_EQUAL(crc->weights_, settings.w_linear_mom);
226232
BOOST_CHECK_EQUAL(cpc->weights_, settings.w_angular_acc);
@@ -308,7 +314,9 @@ BOOST_AUTO_TEST_CASE(centroidal_solo)
308314
QuadraticResidualCost * crc = csp->getComponent<QuadraticResidualCost>("linear_mom_cost");
309315
QuadraticResidualCost * cpc = csp->getComponent<QuadraticResidualCost>("angular_acc_cost");
310316

317+
std::vector<bool> cs2 = {true, true, true, true};
311318
BOOST_CHECK_EQUAL(cproblem.getContactSupport(2), 4);
319+
BOOST_TEST(cproblem.getContactState(2) == cs2);
312320
BOOST_CHECK_EQUAL(cc->weights_, settings.w_u);
313321
BOOST_CHECK_EQUAL(crc->weights_, settings.w_linear_mom);
314322
BOOST_CHECK_EQUAL(cpc->weights_, settings.w_angular_acc);

0 commit comments

Comments
 (0)