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

#include <osqp_spline_2d_solver.h>

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

Public 成员函数

 OsqpSpline2dSolver (const std::vector< double > &t_knots, const uint32_t order)
 
void Reset (const std::vector< double > &t_knots, const uint32_t order) override
 
Spline2dConstraint * mutable_constraint () override
 
Spline2dKernel * mutable_kernel () override
 
Spline2d * mutable_spline () override
 
bool Solve () override
 
const Spline2d & spline () const override
 
- Public 成员函数 继承自 apollo::planning::Spline2dSolver
 Spline2dSolver (const std::vector< double > &t_knots, const uint32_t order)
 
virtual ~Spline2dSolver ()=default
 

额外继承的成员函数

- Protected 属性 继承自 apollo::planning::Spline2dSolver
Spline2d spline_
 
Spline2dKernel kernel_
 
Spline2dConstraint constraint_
 

详细描述

在文件 osqp_spline_2d_solver.h 第 35 行定义.

构造及析构函数说明

◆ OsqpSpline2dSolver()

apollo::planning::OsqpSpline2dSolver::OsqpSpline2dSolver ( const std::vector< double > &  t_knots,
const uint32_t  order 
)

在文件 osqp_spline_2d_solver.cc 第 36 行定义.

38 : Spline2dSolver(t_knots, order) {}
Spline2dSolver(const std::vector< double > &t_knots, const uint32_t order)

成员函数说明

◆ mutable_constraint()

Spline2dConstraint * apollo::planning::OsqpSpline2dSolver::mutable_constraint ( )
overridevirtual

实现了 apollo::planning::Spline2dSolver.

在文件 osqp_spline_2d_solver.cc 第 48 行定义.

48 {
49 return &constraint_;
50}

◆ mutable_kernel()

Spline2dKernel * apollo::planning::OsqpSpline2dSolver::mutable_kernel ( )
overridevirtual

实现了 apollo::planning::Spline2dSolver.

在文件 osqp_spline_2d_solver.cc 第 52 行定义.

52{ return &kernel_; }

◆ mutable_spline()

Spline2d * apollo::planning::OsqpSpline2dSolver::mutable_spline ( )
overridevirtual

◆ Reset()

void apollo::planning::OsqpSpline2dSolver::Reset ( const std::vector< double > &  t_knots,
const uint32_t  order 
)
overridevirtual

实现了 apollo::planning::Spline2dSolver.

在文件 osqp_spline_2d_solver.cc 第 40 行定义.

41 {
42 spline_ = Spline2d(t_knots, order);
43 kernel_ = Spline2dKernel(t_knots, order);
44 constraint_ = Spline2dConstraint(t_knots, order);
45}

◆ Solve()

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

实现了 apollo::planning::Spline2dSolver.

在文件 osqp_spline_2d_solver.cc 第 56 行定义.

56 {
57 // Namings here are following osqp convention.
58 // For details, visit: https://osqp.org/docs/examples/demo.html
59
60 // change P to csc format
61 const MatrixXd& P = kernel_.kernel_matrix();
62 ADEBUG << "P: " << P.rows() << ", " << P.cols();
63 if (P.rows() == 0) {
64 return false;
65 }
66
67 std::vector<c_float> P_data;
68 std::vector<c_int> P_indices;
69 std::vector<c_int> P_indptr;
70 DenseToCSCMatrix(P, &P_data, &P_indices, &P_indptr);
71
72 // change A to csc format
73 const MatrixXd& inequality_constraint_matrix =
75 const MatrixXd& equality_constraint_matrix =
77 MatrixXd A(
78 inequality_constraint_matrix.rows() + equality_constraint_matrix.rows(),
79 inequality_constraint_matrix.cols());
80 A << inequality_constraint_matrix, equality_constraint_matrix;
81 ADEBUG << "A: " << A.rows() << ", " << A.cols();
82 if (A.rows() == 0) {
83 return false;
84 }
85
86 std::vector<c_float> A_data;
87 std::vector<c_int> A_indices;
88 std::vector<c_int> A_indptr;
89 DenseToCSCMatrix(A, &A_data, &A_indices, &A_indptr);
90
91 // set q, l, u: l < A < u
92 const MatrixXd& q_eigen = kernel_.offset();
93 c_float q[q_eigen.rows()]; // NOLINT
94 for (int i = 0; i < q_eigen.size(); ++i) {
95 q[i] = q_eigen(i);
96 }
97
98 const MatrixXd& inequality_constraint_boundary =
100 const MatrixXd& equality_constraint_boundary =
102
103 auto constraint_num = inequality_constraint_boundary.rows() +
104 equality_constraint_boundary.rows();
105
106 static constexpr float kEpsilon = 1e-9f;
107 static constexpr float kUpperLimit = 1e9f;
108 c_float l[constraint_num]; // NOLINT
109 c_float u[constraint_num]; // NOLINT
110 for (int i = 0; i < constraint_num; ++i) {
111 if (i < inequality_constraint_boundary.rows()) {
112 l[i] = inequality_constraint_boundary(i, 0);
113 u[i] = kUpperLimit;
114 } else {
115 const auto idx = i - inequality_constraint_boundary.rows();
116 l[i] = equality_constraint_boundary(idx, 0) - kEpsilon;
117 u[i] = equality_constraint_boundary(idx, 0) + kEpsilon;
118 }
119 }
120
121 // Problem settings
122 OSQPSettings* settings =
123 reinterpret_cast<OSQPSettings*>(c_malloc(sizeof(OSQPSettings)));
124
125 // Populate data
126 OSQPData* data = reinterpret_cast<OSQPData*>(c_malloc(sizeof(OSQPData)));
127 data->n = P.rows();
128 data->m = constraint_num;
129 data->P = csc_matrix(data->n, data->n, P_data.size(), P_data.data(),
130 P_indices.data(), P_indptr.data());
131 data->q = q;
132 data->A = csc_matrix(data->m, data->n, A_data.size(), A_data.data(),
133 A_indices.data(), A_indptr.data());
134 data->l = l;
135 data->u = u;
136
137 // Define Solver settings as default
138 osqp_set_default_settings(settings);
139 settings->alpha = 1.0; // Change alpha parameter
140 settings->eps_abs = 1.0e-05;
141 settings->eps_rel = 1.0e-05;
142 settings->max_iter = 5000;
143 settings->polish = true;
144 settings->verbose = FLAGS_enable_osqp_debug;
145
146 // Setup workspace
147 OSQPWorkspace* work = nullptr;
148 work = osqp_setup(data, settings);
149 // osqp_setup(&work, data, settings);
150
151 // Solve Problem
152 osqp_solve(work);
153
154 MatrixXd solved_params = MatrixXd::Zero(P.rows(), 1);
155 for (int i = 0; i < P.rows(); ++i) {
156 solved_params(i, 0) = work->solution->x[i];
157 }
158
159 last_num_param_ = static_cast<int>(P.rows());
160 last_num_constraint_ = static_cast<int>(constraint_num);
161
162 // Cleanup
163 osqp_cleanup(work);
164 c_free(data->A);
165 c_free(data->P);
166 c_free(data);
167 c_free(settings);
168
169 return spline_.set_splines(solved_params, spline_.spline_order());
170}
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
Eigen::MatrixXd kernel_matrix() const
const Eigen::MatrixXd offset() const
bool set_splines(const Eigen::MatrixXd &params, const uint32_t order)
: set splines
Definition spline_2d.cc:113
uint32_t spline_order() const
Definition spline_2d.cc:140
#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

◆ spline()

const Spline2d & apollo::planning::OsqpSpline2dSolver::spline ( ) const
overridevirtual

实现了 apollo::planning::Spline2dSolver.

在文件 osqp_spline_2d_solver.cc 第 173 行定义.

173{ return spline_; }

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