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才对。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐