Skip to content

Commit 4fcb2ae

Browse files
Revert "feat(path_optimizer): additional failure logging and failure mode han…"
This reverts commit 30880cc.
1 parent 30880cc commit 4fcb2ae

File tree

16 files changed

+96
-399
lines changed

16 files changed

+96
-399
lines changed

common/osqp_interface/design/osqp_interface-design.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ The interface can be used in several ways:
5454

5555
```cpp
5656
std::tuple<std::vector<double>, std::vector<double>> result = osqp_interface.optimize();
57-
std::vector<double> param = result.primal_solution;
57+
std::vector<double> param = std::get<0>(result);
5858
double x_0 = param[0];
5959
double x_1 = param[1];
6060
```

common/osqp_interface/include/osqp_interface/csc_matrix_conv.hpp

-38
Original file line numberDiff line numberDiff line change
@@ -37,44 +37,6 @@ struct OSQP_INTERFACE_PUBLIC CSC_Matrix
3737
std::vector<c_int> m_row_idxs;
3838
/// Vector of 'val' indices where each column starts. Ex: [0, 2, 4] (Eigen: 'outer')
3939
std::vector<c_int> m_col_idxs;
40-
41-
friend std::ostream & operator<<(std::ostream & os, const CSC_Matrix & matrix)
42-
{
43-
os << "CSC_Matrix: {\n";
44-
os << "\tm_vals: [";
45-
46-
// Iterator-based loop for m_vals
47-
for (auto it = std::begin(matrix.m_vals); it != std::end(matrix.m_vals); ++it) {
48-
os << *it; // Print the current element (dereference iterator)
49-
if (std::next(it) != std::end(matrix.m_vals)) { // Check if not the last element
50-
os << ", ";
51-
}
52-
}
53-
os << "],\n";
54-
55-
os << "\tm_row_idxs: [";
56-
// Iterator-based loop for m_row_idxs
57-
for (auto it = std::begin(matrix.m_row_idxs); it != std::end(matrix.m_row_idxs); ++it) {
58-
os << *it;
59-
if (std::next(it) != std::end(matrix.m_row_idxs)) {
60-
os << ", ";
61-
}
62-
}
63-
os << "],\n";
64-
65-
os << "\tm_col_idxs: [";
66-
// Iterator-based loop for m_col_idxs
67-
for (auto it = std::begin(matrix.m_col_idxs); it != std::end(matrix.m_col_idxs); ++it) {
68-
os << *it;
69-
if (std::next(it) != std::end(matrix.m_col_idxs)) {
70-
os << ", ";
71-
}
72-
}
73-
os << "]\n";
74-
75-
os << "}\n";
76-
return os;
77-
}
7840
};
7941

8042
/// \brief Calculate CSC matrix from Eigen matrix

common/osqp_interface/include/osqp_interface/osqp_interface.hpp

+5-15
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,6 @@ namespace osqp
3636
{
3737
constexpr c_float INF = 1e30;
3838

39-
struct OSQPResult
40-
{
41-
std::vector<double> primal_solution;
42-
std::vector<double> lagrange_multipliers;
43-
int polish_status;
44-
int solution_status;
45-
int iteration_status;
46-
int exit_flag;
47-
};
48-
4939
/**
5040
* Implementation of a native C++ interface for the OSQP solver.
5141
*
@@ -66,7 +56,7 @@ class OSQP_INTERFACE_PUBLIC OSQPInterface
6656
int64_t m_exitflag;
6757

6858
// Runs the solver on the stored problem.
69-
OSQPResult solve();
59+
std::tuple<std::vector<double>, std::vector<double>, int64_t, int64_t, int64_t> solve();
7060

7161
static void OSQPWorkspaceDeleter(OSQPWorkspace * ptr) noexcept;
7262

@@ -107,10 +97,10 @@ class OSQP_INTERFACE_PUBLIC OSQPInterface
10797
/// \details std::tuple<std::vector<double>, std::vector<double>> result;
10898
/// \details result = osqp_interface.optimize();
10999
/// \details 4. Access the optimized parameters.
110-
/// \details std::vector<float> param = result.primal_solution;
100+
/// \details std::vector<float> param = std::get<0>(result);
111101
/// \details double x_0 = param[0];
112102
/// \details double x_1 = param[1];
113-
OSQPResult optimize();
103+
std::tuple<std::vector<double>, std::vector<double>, int64_t, int64_t, int64_t> optimize();
114104

115105
/// \brief Solves convex quadratic programs (QPs) using the OSQP solver.
116106
/// \return The function returns a tuple containing the solution as two float vectors.
@@ -125,10 +115,10 @@ class OSQP_INTERFACE_PUBLIC OSQPInterface
125115
/// \details std::tuple<std::vector<double>, std::vector<double>> result;
126116
/// \details result = osqp_interface.optimize(P, A, q, l, u, 1e-6);
127117
/// \details 4. Access the optimized parameters.
128-
/// \details std::vector<float> param = result.primal_solution;
118+
/// \details std::vector<float> param = std::get<0>(result);
129119
/// \details double x_0 = param[0];
130120
/// \details double x_1 = param[1];
131-
OSQPResult optimize(
121+
std::tuple<std::vector<double>, std::vector<double>, int64_t, int64_t, int64_t> optimize(
132122
const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector<double> & q,
133123
const std::vector<double> & l, const std::vector<double> & u);
134124

common/osqp_interface/src/osqp_interface.cpp

+12-14
Original file line numberDiff line numberDiff line change
@@ -363,10 +363,11 @@ int64_t OSQPInterface::initializeProblem(
363363
return m_exitflag;
364364
}
365365

366-
OSQPResult OSQPInterface::solve()
366+
std::tuple<std::vector<double>, std::vector<double>, int64_t, int64_t, int64_t>
367+
OSQPInterface::solve()
367368
{
368369
// Solve Problem
369-
int32_t exit_flag = osqp_solve(m_work.get());
370+
osqp_solve(m_work.get());
370371

371372
/********************
372373
* EXTRACT SOLUTION
@@ -381,36 +382,33 @@ OSQPResult OSQPInterface::solve()
381382
int64_t status_iteration = m_work->info->iter;
382383

383384
// Result tuple
384-
OSQPResult result;
385-
386-
result.primal_solution = sol_primal;
387-
result.lagrange_multipliers = sol_lagrange_multiplier;
388-
result.polish_status = status_polish;
389-
result.solution_status = status_solution;
390-
result.iteration_status = status_iteration;
391-
result.exit_flag = exit_flag;
385+
std::tuple<std::vector<double>, std::vector<double>, int64_t, int64_t, int64_t> result =
386+
std::make_tuple(
387+
sol_primal, sol_lagrange_multiplier, status_polish, status_solution, status_iteration);
392388

393389
m_latest_work_info = *(m_work->info);
394390

395391
return result;
396392
}
397393

398-
OSQPResult OSQPInterface::optimize()
394+
std::tuple<std::vector<double>, std::vector<double>, int64_t, int64_t, int64_t>
395+
OSQPInterface::optimize()
399396
{
400397
// Run the solver on the stored problem representation.
401-
OSQPResult result = solve();
398+
std::tuple<std::vector<double>, std::vector<double>, int64_t, int64_t, int64_t> result = solve();
402399
return result;
403400
}
404401

405-
OSQPResult OSQPInterface::optimize(
402+
std::tuple<std::vector<double>, std::vector<double>, int64_t, int64_t, int64_t>
403+
OSQPInterface::optimize(
406404
const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector<double> & q,
407405
const std::vector<double> & l, const std::vector<double> & u)
408406
{
409407
// Allocate memory for problem
410408
initializeProblem(P, A, q, l, u);
411409

412410
// Run the solver on the stored problem representation.
413-
OSQPResult result = solve();
411+
std::tuple<std::vector<double>, std::vector<double>, int64_t, int64_t, int64_t> result = solve();
414412

415413
m_work.reset();
416414
m_work_initialized = false;

common/osqp_interface/test/test_osqp_interface.cpp

+28-26
Original file line numberDiff line numberDiff line change
@@ -44,24 +44,25 @@ TEST(TestOsqpInterface, BasicQp)
4444
using autoware::common::osqp::calCSCMatrixTrapezoidal;
4545
using autoware::common::osqp::CSC_Matrix;
4646

47-
auto check_result = [](const autoware::common::osqp::OSQPResult & result) {
48-
EXPECT_EQ(result.polish_status, 1); // polish succeeded
49-
EXPECT_EQ(result.solution_status, 1); // solution succeeded
50-
51-
static const auto ep = 1.0e-8;
52-
53-
const auto prime_val = result.primal_solution;
54-
ASSERT_EQ(prime_val.size(), size_t(2));
55-
EXPECT_NEAR(prime_val[0], 0.3, ep);
56-
EXPECT_NEAR(prime_val[1], 0.7, ep);
57-
58-
const auto dual_val = result.lagrange_multipliers;
59-
ASSERT_EQ(dual_val.size(), size_t(4));
60-
EXPECT_NEAR(dual_val[0], -2.9, ep);
61-
EXPECT_NEAR(dual_val[1], 0.0, ep);
62-
EXPECT_NEAR(dual_val[2], 0.2, ep);
63-
EXPECT_NEAR(dual_val[3], 0.0, ep);
64-
};
47+
auto check_result =
48+
[](const std::tuple<std::vector<double>, std::vector<double>, int, int, int> & result) {
49+
EXPECT_EQ(std::get<2>(result), 1); // polish succeeded
50+
EXPECT_EQ(std::get<3>(result), 1); // solution succeeded
51+
52+
static const auto ep = 1.0e-8;
53+
54+
const auto prime_val = std::get<0>(result);
55+
ASSERT_EQ(prime_val.size(), size_t(2));
56+
EXPECT_NEAR(prime_val[0], 0.3, ep);
57+
EXPECT_NEAR(prime_val[1], 0.7, ep);
58+
59+
const auto dual_val = std::get<1>(result);
60+
ASSERT_EQ(dual_val.size(), size_t(4));
61+
EXPECT_NEAR(dual_val[0], -2.9, ep);
62+
EXPECT_NEAR(dual_val[1], 0.0, ep);
63+
EXPECT_NEAR(dual_val[2], 0.2, ep);
64+
EXPECT_NEAR(dual_val[3], 0.0, ep);
65+
};
6566

6667
const Eigen::MatrixXd P = (Eigen::MatrixXd(2, 2) << 4, 1, 1, 2).finished();
6768
const Eigen::MatrixXd A = (Eigen::MatrixXd(4, 2) << 1, 1, 1, 0, 0, 1, 0, 1).finished();
@@ -72,19 +73,20 @@ TEST(TestOsqpInterface, BasicQp)
7273
{
7374
// Define problem during optimization
7475
autoware::common::osqp::OSQPInterface osqp;
75-
autoware::common::osqp::OSQPResult result = osqp.optimize(P, A, q, l, u);
76+
std::tuple<std::vector<double>, std::vector<double>, int, int, int> result =
77+
osqp.optimize(P, A, q, l, u);
7678
check_result(result);
7779
}
7880

7981
{
8082
// Define problem during initialization
8183
autoware::common::osqp::OSQPInterface osqp(P, A, q, l, u, 1e-6);
82-
autoware::common::osqp::OSQPResult result = osqp.optimize();
84+
std::tuple<std::vector<double>, std::vector<double>, int, int, int> result = osqp.optimize();
8385
check_result(result);
8486
}
8587

8688
{
87-
autoware::common::osqp::OSQPResult result;
89+
std::tuple<std::vector<double>, std::vector<double>, int, int, int> result;
8890
// Dummy initial problem
8991
Eigen::MatrixXd P_ini = Eigen::MatrixXd::Zero(2, 2);
9092
Eigen::MatrixXd A_ini = Eigen::MatrixXd::Zero(4, 2);
@@ -105,12 +107,12 @@ TEST(TestOsqpInterface, BasicQp)
105107
CSC_Matrix P_csc = calCSCMatrixTrapezoidal(P);
106108
CSC_Matrix A_csc = calCSCMatrix(A);
107109
autoware::common::osqp::OSQPInterface osqp(P_csc, A_csc, q, l, u, 1e-6);
108-
autoware::common::osqp::OSQPResult result = osqp.optimize();
110+
std::tuple<std::vector<double>, std::vector<double>, int, int, int> result = osqp.optimize();
109111
check_result(result);
110112
}
111113

112114
{
113-
autoware::common::osqp::OSQPResult result;
115+
std::tuple<std::vector<double>, std::vector<double>, int, int, int> result;
114116
// Dummy initial problem with csc matrix
115117
CSC_Matrix P_ini_csc = calCSCMatrixTrapezoidal(Eigen::MatrixXd::Zero(2, 2));
116118
CSC_Matrix A_ini_csc = calCSCMatrix(Eigen::MatrixXd::Zero(4, 2));
@@ -130,7 +132,7 @@ TEST(TestOsqpInterface, BasicQp)
130132

131133
// add warm startup
132134
{
133-
autoware::common::osqp::OSQPResult result;
135+
std::tuple<std::vector<double>, std::vector<double>, int, int, int> result;
134136
// Dummy initial problem with csc matrix
135137
CSC_Matrix P_ini_csc = calCSCMatrixTrapezoidal(Eigen::MatrixXd::Zero(2, 2));
136138
CSC_Matrix A_ini_csc = calCSCMatrix(Eigen::MatrixXd::Zero(4, 2));
@@ -148,8 +150,8 @@ TEST(TestOsqpInterface, BasicQp)
148150
check_result(result);
149151

150152
osqp.updateCheckTermination(1);
151-
const auto primal_val = result.primal_solution;
152-
const auto dual_val = result.lagrange_multipliers;
153+
const auto primal_val = std::get<0>(result);
154+
const auto dual_val = std::get<1>(result);
153155
for (size_t i = 0; i < primal_val.size(); ++i) {
154156
std::cerr << primal_val.at(i) << std::endl;
155157
}

control/autoware_mpc_lateral_controller/src/qp_solver/qp_solver_osqp.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,11 @@ bool QPSolverOSQP::solve(
5454
/* execute optimization */
5555
auto result = osqpsolver_.optimize(h_mat, osqpA, f, lower_bound, upper_bound);
5656

57-
std::vector<double> U_osqp = result.primal_solution;
57+
std::vector<double> U_osqp = std::get<0>(result);
5858
u = Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, 1>>(
5959
&U_osqp[0], static_cast<Eigen::Index>(U_osqp.size()), 1);
6060

61-
const int status_val = result.solution_status;
61+
const int status_val = std::get<3>(result);
6262
if (status_val != 1) {
6363
RCLCPP_WARN(logger_, "optimization failed : %s", osqpsolver_.getStatusMessage().c_str());
6464
return false;
@@ -71,7 +71,7 @@ bool QPSolverOSQP::solve(
7171
}
7272

7373
// polish status: successful (1), unperformed (0), (-1) unsuccessful
74-
int status_polish = result.polish_status;
74+
int status_polish = std::get<2>(result);
7575
if (status_polish == -1 || status_polish == 0) {
7676
const auto s = (status_polish == 0) ? "Polish process is not performed in osqp."
7777
: "Polish process failed in osqp.";

planning/autoware_obstacle_cruise_planner/src/optimization_based_planner/velocity_optimizer.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -244,11 +244,10 @@ VelocityOptimizer::OptimizationResult VelocityOptimizer::optimize(const Optimiza
244244
}
245245

246246
// execute optimization
247-
const autoware::common::osqp::OSQPResult result =
248-
qp_solver_.optimize(P, A, q, lower_bound, upper_bound);
249-
const std::vector<double> optval = result.primal_solution;
247+
const auto result = qp_solver_.optimize(P, A, q, lower_bound, upper_bound);
248+
const std::vector<double> optval = std::get<0>(result);
250249

251-
const int status_val = result.solution_status;
250+
const int status_val = std::get<3>(result);
252251
if (status_val != 1)
253252
std::cerr << "optimization failed : " << qp_solver_.getStatusMessage().c_str() << std::endl;
254253

0 commit comments

Comments
 (0)