37 const Eigen::MatrixXd& x0,
const Eigen::MatrixXd& xF,
38 const Eigen::MatrixXd& last_time_u,
const size_t horizon,
const double ts,
39 const Eigen::MatrixXd& ego,
const Eigen::MatrixXd& xWS,
40 const Eigen::MatrixXd& uWS,
const Eigen::MatrixXd& l_warm_up,
41 const Eigen::MatrixXd& n_warm_up,
const Eigen::MatrixXd& s_warm_up,
42 const std::vector<double>& XYbounds,
const size_t obstacles_num,
43 const Eigen::MatrixXi& obstacles_edges_num,
44 const Eigen::MatrixXd& obstacles_A,
const Eigen::MatrixXd& obstacles_b,
45 Eigen::MatrixXd* state_result, Eigen::MatrixXd* control_result,
46 Eigen::MatrixXd* time_result, Eigen::MatrixXd* dual_l_result,
47 Eigen::MatrixXd* dual_n_result) {
56 horizon, ts, ego, xWS, uWS, l_warm_up, n_warm_up, x0, xF, last_time_u,
57 XYbounds, obstacles_edges_num, obstacles_num, obstacles_A, obstacles_b,
58 planner_open_space_config_);
63 horizon, ts, ego, xWS, uWS, l_warm_up, n_warm_up, x0, xF, last_time_u,
64 XYbounds, obstacles_edges_num, obstacles_num, obstacles_A, obstacles_b,
65 planner_open_space_config_);
69 horizon, ts, ego, xWS, uWS, l_warm_up, n_warm_up, x0, xF, last_time_u,
70 XYbounds, obstacles_edges_num, obstacles_num, obstacles_A, obstacles_b,
71 planner_open_space_config_);
76 horizon, ts, ego, xWS, uWS, l_warm_up, n_warm_up, x0, xF, last_time_u,
77 XYbounds, obstacles_edges_num, obstacles_num, obstacles_A, obstacles_b,
78 planner_open_space_config_);
83 horizon, ts, ego, xWS, uWS, l_warm_up, n_warm_up, x0, xF, last_time_u,
84 XYbounds, obstacles_edges_num, obstacles_num, obstacles_A, obstacles_b,
85 planner_open_space_config_);
90 horizon, ts, ego, xWS, uWS, l_warm_up, n_warm_up, s_warm_up, x0, xF,
91 last_time_u, XYbounds, obstacles_edges_num, obstacles_num, obstacles_A,
92 obstacles_b, planner_open_space_config_);
95 Ipopt::SmartPtr<Ipopt::TNLP> problem = ptop;
98 Ipopt::SmartPtr<Ipopt::IpoptApplication> app = IpoptApplicationFactory();
100 app->Options()->SetIntegerValue(
104 app->Options()->SetIntegerValue(
108 app->Options()->SetNumericValue(
112 app->Options()->SetIntegerValue(
116 app->Options()->SetNumericValue(
120 app->Options()->SetNumericValue(
121 "acceptable_constr_viol_tol",
125 app->Options()->SetNumericValue(
126 "min_hessian_perturbation",
130 app->Options()->SetNumericValue(
131 "jacobian_regularization_value",
135 app->Options()->SetStringValue(
136 "print_timing_statistics",
140 app->Options()->SetStringValue(
144 app->Options()->SetStringValue(
148 app->Options()->SetNumericValue(
153 Ipopt::ApplicationReturnStatus status = app->Initialize();
154 if (status != Ipopt::Solve_Succeeded) {
155 AERROR <<
"*** Distance Approach problem error during initialization!";
159 status = app->OptimizeTNLP(problem);
161 if (status == Ipopt::Solve_Succeeded ||
162 status == Ipopt::Solved_To_Acceptable_Level) {
164 Ipopt::Index iter_count = app->Statistics()->IterationCount();
165 ADEBUG <<
"*** The problem solved in " << iter_count <<
" iterations!";
167 Ipopt::Number final_obj = app->Statistics()->FinalObjective();
168 ADEBUG <<
"*** The final value of the objective function is " << final_obj
178 std::unordered_map<int, std::string> failure_status = {
179 {0,
"Solve_Succeeded"},
180 {1,
"Solved_To_Acceptable_Level"},
181 {2,
"Infeasible_Problem_Detected"},
182 {3,
"Search_Direction_Becomes_Too_Small"},
183 {4,
"Diverging_Iterates"},
184 {5,
"User_Requested_Stop"},
185 {6,
"Feasible_Point_Found"},
186 {-1,
"Maximum_Iterations_Exceeded"},
187 {-2,
"Restoration_Failed"},
188 {-3,
"Error_In_Step_Computation"},
189 {-10,
"Not_Enough_Degrees_Of_Freedom"},
190 {-11,
"Invalid_Problem_Definition"},
191 {-12,
"Invalid_Option"},
192 {-13,
"Invalid_Number_Detected"},
193 {-100,
"Unrecoverable_Exception"},
194 {-101,
"NonIpopt_Exception_Thrown"},
195 {-102,
"Insufficient_Memory"},
196 {-199,
"Internal_Error"}};
198 if (!failure_status.count(
static_cast<size_t>(status))) {
199 AINFO <<
"Solver ends with unknown failure code: "
200 <<
static_cast<int>(status);
202 AINFO <<
"Solver failure case: "
203 << failure_status[
static_cast<size_t>(status)];
208 dual_l_result, dual_n_result);
210 return status == Ipopt::Solve_Succeeded ||
211 status == Ipopt::Solved_To_Acceptable_Level;
bool Solve(const Eigen::MatrixXd &x0, const Eigen::MatrixXd &xF, const Eigen::MatrixXd &last_time_u, const size_t horizon, const double ts, const Eigen::MatrixXd &ego, const Eigen::MatrixXd &xWS, const Eigen::MatrixXd &uWS, const Eigen::MatrixXd &l_warm_up, const Eigen::MatrixXd &n_warm_up, const Eigen::MatrixXd &s_warm_up, const std::vector< double > &XYbounds, const size_t obstacles_num, const Eigen::MatrixXi &obstacles_edges_num, const Eigen::MatrixXd &obstacles_A, const Eigen::MatrixXd &obstacles_b, Eigen::MatrixXd *state_result, Eigen::MatrixXd *control_result, Eigen::MatrixXd *time_result, Eigen::MatrixXd *dual_l_result, Eigen::MatrixXd *dual_n_result)