一旺坠、OSQP與osqp-eigen
1.1 OSQP
OSQP是一種二次規(guī)劃求解器乔遮,可用求解線性組合或二次規(guī)劃問(wèn)題,在同類問(wèn)題中求解效率極高取刃!
OSQP官網(wǎng):https://osqp.org/蹋肮,其C語(yǔ)言版本由oxford大學(xué)開(kāi)發(fā)出刷。
其特點(diǎn)如下:
- Efficient:采用了
ADMM-based first-order
算法. - Robust:只需要問(wèn)題本身為凸即可, 對(duì)問(wèn)題數(shù)據(jù)無(wú)要求.
- Free:Apache 2.0 license
- Embaddable:生成嵌入式 C 代碼, 不需要管理內(nèi)存.
- Interface:多語(yǔ)言,跨平臺(tái),支持 Matlab, Python, R, Julia
- Library-Free:無(wú)需安裝依賴.
-
同類性能 bechmark 如下圖
1.2 C++接口
OSQP是用純C實(shí)現(xiàn)的,但是純C中對(duì)于矩陣和向量的操作不是特別友好坯辩,因此為了更方便使用OSQP馁龟,在構(gòu)造C++接口時(shí),引入了Eigen庫(kù)漆魔,方便矩陣和向量的操作坷檩。
注意官方支持python和matlab,但是無(wú) C++ 接口改抡,但給出兩個(gè)推薦的第三方社區(qū)維護(hù)的接口
- google 的
osqp-cpp
:https://github.com/google/osqp-cpp - Giulio Romualdi的
osqp-eigen
:https://github.com/robotology/osqp-eigen
osqp-cpp
與osqp-eigen
類似矢炼, 區(qū)別如下:
- license:osqp-cpp 為 MIT(最寬松),osqp-eigen 為 LGPL(傳染式開(kāi)源)
- dependency:兩者除都依賴 Eigen 以外, osqp-cpp 依賴 google 自家的 abseil-cpp 庫(kù)阿纤,osqp-eigen 沒(méi)有其他依賴句灌。
推薦使用osqp-eigen
作為osqp
的C++接口
1.3 osqp-eigen介紹
(1) osqp-eigen
軟件組織形式:
(2) 相關(guān)類
osqp-eigen
主要是構(gòu)造了三個(gè)類,Data類欠拾、Setting類胰锌、Solver類:
- Data類:對(duì)C語(yǔ)言O(shè)SQP中的OSQPData(struct)進(jìn)行包裝
- Setting類:對(duì)C語(yǔ)言O(shè)SQP中的OSQPSetting(struct)進(jìn)行包裝
- Solver類:對(duì)C語(yǔ)言O(shè)SQP中的OSQPWorkspace(struct)進(jìn)行包裝
(3) 求解過(guò)程
- 1.創(chuàng)建求解器Solver的實(shí)例
- 2.設(shè)置Setting參數(shù)
- 3.設(shè)置Data參數(shù)
- 4.初始化求解器Solver
- 5.求解優(yōu)化問(wèn)題
- 6.提取最優(yōu)解
osqp-eigen
求解過(guò)程對(duì)應(yīng)代碼如下:
二、osqp-eigen的安裝與使用
本文主要介紹OSQP的C++接口藐窄,即OSQP和osqp-eigen
安裝與使用方法匕荸。
2.1 OSQP安裝
OSQP安裝很簡(jiǎn)單,直接把github的庫(kù)拉下來(lái)編譯枷邪,安裝即可。
git clone --recursive https://github.com/osqp/osqp
cd osqp
mkdir build
cd build
cmake .. -DBUILD_SHARED_LIBS=ON
make
sudo make install
注意:如果不將OSQPsudo make install
到系統(tǒng)目錄下诺凡,則需要修改osqp-eigen
的CMakeLists.txt文件东揣,手動(dòng)找到OSQP庫(kù)的位置,建議執(zhí)行安裝命令腹泌。
2.2 OSQP測(cè)試
OSQP內(nèi)置demo
示例嘶卧,可以進(jìn)入build/
下進(jìn)行測(cè)試
該demo
位于~/osqp/build/out/
路徑下
直接在終端中運(yùn)行
./osqp_demo
osqp_demo
終端輸出結(jié)果
2.3 osqp-eigen安裝
osqp-eigen依賴eigen3,ubuntu系統(tǒng)里內(nèi)置安裝了eigen3包凉袱。
查看是否安裝了eigen3
locate eigen3
osqp-eigen源碼編譯安裝
git clone https://github.com/robotology/osqp-eigen.git
cd osqp-eigen
mkdir build
cd build
cmake .. #默認(rèn)安裝在/usr/local/include中,非apt安裝的包芥吟,不在/usr/include/下,而是/usr/local/include下
make
sudo make install
注意:如果不將osqp-eigen sudo make install
到系統(tǒng)目錄下专甩,則需要修改自己的CMakeLists.txt文件钟鸵,手動(dòng)找到osqp-eigen
庫(kù)的位置,建議執(zhí)行安裝命令涤躲。
2.4 osqp-eigen測(cè)試
osqp-eigen內(nèi)置example
示例棺耍,但該示例未與osqp-eigen同時(shí)編譯,需要單獨(dú)編譯种樱,該example
位于~/osqp-eigen/example
路徑
編譯
cd
osqp-eigen/example
mkdir build
cd build
cmake ..
make
編譯完后蒙袍,在終端中運(yùn)行
./MPCExample
MPCExample
終端輸出結(jié)果
2.5 CMake工程中調(diào)用osqp-eigen
與調(diào)用其它庫(kù)類似俊卤,需要三個(gè)部分,分別是(1)在頭文件中包含osqp-eigen的頭文件害幅,(2)在cpp文件中實(shí)例化osqp-eigen中對(duì)應(yīng)的類消恍,(3)在CMakeLists.txt文件中添加osqp-eigen庫(kù)路徑。
(1) 頭文件
// eigen庫(kù)
#include <Eigen/Dense>
// osqp-eigen庫(kù)
#include "OsqpEigen/OsqpEigen.h"
(2) cpp文件
(3) CMakeLists.txt文件
cmake_minimum_required(VERSION 3.0)
project(myproject)
find_package(OsqpEigen REQUIRED)
add_executable(example example.cpp)
target_link_libraries(example OsqpEigen::OsqpEigen)