Eine moderne, leichte, yenbasierte C ++-Schnittstelle zu nichtlinearen Programmierlöser wie Ipopt und SNOPT.
Ein Beispiel für nichtlineare Optimierungsprobleme ist definiert als:
Merkmale • Installation • Beispiele • Beitrag • Veröffentlichungen • Autoren
Kombiniert die Vorteile von Ipopt / SNOPT und Eigen:
| Ipopt / snopt | Eigen |
|---|---|
| ✔️ hochwertige Löser für nichtlineare Optimierung | ✔️ moderne, intuitive Formulierungen von Vektoren und Matrizen |
| C ++ API Unannehmlich und fehleranfällige (Rohzeiger, Indexmanagement, jakobische Konstruktion) | ✔️ hocheffiziente Implementierungen |
| Verknüpfen und exportieren schwierig |
find_package(ifopt) oder Catkin/ROS (optional) Ein Optimierungsproblem besteht aus mehreren unabhängigen Variablen- und Einschränkungen . Jeder Satz stellt ein gemeinsames Konzept dar, z. B. eine Reihe von Variablen könnte Spline -Koeffizienten darstellen, eine weitere Schritte. In ähnlicher Weise gruppiert eine Einschränkung ähnliche Einschränkungen zusammen. ifopt können Benutzer jede dieser Sätze unabhängig in separaten Klassen definieren und dann das Gesamtproblem aus diesen Sets erstellt. (Keine besorgten Anpassungsindizes mehr beim Hinzufügen oder Entfernen von Sätzen).
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)
Durch die Lieferung von Derivatinformationen erhöht sich die Lösungsgeschwindigkeit erheblich. ifopt ermöglicht es, die Ableitung jeder Kosten-/Einschränkung in Bezug auf jede variable Menge unabhängig voneinander zu definieren. Dies stellt sicher, dass diese Ableitungsinformationen, wenn sich die Reihenfolge der Variablenmengen im Gesamtvektor ändert, weiterhin gültig ist. Diese "jakobischen Blöcke" müssen durch ConstraintSet::FillJacobianBlock() geliefert werden und werden dann verwendet, um den vollständigen Jacobian für die Kosten und Einschränkungen zu erstellen.
Eine grafische Übersicht als UML ist hier zu sehen.
Der einfachste Weg zu installieren ist die ROS -Binärdateien und Sie sind alle festgelegt!
sudo apt-get install ros-<distro>-ifopt
Falls Sie ROS nicht verwenden oder die Binärdateien nicht für Ihre Distribution existieren, können Sie diese Pakete problemlos aus der Quelle erstellen. Installieren Sie hierzu die erforderlichen Abhängigkeiten CMake, Eigen und Ipopt unter Verwendung
sudo apt-get install cmake libeigen3-dev coinor-libipopt-dev
Wenn Sie zu einer lokalen Installation von Ipopt oder mit SNOPT verlinken möchten, finden Sie hier.
Installieren
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 aboveVerwendung: Um in Ihrem CMake -Projekt zu verwenden, finden Sie in diesem minimalen 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) Installation: Download Catkin- oder Catkin -Befehlszeilen -Tools und dann:
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.bashVerwendung: In Ihr Catkin -Projekt einbeziehen, indem Sie Ihre cmakelists.txt hinzufügen.
add_compile_options (-std=c++11)
find_package (catkin COMPONENTS ifopt)
include_directories ( ${catkin_INCLUDE_DIRS} )
target_link_libraries (foo ${catkin_LIBRARIES} )Fügen Sie Ihrem Paket Folgendes hinzu.xml:
< package >
< depend >ifopt</ depend >
</ package > Navigieren Sie zu Ihrem Build -Ordner, in dem sich das Makefile befindet, was davon abhängt, wie Sie den Code erstellt haben:
cd ifopt/build # plain cmake
cd catkin_ws/build_isolated/ifopt/devel # catkin_make_isolated
cd catkin_ws/build/ifopt # catkin build Stellen Sie sicher, dass alles korrekt installiert wird, indem Sie das test ausführen
make test Sie sollten sehen, dass ifopt_ipopt-example....Passed (oder snopt installiert ist) sowie ifopt_core-test wenn GTEST installiert ist.
Wenn Sie Ipopt installiert und korrekt verlinkt haben, können Sie das Binärbeispiel auch direkt ausführen (navigieren Sie zuerst mit dem Makefile zum Build -Ordner).
make test ARGS= ' -R ifopt_ipopt-example -V 'Ausgabe:
1.0 0.0Ein besseres Problem, das aus TOWR mit mehreren Variablen- und Einschränkungen, um Bewegungen für Beinroboter zu erzeugen, entnommen werden, erzeugen Folgendes:
Wir lieben es, Anfrage zu ziehen, egal ob die Schnittstellen zu zusätzlichen Solvers, Fehlerbehebungen, Unit -Tests oder der Aktualisierung der Dokumentation. Bitte werfen Sie einen Blick auf den Beitrag zu, um weitere Informationen zu erhalten. Siehe hier die Liste der Mitwirkenden, die an diesem Projekt teilgenommen haben.
Wenn Sie diese Arbeit verwenden, erwägen Sie bitte wie folgt zu zitieren:
@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}
}
Das Forschungsprojekt, in dem dieser Code entwickelt wurde:
Alexander W. Winkler - Erste Arbeit/Betreuer
Dies wurde an folgenden Institutionen durchgeführt:
Wenn Sie aus der Quelle erstellen und eine lokal installierte Version von Ipopt verwenden möchten, fügen Sie den Pfad Ihrem Ipopt -Build -Ordner zu Ihrem ~/.bashrc hinzu, z.
export IPOPT_DIR=/home/your_name/Code/Ipopt-3.12.8/buildFalls Ihr Betriebssystem nicht die vorkompilierten Binärdateien oder die erforderliche Version bereitstellt, können Sie IPOPT auch problemlos von der Quelle installieren, wie hier beschrieben. Diese Zusammenfassung kann für Sie funktionieren:
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 ` Wenn Sie ~/.bashrc Schnittstelle zu SNOPT benötigen, zeigen
export SNOPT_DIR=/home/your_name/Code/Snoptund leiten Sie CMake als
cmake -DBUILD_SNOPT=ON ..