Une interface C ++ moderne, léger et propre à des solveurs de programmation non linéaire, tels que IPOPT et SNOPT.
Un exemple de problème d'optimisation non linéaire à résoudre est défini comme:
Caractéristiques • Installation • Exemples • Contribuer • Publications • Auteurs
Combine les avantages de IPOPT / SNOPT et Eigen:
| Ipopt / snopt | Propre |
|---|---|
| ✔️ Solants de haute qualité pour l'optimisation non linéaire | ✔️ Formulations modernes et intuitives de vecteurs et matrices |
| API C ++ Inconvénients et sujets aux erreurs (pointeurs bruts, gestion de l'index, construction jacobienne) | ✔️ Implémentations très efficaces |
| lier et exporter difficile |
find_package(ifopt) ou catkin / ros (facultatif) Un problème d'optimisation se compose de plusieurs ensembles de variables et de contraintes indépendants . Chaque ensemble représente un concept commun, par exemple un ensemble de variables pourrait représenter des coefficients spline, une autre position de pas. De même, un ensemble de contraintes regroupe des contraintes similaires ensemble. ifopt permet aux utilisateurs de définir chacun de ces ensembles indépendamment dans des classes séparées, puis construit le problème global de ces ensembles. (Plus d'indices d'adaptation inquiétants lors de l'ajout ou de la suppression des ensembles).
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)
La fourniture d'informations dérivées augmente considérablement la vitesse de la solution. ifopt permet de définir la dérivée de chaque ensemble coût-terme / contrainte par rapport à chaque ensemble de variables indépendamment . Cela garantit que lorsque l'ordre des ensembles variables change dans le vecteur global, ces informations dérivées sont toujours valides. Ces "blocs jacobiens" doivent être fournis via ConstraintSet::FillJacobianBlock() et sont ensuite utilisés pour construire le Jacobian complet pour le coût et les contraintes.
Un aperçu graphique comme UML peut être vu ici.
La façon la plus simple d'installer est à travers les binaires ROS et vous êtes prêt!
sudo apt-get install ros-<distro>-ifopt
Dans le cas où vous n'utilisez pas ROS ou les binaires n'existent pas pour votre distribution, vous pouvez facilement construire ces packages à partir de Source. Pour cela, installez les dépendances requises CMake, Eigen et IPOPT en utilisant
sudo apt-get install cmake libeigen3-dev coinor-libipopt-dev
Si vous souhaitez créer un lien vers une installation locale d'IPOPT ou de Snopt, consultez ici.
Installer
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 aboveUtilisation: pour utiliser dans votre projet CMake, consultez ce CMakelists minimal.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) Installer: Téléchargez les outils de ligne de commande Catkin ou Catkin, alors:
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.bashUtilisation: inclure dans votre projet Catkin en ajoutant à votre cMakelists.txt
add_compile_options (-std=c++11)
find_package (catkin COMPONENTS ifopt)
include_directories ( ${catkin_INCLUDE_DIRS} )
target_link_libraries (foo ${catkin_LIBRARIES} )Ajoutez ce qui suit à votre package.xml :
< package >
< depend >ifopt</ depend >
</ package > Accédez à votre dossier de construction dans lequel réside le Makefile , qui dépend de la façon dont vous avez construit le code:
cd ifopt/build # plain cmake
cd catkin_ws/build_isolated/ifopt/devel # catkin_make_isolated
cd catkin_ws/build/ifopt # catkin build Assurez-vous que tout est installé correctement en exécutant la cible test
make test Vous devriez voir ifopt_ipopt-example....Passed (ou snopt si installé) ainsi que ifopt_core-test si GTEST est installé.
Si vous avez IPOPT installé et lié correctement, vous pouvez également exécuter directement l'exemple binaire (encore une fois, accédez d'abord au dossier de construction avec le Makefile )
make test ARGS= ' -R ifopt_ipopt-example -V 'Sortir:
1.0 0.0Un problème plus impliqué, tiré de TOWR, avec plusieurs ensembles de variables et de contraintes pour générer des mouvements pour les robots à pattes produit ce qui suit:
Nous aimons la demande de traction, que ce soit ses interfaces à des solveurs supplémentaires, des corrections de bogues, des tests unitaires ou à la mise à jour de la documentation. Veuillez jeter un œil à contribuer.md pour plus d'informations. Voir ici la liste des contributeurs qui ont participé à ce projet.
Si vous utilisez ce travail, veuillez envisager de citer comme suit:
@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}
}
Le projet de recherche dans lequel ce code a été développé:
Alexander W. Winkler - Travail initial / responsable
Cela a été réalisé dans les institutions suivantes:
Si vous construisez à partir de Source et que vous souhaitez utiliser une version installée localement d'IPOPT, ajoutez le chemin à votre dossier à votre dossier de construction IPOPT à votre ~/.bashrc , par exemple
export IPOPT_DIR=/home/your_name/Code/Ipopt-3.12.8/buildDans le cas où votre système d'exploitation ne fournit pas les binaires précompilés ou la version requise, vous pouvez également installer facilement IPOPT à partir de la source comme décrit ici. Ce résumé pourrait fonctionner pour vous:
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 ` Si vous avez besoin d'une interface pour snopt, pointez-vous à ce dossier de construction dans votre ~/.bashrc via par exemple
export SNOPT_DIR=/home/your_name/Code/Snoptet exécuter cmake comme
cmake -DBUILD_SNOPT=ON ..