Casadi库C++运行速度比python版本慢解决方法
casadi库是一个用来做符号运算的库,https://web.casadi.org/,并在底层对一些优化器做了接口封装。可以用于机器人运动学与动力学或其他优化问题。
当使用cpp版本的时候,会意外发现比python版本慢了许多(一倍以上)。这是因为底层依赖版本的缘故。如果没有必要的原因,建议就使用python版本的casadi。
但如果有必要一定要用cpp版本,可以参考我这篇文章。不过没有太多第三方库编译经验的朋友不要轻易尝试。
踩坑记录
这个库默认编译时是不包含ipopt库的,但如果要用这个求解器,需要先下载安装。
这是一种下载方法(但请先不要下,因为下到的版本会比较老影响运行速度。而新的版本要更新的ubuntu才能支持)
sudo apt-get install -y coinor-libipopt-dev coinor-libipopt1v5
对于ubuntu22.04系统,这样可以下到ipopt,但速度会比python版本慢。这个ipopt的版本是3.11.9,而python版本下到的ipopt的版本是3.14.17,对应还有mumps的版本是5.7.3。
查看mumps版本方法:
dpkg -l | grep libmumps
conda list | grep mumps
源码编译:
在下载好casadi的C++库后,通过cmake编译时有这些选项要注意:
sudo apt install gcc g++ gfortran git cmake liblapack-dev pkg-config swig --install-recommends
cmake -DWITH_PYTHON=ON -DWITH_IPOPT=ON -DWITH_OPENMP=ON -DWITH_THREAD=ON -DWITH_LAPACK=ON -DWITH_BUILD_IPOPT=ON -DWITH_BUILD_MUMPS=ON -DWITH_BUILD_METIS=ON -DWITH_BUILD_LAPACK=ON ..
- -DWITH_IPOPT=ON 代表同时编译ipopt的接口
- -DWITH_BUILD_XX意为下载XX源码进行编译,例如-DWITH_BUILD_IPOPT=ON,-DWITH_BUILD_MUMPS=ON
- 在casadi的源码最外层CMakelists中,
set(BUILD_MUMPS_TP_VERSION "releases/3.0.2" CACHE STRING "Tag/branch/hash to be used for BUILD_MUMPS_TP_GIT_REPO")
这里需要改成3.0.9(即mumps版本为5.7.3) ——这个注意可以后期改成更高的版本,低版本速度会有问题。- -DWITH_LAPACK=ON,-DWITH_BUILD_LAPACK: 这两项的作用是和openblas有关。blas是一个数学运算库,而openblas则是升级版。如果不装这两项,运行时会有问题:Cannot call restoration phase at point that is almost feasible for the restoration NLP (violation 0.000000e+00).
Abort in line search due to no other fall back.
Step computation in the restoration phase failed.- 我们可以通过ldd指令,来查看libipopt.so所链接到的库。如果有一项libopenblas.so.0,则是有问题的。应该是链接到libcasadi-tp-openblas.so.0才对。