Apollo 11.0
自动驾驶开放平台
apollo::planning::OsqpSpline1dSolver类 参考

#include <osqp_spline_1d_solver.h>

类 apollo::planning::OsqpSpline1dSolver 继承关系图:
apollo::planning::OsqpSpline1dSolver 的协作图:

Public 成员函数

 OsqpSpline1dSolver (const std::vector< double > &x_knots, const uint32_t order)
 
virtual ~OsqpSpline1dSolver ()
 
bool Solve () override
 
void CleanUp ()
 
void ResetOsqp ()
 
- Public 成员函数 继承自 apollo::planning::Spline1dSolver
 Spline1dSolver (const std::vector< double > &x_knots, const uint32_t order)
 
virtual ~Spline1dSolver ()=default
 
virtual void Reset (const std::vector< double > &x_knots, const uint32_t order)
 
virtual Spline1dConstraint * mutable_spline_constraint ()
 
virtual Spline1dKernel * mutable_spline_kernel ()
 
virtual const Spline1d & spline () const
 
void GenerateProblemProto (QuadraticProgrammingProblem *const qp_proto) const
 

额外继承的成员函数

- Protected 成员函数 继承自 apollo::planning::Spline1dSolver
void ConvertMatrixXdToProto (const Eigen::MatrixXd &matrix, QPMatrix *const proto) const
 
- Protected 属性 继承自 apollo::planning::Spline1dSolver
Spline1d spline_
 
Spline1dConstraint constraint_
 
Spline1dKernel kernel_
 
int last_num_constraint_ = 0
 
int last_num_param_ = 0
 
bool last_problem_success_ = false
 

详细描述

在文件 osqp_spline_1d_solver.h 第 33 行定义.

构造及析构函数说明

◆ OsqpSpline1dSolver()

apollo::planning::OsqpSpline1dSolver::OsqpSpline1dSolver ( const std::vector< double > &  x_knots,
const uint32_t  order 
)

在文件 osqp_spline_1d_solver.cc 第 33 行定义.

35 : Spline1dSolver(x_knots, order) {
36 // Problem settings
37 settings_ = reinterpret_cast<OSQPSettings*>(c_malloc(sizeof(OSQPSettings)));
38
39 // Define Solver settings as default
40 osqp_set_default_settings(settings_);
41 settings_->alpha = 1.0; // Change alpha parameter
42 settings_->eps_abs = 1.0e-03;
43 settings_->eps_rel = 1.0e-03;
44 settings_->max_iter = 5000;
45 // settings_->polish = true;
46 settings_->verbose = FLAGS_enable_osqp_debug;
47 settings_->warm_start = true;
48
49 // Populate data
50 data_ = reinterpret_cast<OSQPData*>(c_malloc(sizeof(OSQPData)));
51}
Spline1dSolver(const std::vector< double > &x_knots, const uint32_t order)

◆ ~OsqpSpline1dSolver()

apollo::planning::OsqpSpline1dSolver::~OsqpSpline1dSolver ( )
virtual

成员函数说明

◆ CleanUp()

void apollo::planning::OsqpSpline1dSolver::CleanUp ( )

在文件 osqp_spline_1d_solver.cc 第 55 行定义.

55 {
56 osqp_cleanup(work_);
57 if (data_ != nullptr) {
58 c_free(data_->A);
59 c_free(data_->P);
60 c_free(data_);
61 }
62 if (settings_ != nullptr) {
63 c_free(settings_);
64 }
65}

◆ ResetOsqp()

void apollo::planning::OsqpSpline1dSolver::ResetOsqp ( )

在文件 osqp_spline_1d_solver.cc 第 67 行定义.

67 {
68 // Problem settings
69 settings_ = reinterpret_cast<OSQPSettings*>(c_malloc(sizeof(OSQPSettings)));
70 // Populate data
71 data_ = reinterpret_cast<OSQPData*>(c_malloc(sizeof(OSQPData)));
72}

◆ Solve()

bool apollo::planning::OsqpSpline1dSolver::Solve ( )
overridevirtual

实现了 apollo::planning::Spline1dSolver.

在文件 osqp_spline_1d_solver.cc 第 74 行定义.

74 {
75 // Namings here are following osqp convention.
76 // For details, visit: https://osqp.org/docs/examples/demo.html
77
78 // change P to csc format
79 const MatrixXd& P = kernel_.kernel_matrix();
80 ADEBUG << "P: " << P.rows() << ", " << P.cols();
81 if (P.rows() == 0) {
82 return false;
83 }
84
85 std::vector<c_float> P_data;
86 std::vector<c_int> P_indices;
87 std::vector<c_int> P_indptr;
88 DenseToCSCMatrix(P, &P_data, &P_indices, &P_indptr);
89
90 // change A to csc format
91 const MatrixXd& inequality_constraint_matrix =
93 const MatrixXd& equality_constraint_matrix =
95 MatrixXd A(
96 inequality_constraint_matrix.rows() + equality_constraint_matrix.rows(),
97 inequality_constraint_matrix.cols());
98 A << inequality_constraint_matrix, equality_constraint_matrix;
99 ADEBUG << "A: " << A.rows() << ", " << A.cols();
100 if (A.rows() == 0) {
101 return false;
102 }
103
104 std::vector<c_float> A_data;
105 std::vector<c_int> A_indices;
106 std::vector<c_int> A_indptr;
107 DenseToCSCMatrix(A, &A_data, &A_indices, &A_indptr);
108
109 // set q, l, u: l < A < u
110 const MatrixXd& q_eigen = kernel_.offset();
111 c_float q[q_eigen.rows()]; // NOLINT
112 for (int i = 0; i < q_eigen.size(); ++i) {
113 q[i] = q_eigen(i);
114 }
115
116 const MatrixXd& inequality_constraint_boundary =
118 const MatrixXd& equality_constraint_boundary =
120
121 int constraint_num = static_cast<int>(inequality_constraint_boundary.rows() +
122 equality_constraint_boundary.rows());
123
124 static constexpr double kEpsilon = 1e-9;
125 static constexpr float kUpperLimit = 1e9;
126 c_float l[constraint_num]; // NOLINT
127 c_float u[constraint_num]; // NOLINT
128 for (int i = 0; i < constraint_num; ++i) {
129 if (i < inequality_constraint_boundary.rows()) {
130 l[i] = inequality_constraint_boundary(i, 0);
131 u[i] = kUpperLimit;
132 } else {
133 const int idx =
134 i - static_cast<int>(inequality_constraint_boundary.rows());
135 l[i] = equality_constraint_boundary(idx, 0) - kEpsilon;
136 u[i] = equality_constraint_boundary(idx, 0) + kEpsilon;
137 }
138 }
139
140 data_->n = P.rows();
141 data_->m = constraint_num;
142 data_->P = csc_matrix(data_->n, data_->n, P_data.size(), P_data.data(),
143 P_indices.data(), P_indptr.data());
144 data_->q = q;
145 data_->A = csc_matrix(data_->m, data_->n, A_data.size(), A_data.data(),
146 A_indices.data(), A_indptr.data());
147 data_->l = l;
148 data_->u = u;
149
150 // osqp_setup(&work_, data_, settings_);
151 work_ = osqp_setup(data_, settings_);
152
153 // Solve Problem
154 osqp_solve(work_);
155
156 MatrixXd solved_params = MatrixXd::Zero(P.rows(), 1);
157 for (int i = 0; i < P.rows(); ++i) {
158 solved_params(i, 0) = work_->solution->x[i];
159 }
160
161 last_num_param_ = static_cast<int>(P.rows());
162 last_num_constraint_ = constraint_num;
163
164 return spline_.SetSplineSegs(solved_params, spline_.spline_order());
165}
const Eigen::MatrixXd & constraint_boundary() const
const Eigen::MatrixXd & constraint_matrix() const
const AffineConstraint & equality_constraint() const
const AffineConstraint & inequality_constraint() const
: output interface inequality constraint
const Eigen::MatrixXd & kernel_matrix() const
const Eigen::MatrixXd & offset() const
uint32_t spline_order() const
Definition spline_1d.cc:88
bool SetSplineSegs(const Eigen::MatrixXd &param_matrix, const uint32_t order)
Definition spline_1d.cc:67
#define ADEBUG
Definition log.h:41
void DenseToCSCMatrix(const Eigen::Matrix< T, M, N > &dense_matrix, std::vector< T > *data, std::vector< D > *indices, std::vector< D > *indptr)
const size_t A
Definition util.h:178

该类的文档由以下文件生成: