Tetrapod Project
footstep_planner.cpp
Go to the documentation of this file.
2 
3 #include "drake/solvers/branch_and_bound.h"
4 
5 #include "drake/solvers/osqp_solver.h"
6 #include "drake/solvers/gurobi_solver.h"
7 #include <iostream>
8 DecVars_res footstep_planner(Terrain &terrain, int n_steps, int n_legs, double length_legs, Leg step_sequence[], double bbox_len, double step_span, double step_height, bool use_gurobi)
9 {
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");
13  DecVars decision_variables = add_decision_variables(prog, terrain, n_steps, n_legs);
14  bool enforce_goal_hard = true;
15  ROS_INFO("setting initial and goal position");
16  set_initial_and_goal_position(prog, n_steps, length_legs, step_sequence, terrain, decision_variables, enforce_goal_hard);
17 
18  ROS_INFO("setting theta limits");
19  theta_limits(prog, n_steps, n_legs, decision_variables);
20 
21  ROS_INFO("setting geometry limits");
22  geometry_limits(prog, n_steps, n_legs, length_legs, step_sequence, terrain, bbox_len, decision_variables);
23 
24  ROS_INFO("setting relative position limits");
25  relative_position_limits(prog, n_steps, n_legs, step_span, step_height, decision_variables);
26 
27  ROS_INFO("one stone per foot");
28  one_stone_per_foot(prog, n_steps, decision_variables);
29 
30  ROS_INFO("foot in stepping stone");
31  foot_in_stepping_stone(prog, terrain, n_steps, decision_variables);
32 
33  ROS_INFO("minimize step length");
34  minimize_step_length(prog, n_steps, n_legs, decision_variables);
35  ROS_INFO("minimize remaining length");
36 
37  if (!enforce_goal_hard)
38  {
39  minimize_remaining_length(prog, terrain, n_steps, n_legs, decision_variables);
40  }
41  ROS_INFO("bb");
42 
43  DecVars_res_raw decision_variables_opt;
44 
45  if (use_gurobi)
46  {
47  ROS_INFO("Using Gurobi solver");
48  drake::solvers::GurobiSolver solver;
49 
50  drake::solvers::MathematicalProgramResult result = solver.Solve(prog);
51 
52  decision_variables_opt.position = result.GetSolution(decision_variables.position);
53 
54  decision_variables_opt.theta = result.GetSolution(decision_variables.theta);
55 
56  decision_variables_opt.sequence_offset = Eigen::Vector4d(1, 0, 0, 0);//result.GetSolution(decision_variables.sequence_offset);
57 
58  decision_variables_opt.bin_sin = result.GetSolution(decision_variables.bin_sin);
59 
60  decision_variables_opt.bin_cos = result.GetSolution(decision_variables.bin_cos);
61 
62  decision_variables_opt.lin_sin = result.GetSolution(decision_variables.lin_sin);
63 
64  decision_variables_opt.lin_cos = result.GetSolution(decision_variables.lin_cos);
65 
66  decision_variables_opt.stone = result.GetSolution(decision_variables.stone);
67 
68  decision_variables_opt.cost = result.get_optimal_cost();
69 
70  if (!result.is_success())
71  {
72  ROS_ERROR("Infeasible optimization problem.");
73  decision_variables_opt.success = false;
74  }
75  else
76  {
77  decision_variables_opt.success = true;
78  }
79  }
80  else{
81  ROS_INFO("Using naive branch-and-bound solver");
82  drake::solvers::MixedIntegerBranchAndBound solver(prog, drake::solvers::OsqpSolver::id());
83 
84 
85  /*auto constr = prog.GetAllLinearConstraints();
86 
87  for (auto el: constr) {
88  std::cout << el << std::endl;
89  }
90  std::cout << constr.size() << std::endl;*/
91  ROS_INFO("solve");
92  drake::solvers::SolutionResult result = solver.Solve();
93  ROS_INFO("done solving");
94 
95  decision_variables_opt.position = solver.GetSolution(decision_variables.position);
96 
97  decision_variables_opt.theta = solver.GetSolution(decision_variables.theta);
98 
99  decision_variables_opt.sequence_offset = Eigen::Vector4d(1, 0, 0, 0);//solver.GetSolution(decision_variables.sequence_offset);
100 
101  decision_variables_opt.bin_sin = solver.GetSolution(decision_variables.bin_sin);
102 
103  decision_variables_opt.bin_cos = solver.GetSolution(decision_variables.bin_cos);
104 
105  decision_variables_opt.lin_sin = solver.GetSolution(decision_variables.lin_sin);
106 
107  decision_variables_opt.lin_cos = solver.GetSolution(decision_variables.lin_cos);
108 
109  decision_variables_opt.stone = solver.GetSolution(decision_variables.stone);
110 
111  decision_variables_opt.cost = solver.GetOptimalCost();
112 
113  if (result != drake::solvers::kSolutionFound)
114  {
115  ROS_ERROR("Infeasible optimization problem.");
116  decision_variables_opt.success = false;
117  }
118  else
119  {
120  decision_variables_opt.success = true;
121  }
122  }
123 
124 
125 
126  return get_decvars_res(decision_variables_opt, n_steps, n_legs, step_sequence);
127 }
DecVars_res footstep_planner(Terrain &terrain, int n_steps, int n_legs, double length_legs, Leg step_sequence[], double bbox_len, double step_span, double step_height, bool use_gurobi)
void foot_in_stepping_stone(drake::solvers::MathematicalProgram &prog, Terrain &terrain, int n_steps, DecVars &decision_variables)
Definition: miqp_biped.cpp:167
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)
Definition: miqp_biped.cpp:34
DecVars add_decision_variables(drake::solvers::MathematicalProgram &prog, Terrain &terrain, int n_steps)
Definition: miqp_biped.cpp:13
void minimize_step_length(drake::solvers::MathematicalProgram &prog, int n_steps, DecVars &decision_variables)
Definition: miqp_biped.cpp:218
void step_sequence(drake::solvers::MathematicalProgram &prog, int n_steps, double step_span, DecVars &decision_variables)
Definition: miqp_biped.cpp:93
void one_stone_per_foot(drake::solvers::MathematicalProgram &prog, int n_steps, DecVars &decision_variables)
Definition: miqp_biped.cpp:137
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)
int step_span
Definition: visualize.py:14
MatrixXDecisionVariable position
MatrixXDecisionVariable bin_cos
MatrixXDecisionVariable stone
MatrixXDecisionVariable bin_sin
MatrixXDecisionVariable lin_sin
MatrixXDecisionVariable theta
MatrixXDecisionVariable lin_cos