@@ -88,7 +88,7 @@ namespace simple_mpc
8888 auto space = MultibodyPhaseSpace (model_handler_.getModel ());
8989 auto rcost = CostStack (space, nu_);
9090
91- rcost.addCost (" state_cost" , QuadraticStateCost (space, nu_, x0_ , settings_.w_x ));
91+ rcost.addCost (" state_cost" , QuadraticStateCost (space, nu_, model_handler_. getReferenceState () , settings_.w_x ));
9292 rcost.addCost (" control_cost" , QuadraticControlCost (space, Eigen::VectorXd::Zero (nu_), settings_.w_u ));
9393
9494 auto cent_mom = CentroidalMomentumResidual (space.ndx (), nu_, model_handler_.getModel (), Eigen::VectorXd::Zero (6 ));
@@ -337,6 +337,7 @@ namespace simple_mpc
337337 }
338338 CostStack * cs = getCostStack (t);
339339 QuadraticStateCost * qc = cs->getComponent <QuadraticStateCost>(" state_cost" );
340+ x0_ = getReferenceState (t);
340341 x0_.segment (nq_, 6 ) = velocity_base;
341342 qc->setTarget (x0_);
342343 }
@@ -356,6 +357,7 @@ namespace simple_mpc
356357 }
357358 CostStack * cs = getCostStack (t);
358359 QuadraticStateCost * qc = cs->getComponent <QuadraticStateCost>(" state_cost" );
360+ x0_ = getReferenceState (t);
359361 x0_.head (7 ) = pose_base;
360362 qc->setTarget (x0_);
361363 }
@@ -398,14 +400,30 @@ namespace simple_mpc
398400 return contact_state;
399401 }
400402
403+ void FullDynamicsOCP::setReferenceState (const std::size_t t, const ConstVectorRef & x_ref)
404+ {
405+ assert (x_ref.size () == nq_ + nv_ && " x_ref not of the right size" );
406+ CostStack * cs = getCostStack (t);
407+ QuadraticStateCost * qc = cs->getComponent <QuadraticStateCost>(" state_cost" );
408+ qc->setTarget (x_ref);
409+ }
410+
411+ const ConstVectorRef FullDynamicsOCP::getReferenceState (const std::size_t t)
412+ {
413+ CostStack * cs = getCostStack (t);
414+ QuadraticStateCost * qc = cs->getComponent <QuadraticStateCost>(" state_cost" );
415+ return qc->getTarget ();
416+ }
417+
401418 CostStack FullDynamicsOCP::createTerminalCost ()
402419 {
403420 auto ter_space = MultibodyPhaseSpace (model_handler_.getModel ());
404421 auto term_cost = CostStack (ter_space, nu_);
405422 auto cent_mom =
406423 CentroidalMomentumResidual (ter_space.ndx (), nu_, model_handler_.getModel (), Eigen::VectorXd::Zero (6 ));
407424
408- term_cost.addCost (" state_cost" , QuadraticStateCost (ter_space, nu_, x0_, settings_.w_x ));
425+ term_cost.addCost (
426+ " state_cost" , QuadraticStateCost (ter_space, nu_, model_handler_.getReferenceState (), settings_.w_x ));
409427 /* term_cost.addCost(
410428 "centroidal_cost",
411429 QuadraticResidualCost(ter_space, cent_mom, settings_.w_cent)); */
0 commit comments