41 const Eigen::MatrixXd& x0,
42 const Eigen::MatrixXd& xF,
43 const Eigen::MatrixXd& last_time_u,
46 const Eigen::MatrixXd& ego,
47 const Eigen::MatrixXd& xWS,
48 const Eigen::MatrixXd& uWS,
49 const Eigen::MatrixXd& l_warm_up,
50 const Eigen::MatrixXd& n_warm_up,
51 const Eigen::MatrixXd& s_warm_up,
52 const std::vector<double>& XYbounds,
53 const size_t obstacles_num,
54 const Eigen::MatrixXi& obstacles_edges_num,
55 const Eigen::MatrixXd& obstacles_A,
56 const Eigen::MatrixXd& obstacles_b,
57 Eigen::MatrixXd* state_result,
58 Eigen::MatrixXd* control_result,
59 Eigen::MatrixXd* time_result,
60 Eigen::MatrixXd* dual_l_result,
61 Eigen::MatrixXd* dual_n_result) {
84 distance_approach_config_);
102 distance_approach_config_);
120 distance_approach_config_);
138 distance_approach_config_);
156 distance_approach_config_);
175 distance_approach_config_);
178 Ipopt::SmartPtr<Ipopt::TNLP> problem = ptop;
181 Ipopt::SmartPtr<Ipopt::IpoptApplication> app = IpoptApplicationFactory();
188 app->Options()->SetNumericValue(
190 app->Options()->SetNumericValue(
192 app->Options()->SetNumericValue(
193 "jacobian_regularization_value",
195 app->Options()->SetStringValue(
201 Ipopt::ApplicationReturnStatus status = app->Initialize();
202 if (status != Ipopt::Solve_Succeeded) {
203 AERROR <<
"*** Distance Approach problem error during initialization!";
207 status = app->OptimizeTNLP(problem);
209 if (status == Ipopt::Solve_Succeeded || status == Ipopt::Solved_To_Acceptable_Level) {
211 Ipopt::Index iter_count = app->Statistics()->IterationCount();
212 ADEBUG <<
"*** The problem solved in " << iter_count <<
" iterations!";
214 Ipopt::Number final_obj = app->Statistics()->FinalObjective();
215 ADEBUG <<
"*** The final value of the objective function is " << final_obj <<
'.';
224 std::unordered_map<int, std::string> failure_status
225 = {{0,
"Solve_Succeeded"},
226 {1,
"Solved_To_Acceptable_Level"},
227 {2,
"Infeasible_Problem_Detected"},
228 {3,
"Search_Direction_Becomes_Too_Small"},
229 {4,
"Diverging_Iterates"},
230 {5,
"User_Requested_Stop"},
231 {6,
"Feasible_Point_Found"},
232 {-1,
"Maximum_Iterations_Exceeded"},
233 {-2,
"Restoration_Failed"},
234 {-3,
"Error_In_Step_Computation"},
235 {-10,
"Not_Enough_Degrees_Of_Freedom"},
236 {-11,
"Invalid_Problem_Definition"},
237 {-12,
"Invalid_Option"},
238 {-13,
"Invalid_Number_Detected"},
239 {-100,
"Unrecoverable_Exception"},
240 {-101,
"NonIpopt_Exception_Thrown"},
241 {-102,
"Insufficient_Memory"},
242 {-199,
"Internal_Error"}};
244 if (!failure_status.count(
static_cast<size_t>(status))) {
245 AINFO <<
"Solver ends with unknown failure code: " <<
static_cast<int>(status);
247 AINFO <<
"Solver failure case: " << failure_status[
static_cast<size_t>(status)];
253 return status == Ipopt::Solve_Succeeded || 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)