osqp-eigen学习

OSQP文档学习
参考博客:
(1)二次规划(QP)与OSQP求解器
(2)如何使用OSQP-Eigen

osqp-eigen

1 osqp-eigen接口

以下列问题的求解为例:
在这里插入图片描述s.t. 1 ≤ x 1 ≤ 1.5 1≤x_1≤1.5 1x11.5 1 ≤ x 2 ≤ 1.5 1≤x_2≤1.5 1x21.5

mkdir -p catkin_ws/src
cd catkin_ws/src
catkin_init_workspace
catkin_create_pkg OSQP_Eigen roscpp std_msgs

main.cpp

// 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.txt

cmake_minimum_required(VERSION 3.0.2)
project(OSQP_Eigen)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(catkin REQUIRED COMPONENTSroscppstd_msgs
)include_directories(include${catkin_INCLUDE_DIRS}
)find_package(OsqpEigen)
find_package(Eigen3)link_directories(/usr/local/lib 
)include_directories(SYSTEM ${EIGEN3_INCLUDE_DIR})
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES planning
#  CATKIN_DEPENDS roscpp std_msgs
#  DEPENDS system_lib
)add_executable(OSQP src/main.cpp)
target_link_libraries(OSQP OsqpEigen::OsqpEigenlibosqp.so  libOsqpEigen.so libqdldl.so)

输出

QPSolution
1.0003
0.750274

2 如何使用OSQP-Eigen

上面主要介绍了用OSQP-Eigen的一般示例,下面给出几个典型不同约束的二次规划形式:
(1)具有线性约束的二次规划
在这里插入图片描述

#include "OsqpEigen/OsqpEigen.h"#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::SparseMatrix<double> hessian(2, 2);Eigen::VectorXd gradient(2);Eigen::SparseMatrix<double> linearMatrix(3, 2);Eigen::VectorXd lowerBound(3);Eigen::VectorXd upperBound(3);// 具有线性约束的二次规划hessian.insert(0, 0) = 1;hessian.insert(1, 0) = -1;hessian.insert(0, 1) = -1;hessian.insert(1, 1) = 2;gradient << -2, -6;linearMatrix.insert(0, 0) = 1;linearMatrix.insert(0, 1) = 1;linearMatrix.insert(1, 0) = -1;linearMatrix.insert(1, 1) = 2;linearMatrix.insert(2, 0) = 2;linearMatrix.insert(2, 1) = 1;lowerBound << -OsqpEigen::INFTY, -OsqpEigen::INFTY, -OsqpEigen::INFTY;upperBound << 2, 2, 3;OsqpEigen::Solver solver;solver.settings()->setVerbosity(false);solver.settings()->setWarmStart(true);solver.data()->setNumberOfVariables(2);//A矩阵的列数solver.data()->setNumberOfConstraints(3);//A矩阵的行数//设置P矩阵if (!solver.data()->setHessianMatrix(hessian)) return 1;//设置q or f矩阵if (!solver.data()->setGradient(gradient)) return 1;//设置线性约束的A矩阵if (!solver.data()->setLinearConstraintsMatrix(linearMatrix)) return 1;//设置下边界if (!solver.data()->setLowerBound(lowerBound)) return 1;//设置上边界if (!solver.data()->setUpperBound(upperBound)) return 1;if (!solver.initSolver()) return 1;Eigen::VectorXd QPSolution;if (!solver.solve()) return 1;// get the controller inputclock_t time_start = clock();clock_t time_end = clock();time_start = clock();QPSolution = solver.getSolution();time_end = clock();std::cout << "time use:" << 1000 * (time_end - time_start) / (double)CLOCKS_PER_SEC << "ms" << std::endl;std::cout << "QPSolution" << std::endl << QPSolution << std::endl;return 0;
}

输出:

time use:0.002ms
QPSolution0.6665
1.33322

(2)具有线性等式约束的二次规划
在这里插入图片描述

#include "OsqpEigen/OsqpEigen.h"#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::SparseMatrix<double> hessian(2, 2);Eigen::VectorXd gradient(2);Eigen::SparseMatrix<double> linearMatrix(1, 2);Eigen::VectorXd lowerBound(1);Eigen::VectorXd upperBound(1);// 具有线性等式约束的二次规划hessian.insert(0, 0) = 1;hessian.insert(1, 0) = -1;hessian.insert(0, 1) = -1;hessian.insert(1, 1) = 2;gradient << -2, -6;linearMatrix.insert(0,0) = 1;linearMatrix.insert(0,1) = 1;lowerBound << 0;upperBound << 0;OsqpEigen::Solver solver;solver.settings()->setVerbosity(false);solver.settings()->setWarmStart(true);solver.data()->setNumberOfVariables(2);solver.data()->setNumberOfConstraints(1);if (!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;if (!solver.initSolver()) return 1;Eigen::VectorXd QPSolution;if (!solver.solve()) return 1;// get the controller inputclock_t time_start = clock();clock_t time_end = clock();time_start = clock();QPSolution = solver.getSolution();time_end = clock();std::cout << "time use:" << 1000 * (time_end - time_start) / (double)CLOCKS_PER_SEC << "ms" << std::endl;std::cout << "QPSolution" << std::endl << QPSolution << std::endl;return 0;
}
time use:0.002ms
QPSolution
-0.8000020.800003

(3)具有线性约束和边界的二次最小化
在这里插入图片描述

#include "OsqpEigen/OsqpEigen.h"#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::SparseMatrix<double> hessian(3, 3);Eigen::VectorXd gradient(3);Eigen::SparseMatrix<double> linearMatrix(4, 3);Eigen::VectorXd lowerBound(4);Eigen::VectorXd upperBound(4);// 具有线性约束和边界的二次最小化hessian.insert(0,0) = 1;hessian.insert(1,0) = -1;hessian.insert(2,0) = 1;hessian.insert(0,1) = -1;hessian.insert(1,1) = 2;hessian.insert(2,1) = -2;hessian.insert(0,2) = 1;hessian.insert(1,2) = -2;hessian.insert(2,2) = 4;gradient << 2, -3, 1;linearMatrix.insert(0,0) = 1;linearMatrix.insert(1,0) = 0;linearMatrix.insert(2,0) = 0;linearMatrix.insert(3,0) = 1;linearMatrix.insert(0,1) = 0;linearMatrix.insert(1,1) = 1;linearMatrix.insert(2,1) = 0;linearMatrix.insert(3,1) = 1;linearMatrix.insert(0,2) = 0;linearMatrix.insert(1,2) = 0;linearMatrix.insert(2,2) = 1;linearMatrix.insert(3,2) = 1;lowerBound << 0, 0, 0, 0.5;upperBound << 1, 1, 1, 0.5;OsqpEigen::Solver solver;solver.settings()->setVerbosity(false);solver.settings()->setWarmStart(true);solver.data()->setNumberOfVariables(3);solver.data()->setNumberOfConstraints(4);if (!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;if (!solver.initSolver()) return 1;Eigen::VectorXd QPSolution;if (!solver.solve()) return 1;// get the controller inputclock_t time_start = clock();clock_t time_end = clock();time_start = clock();QPSolution = solver.getSolution();time_end = clock();std::cout << "time use:" << 1000 * (time_end - time_start) / (double)CLOCKS_PER_SEC << "ms" << std::endl;std::cout << "QPSolution" << std::endl << QPSolution << std::endl;return 0;
}
time use:0.003ms
QPSolution
7.42006e-120.5
1.09987e-11

本文详解了osqp-eigen的具体用法,方便自己日后回顾总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/691722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

毕业设计:基于知识图谱的《红楼梦》人物关系可视化

文章目录 项目介绍部署步骤项目运行 项目介绍 github地址&#xff1a;https://github.com/chizhu/KGQA_HLM?tabreadme-ov-file 基于知识图谱的《红楼梦》人物关系可视化&#xff1a;应该是重庆邮电大学林智敏同学的毕业设计&#xff0c;在学习知识图谱的过程中参考使用。 文…

专修戴尔R730xd服务器闪电灯 心跳亮黄灯故障

2024年开年第二天接到一个用户反馈说他公司有一台DELL PowerEdge R730xd服务器春节前由于市电问题意外断电关机了&#xff0c;刚好碰上春节就没去开机了&#xff0c;今天工厂开工服务器通电发现开不了机&#xff0c;且机器过了一会后报了2个黄灯错误&#xff0c;如下图&#xf…

proton.me邮箱

https://proton.me/ 我开发的chatgpt网站&#xff1a; https://chat.xutongbao.top/

软件代码写作要点

代码写得好不好,完全在于规划的好不好,那么流程图就显得十分的重要. 虽然大神都不用写流程图,对于复杂的流程,事前规划好流程图是必不可少的秘密. 流程图可以清晰的显示逻辑关系,以及逻辑是否有漏洞,简单清晰的流程图可以把复杂问题简单化,更有助于检测错误缺陷,对于代码技能…

重铸安卓荣光——上传图片组件

痛点&#xff1a; 公司打算做安卓软件&#xff0c;最近在研究安卓&#xff0c;打算先绘制样式 研究发现安卓并不像前端有那么多组件库&#xff0c;甚至有些基础的组件都需要自己实现&#xff0c;记录一下自己实现的组件 成品展示 一个上传图片的组件 可以选择拍照或者从相册中…

75.SpringMVC的拦截器和过滤器有什么区别?执行顺序?

75.SpringMVC的拦截器和过滤器有什么区别&#xff1f;执行顺序&#xff1f; 区别 拦截器不依赖与servlet容器&#xff0c;过滤器依赖与servlet容器。拦截器只能对action请求(DispatcherServlet 映射的请求)起作用&#xff0c;而过滤器则可以对几乎所有的请求起作用。拦截器可…

压缩感知——革新数据采集的科学魔法

引言&#xff1a; 在数字时代&#xff0c;数据以及数据的收集和处理无处不在。压缩感知(Compressed Sensing, CS)是一种新兴的数学框架&#xff0c;它挑战了我们传统上对数据采集和压缩的看法&#xff0c;给医学图像、天文观测、环境监测等领域带来了颠覆性的影响。但到底什么…

Leetcode日记 226. 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

Leetcode日记 226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 二叉树简介二叉树分类解题方法制作不易&#xff0c;感谢三连&#xff0c;谢谢啦 二叉树简介 二叉树&#xff08;Binary Tree&#xff09;是一种特殊的树形…

【Spring】循环依赖

目录标题 什么是循环依赖循环依赖场景Java SE 演示Spring 容器演示三级缓存核心知识三级缓存四大方法三级缓存中的迁移 三级缓存源码分析源码思维导图 源码图例课前问题推荐阅读 循环依赖是什么&#xff1f;循环依赖的场景有哪一些&#xff1f;三级缓存分别是什么&#xff1f;三…

openEuler学习——mysql(第一次总结)

1、openEuler 二进制方式安装MySQL 8.0.x。 思路是先从官网获取安装包链接如下https://mirrors.aliyun.com/mysql/MySQL-8.0/mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz 然后解压安装修改权限&#xff0c;可以参考mysql官方网站步骤 [rootopenEuler-node1 ~]# wget -c https:…

DS:循环队列的实现

创作不易&#xff0c;给个三连吧&#xff01;&#xff01; 一、前言 对于循环队列&#xff0c;博主也是源自于一道力扣的OJ题 力扣&#xff1a;循环队列的设置 后来我在网上查过&#xff0c;这个循环队列是有自己的应用场景的&#xff01;&#xff01;并不是出题者为了出题…

网络防火墙综合实验

备注&#xff1a;电信网段15.1.1.0 移动网段14.1.1.0 办公区 11.1.1.0 生产区 10.1.1.0 服务区 13.1.1.0 公网 1.1.1.1 和 2.2.2.2 需求&#xff1a; 1、办公区设备可以通过电信链路和移动链路上网&#xff08;多对多nat&#xff0c;并且需要保留一个公网ip&#xff09; 2、…

<网络安全>《40 网络攻防专业课<第六课 - 木马与防范>》

1 木马 1.1 木马简介 木马是攻击者编写的一段恶意代码&#xff0c;它潜伏在被攻击者的计算机中。攻击者通过这个代码可远程控制被攻击者的计算机&#xff0c;以窃取计算机上的信息或者操作计算机。从本质上讲&#xff0c;木马也是病毒的一种&#xff0c;因此不少用户也把木马…

代码随想录算法训练营DAY20 | 二叉树 (8)

一、LeetCode 701 二叉搜索树中的插入操作 题目链接&#xff1a; 701.二叉搜索树中的插入操作https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/ 思路&#xff1a;见缝插针罢辽。 class Solution {public TreeNode insertIntoBST(TreeNode root, i…

ChatGPT-01 用ChatGPT指令,自学任何领域的系统知识

1. 指令位置 Github仓库&#xff1a;Mr Ranedeer AI Tutor 但是需要开通chatgtp plus版本&#xff0c;并且打开代码解释器 2 使用 学习内容 开始学习 GPT甚至可以给你思考题&#xff0c;给出的答案还能进行评价 配置 通过配置表修改 深度 学习风格 沟通风格 语气风格 …

花费200元,我用全志H616和雪糕棒手搓了一台可UI交互的视觉循迹小车

常见的视觉循迹小车都具备有路径识别、轨迹跟踪、转向避障、自主决策等基本功能&#xff0c;如果不采用红外避障的方案&#xff0c;那么想要完全满足以上这些功能&#xff0c;摄像头、电机、传感器这类关键部件缺一不可&#xff0c;由此一来小车成本也就难以控制了。 但如果&a…

深度学习基础之《TensorFlow框架(3)—TensorBoard》

一、TensorBoard可视化学习 1、TensorFlow有一个亮点就是&#xff0c;我们能看到自己写的程序的可视化效果&#xff0c;这个功能就是TensorBoard 2、TensorFlow可用于训练大规模深度神经网络所需的计算&#xff0c;使用该工具涉及的计算往往复杂而深奥。为了方便TensorFlow程…

C++11---(2)

目录 一、新增容器 1.1、array 1.2、forward_list 1.3、unordered系列 二、右值引用和移动语义 2.1、什么是左值&#xff0c;什么是左值引用 2.2、什么是右值&#xff0c;什么是右值引用 2.3、左值引用和右值引用比较 2.4、右值引用使用场景和意义 2.5、右值引用引用…

EasyRecovery易恢复中文破解版2024最新破解序列号

EasyRecovery易恢复是一款来自美国的数据恢复软件&#xff0c;已有35年&#xff08;或38年&#xff09;的历史。它支持不同存储介质的数据恢复&#xff0c;包括电脑系统硬盘、移动硬盘等&#xff0c;并针对不同的数据丢失原因提供了相应的恢复方案。 EasyRecovery易恢复是一款功…

基于java的企业校园招聘平台的设计与实现

分享一个自己的毕业设计&#xff0c;想要获取源码的同学加V&#xff1a;qq2056908377 链接&#xff1a;https://pan.baidu.com/s/1It0CnXUvc9KVr1kDcHWvEw 提取码&#xff1a;1234 摘要&#xff1a; 摘要&#xff1a;本毕业设计旨在设计和实现一个企业校园招聘平台&#xf…