日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二次规划(QP)与OSQP求解器

發(fā)布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二次规划(QP)与OSQP求解器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

二次規(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)計后放好

#include "osqp.h"int main(int argc, char **argv) {// Load problem datac_float P_x[3] = { 4.0, 1.0, 2.0, };c_int P_nnz = 3;c_int P_i[3] = { 0, 0, 1, };c_int P_p[3] = { 0, 1, 3, };c_float q[2] = { 1.0, 1.0, };c_float A_x[4] = { 1.0, 1.0, 1.0, 1.0, }; //A的數(shù)據(jù),第1列(0,1行)對應(yīng)的非零元素為1.0,1.0,第2列(0,2行)對應(yīng)的非零元素為1.0,1.0。c_int A_nnz = 4; // 非零元素總數(shù)為4c_int A_i[4] = { 0, 1, 0, 2, }; // 第1列對應(yīng)的非零元素在0,1行,第2列對應(yīng)的非零元素在0,2行c_int A_p[3] = { 0, 2, 4, }; // 第i列的非零元素個數(shù)為A_p[i+1]-A_p[i], 如第0列非零元素個數(shù)為:2-0, 第1列非零元素個數(shù)為:4-2 c_float l[3] = { 1.0, 0.0, 0.0, };c_float u[3] = { 1.0, 0.7, 0.7, };c_int n = 2;c_int m = 3;// Exitflagc_int exitflag = 0;// Workspace structuresOSQPWorkspace *work;OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings));OSQPData *data = (OSQPData *)c_malloc(sizeof(OSQPData));// Populate dataif (data) {data->n = n;data->m = m;data->P = csc_matrix(data->n, data->n, P_nnz, P_x, P_i, P_p);data->q = q;data->A = csc_matrix(data->m, data->n, A_nnz, A_x, A_i, A_p);data->l = l;data->u = u;}// Define solver settings as defaultif (settings) osqp_set_default_settings(settings);// Setup workspaceexitflag = osqp_setup(&work, data, settings);// Solve Problemosqp_solve(work);// Clean workspaceosqp_cleanup(work);if (data) {if (data->A) c_free(data->A);if (data->P) c_free(data->P);c_free(data);}if (settings) c_free(settings);return exitflag; }

在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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。