一个现代的、轻量的基于 Eigen 的 C++ 接口,用于非线性编程求解器,如 Ipopt 和 Snopt。
一个需要解决的非线性优化问题示例如下所示:
- 要查看如何公式化此问题,请参见 test_vars_constr_cost.h。
- 之后可以使用例如 Ipopt 求解问题,如 ex_test_ipopt.cc 所示。
功能
Ipopt / Snopt | Eigen |
---|---|
:heavy_check_mark: 非线性优化的高质量求解器 | :heavy_check_mark: 现代化、直观的向量和矩阵公式 |
:x: C++ API 不便且易出错(原始指针、索引管理、雅可比矩阵构建) | :heavy_check_mark: 高效实现 |
:x: 链接和导出困难 |
- 使用 Eigen 的求解器独立变量和约束公式(高效)
- 通过公式自动管理索引 变量和约束集
- 集成:纯 cmake
find_package(ifopt)
或 catkin/ROS(可选) - 轻量级(大约 2k 行代码),易于使用和扩展
优化问题由多个独立的变量和约束集组成。每个集代表一个常见的概念,例如,一组变量可能代表样条曲线系数,另一组代表步伐位置。类似地,约束集将相似的约束组合在一起。 ifopt
允许用户在独立的类中定义这些集合,然后从这些集合构建整体问题。(无需再担心添加或删除集合时适应索引)。
求解 x0, x1 (变量集 0 和 1)
满足
x0_lower <= x0 <= x0_upper (变量集 x0 的边界 \in R^2)
{x0,x1} = arg min c0(x0,x1)+c1(x0,x1) (成本项 0 和 1)
g0_lower < g0(x0,x1) < g0_upper (约束集 0 \in R^2)
g1_lower < g1(x0,x1) < g0_upper (约束集 1 \in R^1)
提供导数信息可以大大提高求解速度。 ifopt
允许独立定义每个成本项/约束集相对于每个变量集的导数。这确保了当整体向量中变量集的顺序发生变化时,此导数信息仍然有效。这些“雅可比块”必须通过 ConstraintSet::FillJacobianBlock()
提供,然后用于构建成本和约束的完整雅可比矩阵。
作为 UML 的图形概述可以在 这里 查看。
安装
最简单的安装方式是通过 ROS 二进制文件,你就搞定了!
sudo apt-get install ros-<发行版>-ifopt
安装依赖项
如果您不使用 ROS 或者二进制文件不存在用于您的发行版,您可以很容易地从源代码构建这些包。为此,需要安装所需的依赖项 Cmake, Eigen 和 Ipopt,使用以下命令:
sudo apt-get install cmake libeigen3-dev coinor-libipopt-dev
如果您想链接到 Ipopt 或 Snopt 的本地安装,请参见 这里。
使用cmake构建
-
安装
git clone https://github.com/ethz-adrl/ifopt.git && cd ifopt mkdir build && cd build cmake .. make sudo make install # 将当前文件夹下的文件复制到 /usr/local/* # sudo xargs rm < install_manifest.txt # 如果你想卸载上述内容
-
使用:在你的cmake项目中使用,请参考以下最小的 CMakeLists.txt:
find_package(ifopt) # 公式化(ifopt:ifopt_core)并解决问题(ifopt::ifopt_ipopt) add_executable(main main.cpp) # 引入包含目录、库,... target_link_libraries(main PUBLIC ifopt::ifopt_ipopt)
使用catkin构建
-
安装: 下载 catkin 或 catkin command line tools,然后:
cd catkin_ws/src git clone https://github.com/ethz-adrl/ifopt.git cd .. catkin_make_isolated # 如果你使用的是catkin命令行工具,可以使用 `catkin build` source ./devel/setup.bash
-
使用:在你的catkin项目中添加到 CMakeLists.txt 中
add_compile_options(-std=c++11) find_package(catkin COMPONENTS ifopt) include_directories(${catkin_INCLUDE_DIRS}) target_link_libraries(foo ${catkin_LIBRARIES})
在你的 package.xml 中添加以下内容:
<package> <depend>ifopt</depend> </package>
示例
单元测试 & 简单问题
导航到含有 Makefile
的构建文件夹,这取决于你如何构建代码:
cd ifopt/build # 纯 cmake
cd catkin_ws/build_isolated/ifopt/devel # catkin_make_isolated
cd catkin_ws/build/ifopt # catkin build
通过运行 test
目标确保一切正确安装
make test
你应该看到 ifopt_ipopt-example....Passed
(或snopt,如果已安装)以及 ifopt_core-test
,如果安装了 gtest。
如果你正确安装并链接了IPOPT,还可以直接运行 二进制示例 (再一次,先导航到含有 Makefile
的构建文件夹)
make test ARGS='-R ifopt_ipopt-example -V'
输出:
1.0 0.0
towr
一个更复杂的问题,取自towr,包含多个变量和约束集以生成腿式机器人的运动,产生以下结果:
贡献
我们欢迎拉取请求,无论是接口的额外求解器、bug修复、单元测试还是更新文档。有关更多信息,请查看 CONTRIBUTING.md。 请查看此处参与项目的 贡献者名单。
发表文章
如果你使用了此工作,请考虑以下引用方式:
@misc{ifopt,
author = {Alexander W Winkler},
title = {{Ifopt - A modern, light-weight, Eigen-based C++ interface to
Nonlinear Programming solvers Ipopt and Snopt.}},
year = 2018,
doi = {10.5281/zenodo.1135046},
url = {https://doi.org/10.5281/zenodo.1135046}
}
开发此代码的研究项目:
- A. W. Winkler, D. Bellicoso, M. Hutter, J. Buchli, 通过基于相位的末端执行器参数优化腿式系统的步态和轨迹,IEEE机器人与自动化快报 (RA-L),2018年:
作者
Alexander W. Winkler - 初始工作/维护者
这项工作在以下机构进行:
其他信息
链接到自定义Ipopt或Snopt
如果你是从源码构建,并且想要使用本地安装的Ipopt版本,请将Ipopt构建文件夹的路径添加到你的 ~/.bashrc
中,例如
export IPOPT_DIR=/home/your_name/Code/Ipopt-3.12.8/build
如果你的操作系统没有提供预编译二进制文件或者所需版本,也可以按照此处描述的方式轻松地从源码安装Ipopt。可能以下概要对你有用:
wget https://www.coin-or.org/download/source/Ipopt/Ipopt-3.11.10.zip
unzip Ipopt-3.11.10.zip
cd Ipopt-3.11.10/ThirdParty/Mumps
./get.Mumps # HSL 例程更快 (http://www.hsl.rl.ac.uk/ipopt/)
cd ../../
mkdir build && cd build
../configure --prefix=/usr/local
make
make test
make install
export IPOPT_DIR=`pwd`
如果需要 Snopt 的接口,通过例如如下方式来指向cmake中的构建文件夹在你的 ~/.bashrc
中
export SNOPT_DIR=/home/your_name/Code/Snopt
并运行cmake,如
cmake -DBUILD_SNOPT=ON ..