Современный, легкий вес, основанный на собственном интерфейсе C ++ для нелинейных решателей программирования, таких как iPopt и Snopt.
Пример нелинейной проблемы оптимизации для решения, определяется как:
Особенности • Установка • Примеры • Внести свой вклад • Публикации • Авторы
Сочетает преимущества iPopt / snopt и собственного значения:
| Ipopt / snopt | Собственное |
|---|---|
| ✔ Высококачественные решатели для нелинейной оптимизации | ✔ Современные интуитивно понятные составы векторов и матриц |
| C ++ API неудобный и подверженным ошибкам (необработанные указатели, управление индексом, Jacobian Construction) | ✔ Высокоэффективные реализации |
| Связывание и экспорт сложно |
find_package(ifopt) или Catkin/ros (необязательно) Проблема оптимизации состоит из нескольких независимых переменных и наборов ограничений . Каждый набор представляет общую концепцию, например, набор переменных может представлять коэффициенты сплайны, другие позиции шага. Точно так же группы набора ограничений схожие ограничения вместе. ifopt позволяет пользователям определять каждый из этих наборов независимо в отдельных классах, а затем строит общую проблему из этих наборов. (Больше не волнует индексы адаптации при добавлении или удалении наборов).
find x0, x1 (variable-sets 0 & 1)
s.t
x0_lower <= x0 <= x0_upper (bounds on variable-set x0 in R^2)
{x0,x1} = arg min c0(x0,x1)+c1(x0,x1) (cost-terms 0 and 1)
g0_lower < g0(x0,x1) < g0_upper (constraint-set 0 in R^2)
g1_lower < g1(x0,x1) < g0_upper (constraint-set 1 in R^1)
Предоставление производной информации значительно увеличивает скорость решения. ifopt позволяет определить производную каждого набора затрат/ограничения по отношению к каждому набору переменной . Это гарантирует, что когда порядок изменений переменных изменений в общем векторе, эта производная информация все еще является действительной. Эти «якобианские блоки» должны быть поставлены через ConstraintSet::FillJacobianBlock() , а затем используются для построения полного якобиана для стоимости и ограничений.
Графический обзор как UML можно увидеть здесь.
Самый простой способ установить - это двоичные файлы ROS, и все готово!
sudo apt-get install ros-<distro>-ifopt
Если вы не используете ROS или двоичные файлы для вашего дистрибутива, вы можете легко построить эти пакеты из источника. Для этого установите требуемые зависимости Cmake, собственные и iPopt с использованием
sudo apt-get install cmake libeigen3-dev coinor-libipopt-dev
Если вы хотите ссылаться на локальную установку iPopt или Snopt, см. Здесь.
Установить
git clone https://github.com/ethz-adrl/ifopt.git && cd ifopt
mkdir build && cd build
cmake ..
make
sudo make install # copies files in this folder to /usr/local/*
# sudo xargs rm < install_manifest.txt # in case you want to uninstall the aboveИспользуйте: для использования в вашем проекте Cmake см. Этот минимальный cmakelists.txt :
find_package (ifopt)
# Formulate (ifopt:ifopt_core) and solve (ifopt::ifopt_ipopt) the problem
add_executable (main main.cpp)
# Pull in include directories, libraries, ...
target_link_libraries (main PUBLIC ifopt::ifopt_ipopt) Установка: скачать инструменты командной строки Catkin или Catkin, затем:
cd catkin_ws/src
git clone https://github.com/ethz-adrl/ifopt.git
cd ..
catkin_make_isolated # `catkin build` if you are using catkin command-line tools
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 # plain 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, с несколькими наборами переменных и ограничений для генерации движений для ножных роботов создает следующее:
Нам нравится запрос на вывод, будь то интерфейсы на дополнительные решатели, исправления ошибок, модульные тесты или обновлять документацию. Пожалуйста, посмотрите на Appling.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}
}
Исследовательский проект, в рамках которого был разработан этот код:
Александр В. Винклер - начальная работа/сопровождающий
Это было выполнено в следующих учреждениях:
Если вы строите из источника и хотите использовать локально установленную версию 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 routines are faster (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 через EG
export SNOPT_DIR=/home/your_name/Code/Snoptи запустить Cmake как
cmake -DBUILD_SNOPT=ON ..