准备使用eigen opqp eigen-osqp matplotlib-cpp做一个关于自动驾驶planning模块基础算法的仿真工作,增强对算法和C++的掌握,记录一下第三方库的安装步骤。
1软件安装的概述
1.1ubuntu文件目录
/usr
:系统级的目录,可以理解为C:/Windows/
,
/usr/lib
理解为C:/Windows/System32
。
/usr/local
:用户级的程序目录,可以理解为C:/Progrem Files/
。用户自己编译的软件默认会安装到这个目录下。
/opt
:用户级的程序目录,可以理解为D:/Software
,opt
有可选的意思,这里可以用于放置第三方大型软件(或游戏),当你不需要时,直接rm -rf
掉即可。在硬盘容量不够时,也可将/opt单独挂载到其他磁盘上使用。
源码放哪里? /usr/src
:系统级的源码目录。 /usr/local/src
:用户级的源码目录。
1.2ubuntu软件安装
在linux开发中,我们经常需要安装一些第三方软件。
通常情况下,我们可以直接sudo apt-get install software_name 来安装一个软件,使用的安装目录如下:
下载的软件的存放位置:/var/cache/apt/archives
安装后软件的默认位置:/usr/share
可执行文件位置:/usr/bin
配置文件位置:/etc
lib文件位置:/usr/lib
但是在实际开发过程中,由于开发需求,我们需要对一些软件进行源码安装。
我们下载软件源码包并且解压后,通常都会发现解压目录中有configure文件,该文件里配置了编译的一些参数,如果没有特殊要求,我们只要执行如下命令,便可完成源码编译安装:
./configure
make
sudo make install
但是由于某些需求,我们需要把软件编码编译到一个指定的目录中,要想改变软件的安装目录,有以下几种方法可以实现:
1. 修改configure文件中prefix的值:
打开configure文件,然后找到prefix值,修改未prefix=你的安装目录,然后保存退出,再执行./configure & make & sudo make install就可以,不过该方法比较麻烦,会容易改动到configure文件的其他的参数,不建议使用。
2.执行configure文件时指定安装目录:
./configure --prefix=(指定的安装路径)
3.在make install指定DESTDIR参数:
./configure
make
make install DESTDIR= (指定的安装路径)
2.eigen的安装
//打开终端,进入/eigen-3.4.0文件夹,然后执行以下指令
mkdir build
cd build
cmake ..
sudo make install
3.osqp的安装
//获取源文件
git clone --recursive https://github.com/osqp/osqp
cd osqp
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIT=usr/local/osqp
sudo make install
source ~/.bashrc //刷新环境变量
4.eigen-osqp的安装
//打开终端,进入osqp-eigen文件夹,然后执行以下指令
$ mkdir build //然后创建build文件夹
$ cd build //再进入build文件夹
$ cmake .. -DCMAKE_INSTALL_PREFIT=usr/local/osqp-eigen
$ sudo make install
$ source ~/.bashrc //刷新环境变量
5.matplotlib的安装
pip3 intall matplotlib numpy
下载matplot-cpp,程序中包含matplotcpp.h即可
6.CMakelist
没有使用find_package,后面再研究研究
cmake_minimum_required(VERSION 3.0.2)
project(test)
#头文件目录
include_directories(
#由于eigen-osqp的头文件包含路径不完整,因此不能只写 /usr/local/include/
/usr/local/include/eigen3 #eigen3头文件目录
/usr/local/include/osqp #osqp头文件目录
/usr/local/include/matplotlibcpp #matplotlibcpp头文件目录
/usr/include/python3.6 #python3.6头文件目录
)
#库文件目录
link_directories(
/usr/local/lib #eigen3 osqp eigen-osqp 的动态链接库目录
/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu #pyheon的动态链接库目录
)
add_executable(test test.cpp )
target_link_libraries(test
libosqp.so
libOsqpEigen.so
libqdldl.so
libpython3.6.so
)
/*
1、<>先去系统目录中找头文件,如果没有在到当前目录下找。所以像标准的头文件 stdio.h和 stdlib.h等用这个方法。
2、""首先在当前目录下寻找,如果找不到,再到系统目录中寻找。 这个用于include自定义的头文件,让系统优先使用当前目录中定义的。
*/
#include <iostream>
//using Eigen::MatrixXd;
//此处包含路径都是相对于/usr/local/include/...
#include <eigen3/Eigen/Dense>
#include <osqp/osqp.h>
// osqp-eigen
#include <OsqpEigen/OsqpEigen.h>
#include <matplotlibcpp/matplotlibcpp.h>
using namespace Eigen;
using namespace Eigen::internal;
using namespace Eigen::Architecture;
using namespace std;
namespace plt = matplotlibcpp;
Eigen::SparseMatrix<double> hessian;
Eigen::VectorXd gradient;
Eigen::SparseMatrix<double> linearMatrix;
Eigen::VectorXd lowerBound;
Eigen::VectorXd upperBound;
int initMat(OsqpEigen::Solver& solver)
{
unsigned int numOfVar = 3;
unsigned int numOfCons = 4;
solver.data()->setNumberOfVariables(numOfVar);
solver.data()->setNumberOfConstraints(numOfCons);
hessian.resize(numOfVar, numOfVar);
gradient.resize(numOfVar);
linearMatrix.resize(numOfCons, numOfVar);
lowerBound.resize(numOfCons);
upperBound.resize(numOfCons);
hessian.insert(0, 0) = 1;
hessian.insert(0, 1) = -1;
hessian.insert(0, 2) = 1;
hessian.insert(1, 0) = -1;
hessian.insert(1, 1) = 2;
hessian.insert(1, 2) = -2;
hessian.insert(2, 0) = 1;
hessian.insert(2, 1) = -2;
hessian.insert(2, 2) = 4;
//cout << "hessian" << hessian << endl;
/* hessian << 1, -1, 1,
-1, 2, -2,
1, -2, 4;*/
gradient << 2, -3, 1;
linearMatrix.insert(0, 0) = 1;
linearMatrix.insert(1, 1) = 1;
linearMatrix.insert(2, 2) = 1;
linearMatrix.insert(3, 0) = 1;
linearMatrix.insert(3, 1) = 1;
linearMatrix.insert(3, 2) = 1;
/*linearMatrix << 1, 0, 0,
0, 1, 0,
0, 0, 1,
1, 1, 1;*/
lowerBound << 0, 0, 0, 0.5;
upperBound << 1, 1, 1, 0.5;
if (!solver.data()->setHessianMatrix(hessian)) return false;
if (!solver.data()->setGradient(gradient)) return false;
if (!solver.data()->setLinearConstraintsMatrix(linearMatrix)) return false;
if (!solver.data()->setLowerBound(lowerBound)) return false;
if (!solver.data()->setUpperBound(upperBound)) return false;
return true;
}
int main() {
OsqpEigen::Solver solver;
// set the solver
solver.settings()->setWarmStart(true);
// instantiate the solver
if (initMat(solver)) {
if (!solver.initSolver()) return 1;
}
else {
cout << "initilize QP solver failed" << endl;
return 1;
}
// solve
solver.solve();
Eigen::VectorXd QPSolution;
QPSolution = solver.getSolution();
cout << "x1 = " << QPSolution[0] << endl
<< "x2 = " << QPSolution[1] << endl
<< "x3 = " << QPSolution[2] << endl;
//matplotlib
plt::plot({1,3,2,4});
plt::show();
}
效果展示
7.IPOPT 安装
1.准备必要的库
sudo apt-get install gcc g++ gfortran git patch wget pkg-config liblapack-dev libmetis-dev
2.下载求解器
3.git并安装第三方库
//在ipopt文件夹下,安装第三方库
git clone https://github.com/coin-or-tools/ThirdParty-HSL.git
//将求解器copy到ThirdParty-HSL文件夹内,解压重命名为coinhsl
gunzip coinhsl-x.y.z.tar.gz
tar xf coinhsl-x.y.z.tar
ln -s coinhsl-x.y.z coinhsl
//在ThirdParty-HSL文件夹内,配置编译安装
./configure
make
make install
4.安装ipopt
mkdir build
cd build
make -j
make test
sudo make install
5.安装自动微分工具ADOL-C
安装ColPack
//安装Colpack
git clone http://github.com/CSCsw/ColPack.git
cd ColPack/build/automake
autoreconf -vif
mkdir build
cd build
../configure --prefix=usr/local
make -j
sudo make install
安装ADOL-c
git clone http://github.com/coin-or/ADOl-C.git
./configure prefix=usr/local
make -j
sudo make install
参考文献