二次规划(QP)与OSQP求解器
目录
二次规划(QP)
OSQP 求解器
OSQP-eigen接口
二次规划(QP)
优化在很多领域都发挥着重要应用,其中自动驾驶的运动规划可以看做一个优化问题,根据实际情况进行合理简化和建模。
一个优化问题包含:优化目标和约束条件(包含等式约束、不等式约束)。
常见的凸优化问题的标准形式如下:
如果约束条件或目标函数包含非线性,则为非线性优化。二次规划是一种特殊的非线性规划,也是标准的凸优化问题,能够快速求解。
在路径/轨迹优化中经常建模为二次优化问题进行求解,很多MPC的求解过程也是转化为序列二次规划进行求解。
二次优化的标准形式为:
关于二次项系数的正定性,以及优化理论的剖析,此处暂不做探讨,可以阅读参考文献,待了解更加深入后再进行补充。
OSQP 求解器
OSQP官网以及github
c接口,采用csc矩阵
按列压缩CSC—Compressed sparse column
顾名思义将每一列出现的非零元素的个数统计后放好
#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的数据,第1列(0,1行)对应的非零元素为1.0,1.0,第2列(0,2行)对应的非零元素为1.0,1.0。c_int A_nnz = 4; // 非零元素总数为4c_int A_i[4] = { 0, 1, 0, 2, }; // 第1列对应的非零元素在0,1行,第2列对应的非零元素在0,2行c_int A_p[3] = { 0, 2, 4, }; // 第i列的非零元素个数为A_p[i+1]-A_p[i], 如第0列非零元素个数为:2-0, 第1列非零元素个数为: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中, 对上述所数据用结构体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)
运行结果如下:
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); //变量数nsolver.data()->setNumberOfConstraints(2); //约束数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文件内容:
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)
这篇文章只是简单介绍了二次规划的思想和OSQP的代码流程,希望后面能结合实际的路径/轨迹优化问题,进行实践验证。
参考链接:
自动驾驶规划中使用OSQP进行二次规划 - 知乎
OSQP使用说明 - 知乎
使用OSQP解决二次凸优化(QP)问题_首飞爱玩机器人的博客-CSDN博客_osqp库
Apollo 6.0 QP(二次规划)算法解析 - 知乎
Apollo MPC OSQP Solver_cyytum的博客-CSDN博客_mpc osqp求解器
OSQP solver documentation — OSQP documentation
凸优化笔记(3)Quadratic Programming简介 - 知乎
二次规划 | 机器之心
osqp-eigen使用记录_Oxalate-c的博客-CSDN博客_osqp-eigen
利用OSQP库计算标准二次规划(QP)问题的实例 - Challenging-eXtraordinary
二次规划(QP)与OSQP求解器相关推荐
- 非线性求解器Casadi使用简介
非线性求解器Casadi使用简介 Casadi做为一款非线性求解器,支持python.C++.matlab等多种语言,能够解决非常多的工程问题.具体使用请参考casadi官方使用文档. 使用Casad ...
- 非线性优化求解器IPOPT
目录 1.IPOPT的安装(简洁版本) 2.IPOPT测试案例 3.ADOL-C的使用 4.CppAD的使用 5.IPOPT的initial gauss 以及 warm star 参考链接: 优化,在 ...
- 市面上的数学规划求解器都有哪些?
运筹学从形成到发展,在此过程中积累的大量理论和方法在国防.能源.制造.交通.金融.通信等各个领域发挥着越来越重要的作用.我们在生产生活中遇到的很多实际问题,都可以通过运筹学所涉及的优化方法对其进行数学 ...
- c++调用cplex求解例子_视频教程 | 用Python玩转运筹优化求解器IBM CPLEX(二)
编者按 优化求解器对于做运筹学应用的学生来说,意义重大. 然而直到今天,放眼望去,全网(包括墙外)几乎没有一个系统的Cplex中文求解器教程. 作为华人运筹学的最大的社区,『运筹OR帷幄』 责无旁贷, ...
- 求解器:助力智能决策的利器
在工业化发展进程中,底层基础技术和软件的发展非常重要,这其中有一项技术被认为是运筹优化领域的"皇冠"--求解器. 求解器技术属于典型的底层技术领域,技术门槛高.研发难度大.投入时间 ...
- lingo与matlab用哪个?matlab能代替lingo吗?非线性规划求解器Lingo,Matlab使用心得
对于非线性规划,Cplex 与Gurobi只支持二次规划(包括凸规划,二阶锥规划,目标函数或约束条件中可以包含二次函数).若更高次数,或者非凸规划,非二阶锥规划,则需要用其他求解器了.matlab 自 ...
- NVIDIA GPU上的直接线性求解器
NVIDIA GPU上的直接线性求解器 NVIDIA cuSOLVER库提供了密集且稀疏的直接线性求解器和本征求解器的集合,它们为计算机视觉,CFD,计算化学和线性优化应用程序提供了显着的加速.cuS ...
- 使用 Python 和 OpenCV 构建 SET 求解器
作者 | 小白 来源 | 小白学视觉 小伙伴们玩过 SET 吗?SET 是一种游戏,玩家在指定的时间竞相识别出十二张独特纸牌中的三张纸牌(或 SET)的模式.每张 SET 卡都有四个属性:形状.阴影/ ...
- 组合求解器 + 深度学习 =?这篇ICLR 2020论文告诉你答案
2020-01-26 20:17:46 选自TowadsDataScience 作者:Marin Vlastelica Pogančić 机器之心编译 参与:郭元晨.魔王 如何将组合求解器无缝融入深度 ...
- java怎么使用log函数_在使用couenne求解器的spyder中使用logof函数
我在一个简单的MINLP模型中有以下约束: model.cm2=Constraint(expr = model.xB2 == log(1.0+model.xA2)) 当我调用bonmin(来自AMPL ...
最新文章
- 牛客竞赛36签到题A(思维)
- web.xml 配置 contextConfigLocation
- jQuery Event.delegateTarget 属性详解
- win 8.1 安装framework3.5
- h2 mysql mode_H2 数据库快速入门
- python路径怎么查看_:怎么查看python的安装路径
- 快速注册认证小程序,三分钟学会免300元认证企业小程序
- 美国LangeEylandt长岛
- Cloudflare CNAME 接入满血复活,一分钱不用花!
- optaplanner学习笔记(六)使用Solver求解器
- win10虚拟机环境下运行驱动程序
- CCIE实验笔记之---第1章WAN协议(HDLC)
- 流程表结构设计第一版
- *** Cisco路由器
- 建立桌面文件管理格子_让你的电脑桌面井井有条,3款桌面整理工具推荐
- IEEE免费论文下载
- STC89C52上的读写MMA7455程序
- FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)
- 光学共焦显微技术part 1
- Retrofit(一)