3 #include "drake/solvers/branch_and_bound.h"
5 #include "drake/solvers/osqp_solver.h"
6 #include "drake/solvers/gurobi_solver.h"
10 drake::solvers::MathematicalProgram prog;
11 std::cout <<
"is gurobi solver available?: " << drake::solvers::GurobiSolver::is_available() <<
"is it enabled?: " << drake::solvers::GurobiSolver::is_enabled() <<
"is the license valid? " << drake::solvers::GurobiSolver::AcquireLicense() << std::endl;
12 ROS_INFO(
"adding decision variables");
14 bool enforce_goal_hard =
true;
15 ROS_INFO(
"setting initial and goal position");
18 ROS_INFO(
"setting theta limits");
21 ROS_INFO(
"setting geometry limits");
24 ROS_INFO(
"setting relative position limits");
27 ROS_INFO(
"one stone per foot");
30 ROS_INFO(
"foot in stepping stone");
33 ROS_INFO(
"minimize step length");
35 ROS_INFO(
"minimize remaining length");
37 if (!enforce_goal_hard)
47 ROS_INFO(
"Using Gurobi solver");
48 drake::solvers::GurobiSolver solver;
50 drake::solvers::MathematicalProgramResult result = solver.Solve(prog);
52 decision_variables_opt.
position = result.GetSolution(decision_variables.
position);
54 decision_variables_opt.
theta = result.GetSolution(decision_variables.
theta);
58 decision_variables_opt.
bin_sin = result.GetSolution(decision_variables.
bin_sin);
60 decision_variables_opt.
bin_cos = result.GetSolution(decision_variables.
bin_cos);
62 decision_variables_opt.
lin_sin = result.GetSolution(decision_variables.
lin_sin);
64 decision_variables_opt.
lin_cos = result.GetSolution(decision_variables.
lin_cos);
66 decision_variables_opt.
stone = result.GetSolution(decision_variables.
stone);
68 decision_variables_opt.
cost = result.get_optimal_cost();
70 if (!result.is_success())
72 ROS_ERROR(
"Infeasible optimization problem.");
73 decision_variables_opt.
success =
false;
77 decision_variables_opt.
success =
true;
81 ROS_INFO(
"Using naive branch-and-bound solver");
82 drake::solvers::MixedIntegerBranchAndBound solver(prog, drake::solvers::OsqpSolver::id());
92 drake::solvers::SolutionResult result = solver.Solve();
93 ROS_INFO(
"done solving");
95 decision_variables_opt.
position = solver.GetSolution(decision_variables.
position);
97 decision_variables_opt.
theta = solver.GetSolution(decision_variables.
theta);
101 decision_variables_opt.
bin_sin = solver.GetSolution(decision_variables.
bin_sin);
103 decision_variables_opt.
bin_cos = solver.GetSolution(decision_variables.
bin_cos);
105 decision_variables_opt.
lin_sin = solver.GetSolution(decision_variables.
lin_sin);
107 decision_variables_opt.
lin_cos = solver.GetSolution(decision_variables.
lin_cos);
109 decision_variables_opt.
stone = solver.GetSolution(decision_variables.
stone);
111 decision_variables_opt.
cost = solver.GetOptimalCost();
113 if (result != drake::solvers::kSolutionFound)
115 ROS_ERROR(
"Infeasible optimization problem.");
116 decision_variables_opt.
success =
false;
120 decision_variables_opt.
success =
true;
void foot_in_stepping_stone(drake::solvers::MathematicalProgram &prog, Terrain &terrain, int n_steps, DecVars &decision_variables)
void relative_position_limits(drake::solvers::MathematicalProgram &prog, int n_steps, double step_span, DecVars &decision_variables)
void set_initial_and_goal_position(drake::solvers::MathematicalProgram &prog, Terrain &terrain, DecVars &decision_variables)
DecVars add_decision_variables(drake::solvers::MathematicalProgram &prog, Terrain &terrain, int n_steps)
void minimize_step_length(drake::solvers::MathematicalProgram &prog, int n_steps, DecVars &decision_variables)
void step_sequence(drake::solvers::MathematicalProgram &prog, int n_steps, double step_span, DecVars &decision_variables)
void one_stone_per_foot(drake::solvers::MathematicalProgram &prog, int n_steps, DecVars &decision_variables)
void theta_limits(drake::solvers::MathematicalProgram &prog, int n_steps, int n_legs, DecVars &decision_variables)
DecVars_res get_decvars_res(DecVars_res_raw &decision_variables_raw, int n_steps, int n_legs, Leg step_sequence[])
void geometry_limits(drake::solvers::MathematicalProgram &prog, int n_steps, int n_legs, double length_legs, Leg step_sequence[], Terrain &terrain, double bbox_len, DecVars &decision_variables)
void minimize_remaining_length(drake::solvers::MathematicalProgram &prog, Terrain &terrain, int n_steps, int n_legs, DecVars &decision_variables)
Eigen::MatrixXd sequence_offset
MatrixXDecisionVariable position
MatrixXDecisionVariable bin_cos
MatrixXDecisionVariable stone
MatrixXDecisionVariable bin_sin
MatrixXDecisionVariable lin_sin
MatrixXDecisionVariable theta
MatrixXDecisionVariable lin_cos