目录

二次规划(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求解器相关推荐

  1. 非线性求解器Casadi使用简介

    非线性求解器Casadi使用简介 Casadi做为一款非线性求解器,支持python.C++.matlab等多种语言,能够解决非常多的工程问题.具体使用请参考casadi官方使用文档. 使用Casad ...

  2. 非线性优化求解器IPOPT

    目录 1.IPOPT的安装(简洁版本) 2.IPOPT测试案例 3.ADOL-C的使用 4.CppAD的使用 5.IPOPT的initial gauss 以及 warm star 参考链接: 优化,在 ...

  3. 市面上的数学规划求解器都有哪些?

    运筹学从形成到发展,在此过程中积累的大量理论和方法在国防.能源.制造.交通.金融.通信等各个领域发挥着越来越重要的作用.我们在生产生活中遇到的很多实际问题,都可以通过运筹学所涉及的优化方法对其进行数学 ...

  4. c++调用cplex求解例子_视频教程 | 用Python玩转运筹优化求解器IBM CPLEX(二)

    编者按 优化求解器对于做运筹学应用的学生来说,意义重大. 然而直到今天,放眼望去,全网(包括墙外)几乎没有一个系统的Cplex中文求解器教程. 作为华人运筹学的最大的社区,『运筹OR帷幄』 责无旁贷, ...

  5. 求解器:助力智能决策的利器

    在工业化发展进程中,底层基础技术和软件的发展非常重要,这其中有一项技术被认为是运筹优化领域的"皇冠"--求解器. 求解器技术属于典型的底层技术领域,技术门槛高.研发难度大.投入时间 ...

  6. lingo与matlab用哪个?matlab能代替lingo吗?非线性规划求解器Lingo,Matlab使用心得

    对于非线性规划,Cplex 与Gurobi只支持二次规划(包括凸规划,二阶锥规划,目标函数或约束条件中可以包含二次函数).若更高次数,或者非凸规划,非二阶锥规划,则需要用其他求解器了.matlab 自 ...

  7. NVIDIA GPU上的直接线性求解器

    NVIDIA GPU上的直接线性求解器 NVIDIA cuSOLVER库提供了密集且稀疏的直接线性求解器和本征求解器的集合,它们为计算机视觉,CFD,计算化学和线性优化应用程序提供了显着的加速.cuS ...

  8. 使用 Python 和 OpenCV 构建 SET 求解器

    作者 | 小白 来源 | 小白学视觉 小伙伴们玩过 SET 吗?SET 是一种游戏,玩家在指定的时间竞相识别出十二张独特纸牌中的三张纸牌(或 SET)的模式.每张 SET 卡都有四个属性:形状.阴影/ ...

  9. 组合求解器 + 深度学习 =?这篇ICLR 2020论文告诉你答案

    2020-01-26 20:17:46 选自TowadsDataScience 作者:Marin Vlastelica Pogančić 机器之心编译 参与:郭元晨.魔王 如何将组合求解器无缝融入深度 ...

  10. java怎么使用log函数_在使用couenne求解器的spyder中使用logof函数

    我在一个简单的MINLP模型中有以下约束: model.cm2=Constraint(expr = model.xB2 == log(1.0+model.xA2)) 当我调用bonmin(来自AMPL ...

最新文章

  1. 牛客竞赛36签到题A(思维)
  2. web.xml 配置 contextConfigLocation
  3. jQuery Event.delegateTarget 属性详解
  4. win 8.1 安装framework3.5
  5. h2 mysql mode_H2 数据库快速入门
  6. python路径怎么查看_:怎么查看python的安装路径
  7. 快速注册认证小程序,三分钟学会免300元认证企业小程序
  8. 美国LangeEylandt长岛
  9. Cloudflare CNAME 接入满血复活,一分钱不用花!
  10. optaplanner学习笔记(六)使用Solver求解器
  11. win10虚拟机环境下运行驱动程序
  12. CCIE实验笔记之---第1章WAN协议(HDLC)
  13. 流程表结构设计第一版
  14. *** Cisco路由器
  15. 建立桌面文件管理格子_让你的电脑桌面井井有条,3款桌面整理工具推荐
  16. IEEE免费论文下载
  17. STC89C52上的读写MMA7455程序
  18. FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)
  19. 光学共焦显微技术part 1
  20. Retrofit(一)

热门文章

  1. 整理电力系统GPS时间同步装置(GPS对时系统)孤岛方案
  2. android GPS驱动
  3. PADS2007无模命令与快捷键
  4. 计算机三级数据库考试题型,计算机三级数据库技术考试习题及答案
  5. 博客样式-bbsmax4风格V0.2
  6. CSS小技巧---半透明边框
  7. 一文了解 操作系统发展史
  8. 庆祝新文章在《网管员世界》发表
  9. 《高性能MYSQL》
  10. Adobe Fireworks CS4 序列号(注册码)