二次规划(QP)与OSQP求解器
目錄
二次規(guī)劃(QP)
OSQP 求解器
OSQP-eigen接口
二次規(guī)劃(QP)
優(yōu)化在很多領(lǐng)域都發(fā)揮著重要應(yīng)用,其中自動駕駛的運動規(guī)劃可以看做一個優(yōu)化問題,根據(jù)實際情況進行合理簡化和建模。
一個優(yōu)化問題包含:優(yōu)化目標和約束條件(包含等式約束、不等式約束)。
常見的凸優(yōu)化問題的標準形式如下:
如果約束條件或目標函數(shù)包含非線性,則為非線性優(yōu)化。二次規(guī)劃是一種特殊的非線性規(guī)劃,也是標準的凸優(yōu)化問題,能夠快速求解。
在路徑/軌跡優(yōu)化中經(jīng)常建模為二次優(yōu)化問題進行求解,很多MPC的求解過程也是轉(zhuǎn)化為序列二次規(guī)劃進行求解。
二次優(yōu)化的標準形式為:
關(guān)于二次項系數(shù)的正定性,以及優(yōu)化理論的剖析,此處暫不做探討,可以閱讀參考文獻,待了解更加深入后再進行補充。
OSQP 求解器
OSQP官網(wǎng)以及github
c接口,采用csc矩陣
按列壓縮CSC—Compressed sparse column
顧名思義將每一列出現(xiàn)的非零元素的個數(shù)統(tǒng)計后放好
在OSQP中, 對上述所數(shù)據(jù)用結(jié)構(gòu)體OSQPData進行封裝, 其定義如下. 其中??和??都以稀疏矩陣CSC的形式進行存儲.
// the location of file: /usr/local/include/osqp/types.h typedef struct {c_int n; ///< number of variables nc_int m; ///< number of constraints mcsc *P; ///< the upper triangular part of the quadratic cost matrix Pcsc *A; ///< linear constraints matrix A in csc format (size m x n)c_float *q; ///< dense array for linear part of cost function (size n)c_float *l; ///< dense array for lower bound (size m)c_float *u; ///< dense array for upper bound (size m) } OSQPData;CMakeList.txt
cmake_minimum_required(VERSION 3.10)# set the project name project(OSQP)# add the executable add_executable(OSQP osqp_example.c)# Find OSQP library and headers find_package(osqp REQUIRED)# Link the OSQP shared library target_link_libraries(OSQP PRIVATE osqp::osqp)?運行結(jié)果如下:
OSQP-eigen接口
除此之外,有兩個推薦的第三方維護的接口:google的osqp-cpp與Giulio Romualdi的osqp-eigen.?
以osqp-eigen為例(通常有固定的代碼書寫流程)
以下列問題的求解為例:?
??
// osqp-eigen #include "OsqpEigen/OsqpEigen.h"// eigen #include <Eigen/Dense> #include <iostream>int main() {// allocate QP problem matrices and vectoresEigen::SparseMatrix<double> hessian(2, 2); //P: n*n正定矩陣,必須為稀疏矩陣SparseMatrixEigen::VectorXd gradient(2); //Q: n*1向量Eigen::SparseMatrix<double> linearMatrix(2, 2); //A: m*n矩陣,必須為稀疏矩陣SparseMatrixEigen::VectorXd lowerBound(2); //L: m*1下限向量Eigen::VectorXd upperBound(2); //U: m*1上限向量hessian.insert(0, 0) = 2.0; //注意稀疏矩陣的初始化方式,無法使用<<初始化hessian.insert(1, 1) = 2.0;// std::cout << "hessian:" << std::endl// << hessian << std::endl;gradient << -2, -2;linearMatrix.insert(0, 0) = 1.0; //注意稀疏矩陣的初始化方式,無法使用<<初始化linearMatrix.insert(1, 1) = 1.0;// std::cout << "linearMatrix:" << std::endl// << linearMatrix << std::endl;lowerBound << 1, 1;upperBound << 1.5, 1.5;// instantiate the solverOsqpEigen::Solver solver;// settingssolver.settings()->setVerbosity(false);solver.settings()->setWarmStart(true);// set the initial data of the QP solversolver.data()->setNumberOfVariables(2); //變量數(shù)nsolver.data()->setNumberOfConstraints(2); //約束數(shù)mif (!solver.data()->setHessianMatrix(hessian))return 1;if (!solver.data()->setGradient(gradient))return 1;if (!solver.data()->setLinearConstraintsMatrix(linearMatrix))return 1;if (!solver.data()->setLowerBound(lowerBound))return 1;if (!solver.data()->setUpperBound(upperBound))return 1;// instantiate the solverif (!solver.initSolver())return 1;Eigen::VectorXd QPSolution;// solve the QP problemif (!solver.solve()){return 1;}QPSolution = solver.getSolution();std::cout << "QPSolution" << std::endl<< QPSolution << std::endl; //輸出為m*1的向量return 0; }CMakeList文件內(nèi)容:
cmake_minimum_required(VERSION 3.1)set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON)project(OSQP_test LANGUAGES CXX)find_package(OsqpEigen) find_package(Eigen3)include_directories(SYSTEM ${EIGEN3_INCLUDE_DIR})#MPCExample add_executable(OSQP_test main.cpp)target_link_libraries(OSQP_test OsqpEigen::OsqpEigen)這篇文章只是簡單介紹了二次規(guī)劃的思想和OSQP的代碼流程,希望后面能結(jié)合實際的路徑/軌跡優(yōu)化問題,進行實踐驗證。
參考鏈接:
自動駕駛規(guī)劃中使用OSQP進行二次規(guī)劃 - 知乎
OSQP使用說明 - 知乎
使用OSQP解決二次凸優(yōu)化(QP)問題_首飛愛玩機器人的博客-CSDN博客_osqp庫
Apollo 6.0 QP(二次規(guī)劃)算法解析 - 知乎
Apollo MPC OSQP Solver_cyytum的博客-CSDN博客_mpc osqp求解器
OSQP solver documentation — OSQP documentation
凸優(yōu)化筆記(3)Quadratic Programming簡介 - 知乎
二次規(guī)劃 | 機器之心
osqp-eigen使用記錄_Oxalate-c的博客-CSDN博客_osqp-eigen
利用OSQP庫計算標準二次規(guī)劃(QP)問題的實例 - Challenging-eXtraordinary
總結(jié)
以上是生活随笔為你收集整理的二次规划(QP)与OSQP求解器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle rman备份和还原恢复数据
- 下一篇: 终极算法——序