Apollo  6.0
Open source self driving car software
spiral_problem_interface.h
Go to the documentation of this file.
1 /******************************************************************************
2  * Copyright 2017 The Apollo Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *****************************************************************************/
16 
17 /*
18  * spiral_problem_interface.h
19  */
20 
21 #pragma once
22 
23 /* Workaround for coin/IpSmartPtr.hpp:18:4: error: #error "don't have header
24  * file for stddef" */
25 #include <cstddef>
26 #include <vector>
27 
28 #include <coin/IpTNLP.hpp>
29 #include <coin/IpTypes.hpp>
30 
31 #include "Eigen/Dense"
33 
34 namespace apollo {
35 namespace planning {
36 
37 class SpiralProblemInterface : public Ipopt::TNLP {
38  public:
39  explicit SpiralProblemInterface(std::vector<Eigen::Vector2d> points);
40 
41  virtual ~SpiralProblemInterface() = default;
42 
43  void set_default_max_point_deviation(const double point_max_deviation);
44 
45  void set_start_point(const double x, const double y, const double theta,
46  const double kappa, const double dkappa);
47 
48  void set_end_point(const double x, const double y, const double theta,
49  const double kappa, const double dkappa);
50 
51  void set_end_point_position(const double x, const double y);
52 
53  void set_element_weight_curve_length(const double weight_curve_length);
54 
55  void set_element_weight_kappa(const double weight_kappa);
56 
57  void set_element_weight_dkappa(const double weight_dkappa);
58 
59  void get_optimization_results(std::vector<double>* ptr_theta,
60  std::vector<double>* ptr_kappa,
61  std::vector<double>* ptr_dkappa,
62  std::vector<double>* ptr_s,
63  std::vector<double>* ptr_x,
64  std::vector<double>* ptr_y) const;
65 
67  bool get_nlp_info(int& n, int& m, int& nnz_jac_g, int& nnz_h_lag,
68  IndexStyleEnum& index_style) override;
69 
71  bool get_bounds_info(int n, double* x_l, double* x_u, int m, double* g_l,
72  double* g_u) override;
73 
75  bool get_starting_point(int n, bool init_x, double* x, bool init_z,
76  double* z_L, double* z_U, int m, bool init_lambda,
77  double* lambda) override;
78 
80  bool eval_f(int n, const double* x, bool new_x, double& obj_value) override;
81 
83  bool eval_grad_f(int n, const double* x, bool new_x, double* grad_f) override;
84 
86  bool eval_g(int n, const double* x, bool new_x, int m, double* g) override;
87 
92  bool eval_jac_g(int n, const double* x, bool new_x, int m, int nele_jac,
93  int* iRow, int* jCol, double* values) override;
94 
100  bool eval_h(int n, const double* x, bool new_x, double obj_factor, int m,
101  const double* lambda, bool new_lambda, int nele_hess, int* iRow,
102  int* jCol, double* values) override;
103 
107  void finalize_solution(Ipopt::SolverReturn status, int n, const double* x,
108  const double* z_L, const double* z_U, int m,
109  const double* g, const double* lambda,
110  double obj_value, const Ipopt::IpoptData* ip_data,
111  Ipopt::IpoptCalculatedQuantities* ip_cq) override;
112 
113  public:
114  static constexpr size_t N = 10;
115 
116  private:
117  void update_piecewise_spiral_paths(const double* x, const int n);
118 
119  std::vector<Eigen::Vector2d> init_points_;
120 
121  std::vector<double> opt_theta_;
122 
123  std::vector<double> opt_kappa_;
124 
125  std::vector<double> opt_dkappa_;
126 
127  std::vector<double> opt_s_;
128 
129  std::vector<double> opt_x_;
130 
131  std::vector<double> opt_y_;
132 
133  std::vector<double> point_distances_;
134 
135  int num_of_variables_ = 0;
136 
137  int num_of_constraints_ = 0;
138 
139  int num_of_points_ = 0;
140 
141  double default_max_point_deviation_ = 0.0;
142 
143  const int num_of_internal_points_ = 5;
144 
145  std::vector<double> relative_theta_;
146 
147  std::vector<QuinticSpiralPathWithDerivation<N>> piecewise_paths_;
148 
149  bool has_fixed_start_point_ = false;
150 
151  double start_x_ = 0.0;
152 
153  double start_y_ = 0.0;
154 
155  double start_theta_ = 0.0;
156 
157  double start_kappa_ = 0.0;
158 
159  double start_dkappa_ = 0.0;
160 
161  bool has_fixed_end_point_ = false;
162 
163  double end_x_ = 0.0;
164 
165  double end_y_ = 0.0;
166 
167  double end_theta_ = 0.0;
168 
169  double end_kappa_ = 0.0;
170 
171  double end_dkappa_ = 0.0;
172 
173  bool has_fixed_end_point_position_ = false;
174 
175  double weight_curve_length_ = 1.0;
176 
177  double weight_kappa_ = 1.0;
178 
179  double weight_dkappa_ = 1.0;
180 };
181 
182 } // namespace planning
183 } // namespace apollo
SpiralProblemInterface(std::vector< Eigen::Vector2d > points)
bool eval_f(int n, const double *x, bool new_x, double &obj_value) override
void finalize_solution(Ipopt::SolverReturn status, int n, const double *x, const double *z_L, const double *z_U, int m, const double *g, const double *lambda, double obj_value, const Ipopt::IpoptData *ip_data, Ipopt::IpoptCalculatedQuantities *ip_cq) override
void set_start_point(const double x, const double y, const double theta, const double kappa, const double dkappa)
void get_optimization_results(std::vector< double > *ptr_theta, std::vector< double > *ptr_kappa, std::vector< double > *ptr_dkappa, std::vector< double > *ptr_s, std::vector< double > *ptr_x, std::vector< double > *ptr_y) const
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
void set_element_weight_kappa(const double weight_kappa)
bool eval_jac_g(int n, const double *x, bool new_x, int m, int nele_jac, int *iRow, int *jCol, double *values) override
Planning module main class. It processes GPS and IMU as input, to generate planning info...
void set_element_weight_curve_length(const double weight_curve_length)
static constexpr size_t N
Definition: spiral_problem_interface.h:114
void set_end_point_position(const double x, const double y)
void set_default_max_point_deviation(const double point_max_deviation)
bool get_bounds_info(int n, double *x_l, double *x_u, int m, double *g_l, double *g_u) override
void set_element_weight_dkappa(const double weight_dkappa)
bool eval_g(int n, const double *x, bool new_x, int m, double *g) override
void set_end_point(const double x, const double y, const double theta, const double kappa, const double dkappa)
Definition: spiral_problem_interface.h:37
bool get_nlp_info(int &n, int &m, int &nnz_jac_g, int &nnz_h_lag, IndexStyleEnum &index_style) override
bool eval_grad_f(int n, const double *x, bool new_x, double *grad_f) override
bool eval_h(int n, const double *x, bool new_x, double obj_factor, int m, const double *lambda, bool new_lambda, int nele_hess, int *iRow, int *jCol, double *values) override
bool get_starting_point(int n, bool init_x, double *x, bool init_z, double *z_L, double *z_U, int m, bool init_lambda, double *lambda) override