27 const std::array<double, 3>& d_state,
const double delta_s,
28 const std::vector<std::pair<double, double>>& d_bounds) {
29 std::vector<c_float> P_data;
30 std::vector<c_int> P_indices;
31 std::vector<c_int> P_indptr;
32 CalculateKernel(d_bounds, &P_data, &P_indices, &P_indptr);
34 const int num_var =
static_cast<int>(d_bounds.size());
35 const int kNumParam = 3 *
static_cast<int>(d_bounds.size());
36 const int kNumConstraint = kNumParam + 3 * (num_var - 1) + 3;
37 c_float lower_bounds[kNumConstraint];
38 c_float upper_bounds[kNumConstraint];
40 const int prime_offset = num_var;
41 const int pprime_offset = 2 * num_var;
43 std::vector<std::vector<std::pair<c_int, c_float>>> columns;
44 columns.resize(kNumParam);
46 int constraint_index = 0;
49 for (
int i = 0; i + 1 < num_var; ++i) {
50 columns[pprime_offset + i].emplace_back(constraint_index, -1.0);
51 columns[pprime_offset + i + 1].emplace_back(constraint_index, 1.0);
53 lower_bounds[constraint_index] =
54 -FLAGS_lateral_third_order_derivative_max *
delta_s_;
55 upper_bounds[constraint_index] =
56 FLAGS_lateral_third_order_derivative_max *
delta_s_;
61 for (
int i = 0; i + 1 < num_var; ++i) {
62 columns[prime_offset + i].emplace_back(constraint_index, -1.0);
63 columns[prime_offset + i + 1].emplace_back(constraint_index, 1.0);
64 columns[pprime_offset + i].emplace_back(constraint_index, -0.5 *
delta_s_);
65 columns[pprime_offset + i + 1].emplace_back(constraint_index,
68 lower_bounds[constraint_index] = 0.0;
69 upper_bounds[constraint_index] = 0.0;
74 for (
int i = 0; i + 1 < num_var; ++i) {
75 columns[i].emplace_back(constraint_index, -1.0);
76 columns[i + 1].emplace_back(constraint_index, 1.0);
77 columns[prime_offset + i].emplace_back(constraint_index, -
delta_s_);
78 columns[pprime_offset + i].emplace_back(constraint_index,
80 columns[pprime_offset + i + 1].emplace_back(constraint_index,
83 lower_bounds[constraint_index] = 0.0;
84 upper_bounds[constraint_index] = 0.0;
88 columns[0].emplace_back(constraint_index, 1.0);
89 lower_bounds[constraint_index] = d_state[0];
90 upper_bounds[constraint_index] = d_state[0];
93 columns[prime_offset].emplace_back(constraint_index, 1.0);
94 lower_bounds[constraint_index] = d_state[1];
95 upper_bounds[constraint_index] = d_state[1];
98 columns[pprime_offset].emplace_back(constraint_index, 1.0);
99 lower_bounds[constraint_index] = d_state[2];
100 upper_bounds[constraint_index] = d_state[2];
103 const double LARGE_VALUE = 2.0;
104 for (
int i = 0; i < kNumParam; ++i) {
105 columns[i].emplace_back(constraint_index, 1.0);
107 lower_bounds[constraint_index] = d_bounds[i].first;
108 upper_bounds[constraint_index] = d_bounds[i].second;
110 lower_bounds[constraint_index] = -LARGE_VALUE;
111 upper_bounds[constraint_index] = LARGE_VALUE;
116 CHECK_EQ(constraint_index, kNumConstraint);
119 std::vector<c_float> A_data;
120 std::vector<c_int> A_indices;
121 std::vector<c_int> A_indptr;
123 for (
int j = 0; j < kNumParam; ++j) {
124 A_indptr.push_back(ind_p);
125 for (
const auto& row_data_pair : columns[j]) {
126 A_data.push_back(row_data_pair.second);
127 A_indices.push_back(row_data_pair.first);
131 A_indptr.push_back(ind_p);
135 for (
int i = 0; i < kNumParam; ++i) {
137 q[i] = -2.0 * FLAGS_weight_lateral_obstacle_distance *
138 (d_bounds[i].first + d_bounds[i].second);
145 OSQPSettings* settings =
146 reinterpret_cast<OSQPSettings*
>(c_malloc(
sizeof(OSQPSettings)));
149 osqp_set_default_settings(settings);
150 settings->alpha = 1.0;
151 settings->eps_abs = 1.0e-05;
152 settings->eps_rel = 1.0e-05;
153 settings->max_iter = 5000;
154 settings->polish =
true;
155 settings->verbose = FLAGS_enable_osqp_debug;
158 OSQPData* data =
reinterpret_cast<OSQPData*
>(c_malloc(
sizeof(OSQPData)));
160 data->m = kNumConstraint;
161 data->P = csc_matrix(data->n, data->n, P_data.size(), P_data.data(),
162 P_indices.data(), P_indptr.data());
164 data->A = csc_matrix(data->m, data->n, A_data.size(), A_data.data(),
165 A_indices.data(), A_indptr.data());
166 data->l = lower_bounds;
167 data->u = upper_bounds;
170 OSQPWorkspace* work =
nullptr;
172 work = osqp_setup(data, settings);
178 for (
int i = 0; i < num_var; ++i) {
179 opt_d_.push_back(work->solution->x[i]);