Uma interface C ++ moderna, leve e baseada em eigen para solucionadores de programação não lineares, como IPOPT e SNOPT.
Um exemplo de problema de otimização não linear a ser resolvido é definido como:
Recursos • Instalar • Exemplos • Contribuir • Publicações • Autores
Combina as vantagens do IPOPT / SNOPT e EIGEN:
| IPOPT / SNOPT | Eigen |
|---|---|
| Solvers Solvers de alta qualidade para otimização não linear | ✔️ Formulações modernas e intuitivas de vetores e matrizes |
| API C ++ Inconveniente e propensa a erros (Ponteiros crus, Gerenciamento de índices, construção jacobiana) | ✔️ Implementações altamente eficientes |
| Vincular e exportar difícil |
find_package(ifopt) ou catkin/ros (opcional) Um problema de otimização consiste em múltiplos conjuntos de variáveis e restrições independentes . Cada conjunto representa um conceito comum, por exemplo, um conjunto de variáveis pode representar coeficientes de spline, outro passo. Da mesma forma, um conjunto de restrições grupos em restrições semelhantes. ifopt permite que os usuários defina cada um desses conjuntos de forma independente em classes separadas e depois cria o problema geral a partir desses conjuntos. (Não é mais preocupante adaptar índices ao adicionar ou remover conjuntos).
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)
O fornecimento de informações derivadas aumenta muito a velocidade da solução. ifopt permite definir o derivado de cada conjunto de custos/restrição em relação a cada conjunto de variáveis de forma independente . Isso garante que, quando a ordem dos conjuntos de variáveis altera no vetor geral, essas informações derivadas ainda são válidas. Esses "blocos jacobianos" devem ser fornecidos por meio de ConstraintSet::FillJacobianBlock() e são usados para construir o jacobiano completo para o custo e as restrições.
Uma visão geral gráfica como UML pode ser vista aqui.
A maneira mais fácil de instalar é através dos binários do ROS e você está pronto!
sudo apt-get install ros-<distro>-ifopt
Caso você não use ROS ou os binários não existam para sua distro, você pode criar facilmente esses pacotes a partir da fonte. Para isso, instale as dependências necessárias CMake, Eigen e IPOPT usando
sudo apt-get install cmake libeigen3-dev coinor-libipopt-dev
Se você deseja vincular a uma instalação local do IPOPT ou à Snopt, veja aqui.
Instalar
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 aboveUso: Para usar em seu projeto CMake, consulte este cmakelists mínimos.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) Instale: Faça o download das ferramentas de linha de comando Catkin ou Catkin e depois:
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.bashUse: Inclua em seu projeto Catkin, adicionando aos seus cmakelists.txt
add_compile_options (-std=c++11)
find_package (catkin COMPONENTS ifopt)
include_directories ( ${catkin_INCLUDE_DIRS} )
target_link_libraries (foo ${catkin_LIBRARIES} )Adicione o seguinte ao seu package.xml :
< package >
< depend >ifopt</ depend >
</ package > Navegue até a pasta de construção na qual o Makefile reside, que depende de como você construiu o código:
cd ifopt/build # plain cmake
cd catkin_ws/build_isolated/ifopt/devel # catkin_make_isolated
cd catkin_ws/build/ifopt # catkin build Verifique se tudo instalado corretamente executando o alvo test
make test Você deve ver ifopt_ipopt-example....Passed (ou Snopt se instalado) e como ifopt_core-test se o gtest estiver instalado.
Se você tiver o IPOPT instalado e vinculado corretamente, também poderá executar o exemplo binário diretamente (novamente, navegue pela primeira vez até a pasta Build com o Makefile )
make test ARGS= ' -R ifopt_ipopt-example -V 'Saída:
1.0 0.0Um problema mais envolvido, retirado do TOWR, com vários conjuntos de variáveis e restrições para gerar movimentos para robôs pernas produzem o seguinte:
Adoramos a solicitação de tração, se suas interfaces para solucionadores adicionais, correções de bugs, testes de unidade ou atualização da documentação. Por favor, dê uma olhada no contribuindo.md para obter mais informações. Veja aqui a lista de colaboradores que participaram deste projeto.
Se você usar este trabalho, considere citar da seguinte maneira:
@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}
}
O projeto de pesquisa dentro do qual este código foi desenvolvido:
Alexander W. Winkler - Trabalho/mantenedor inicial
Isso foi realizado nas seguintes instituições:
Se você estiver construindo a partir da fonte e deseja usar uma versão instalada localmente do IPOPT, adicione o caminho à sua pasta de construção do IPOPT ao seu ~/.bashrc , por exemplo
export IPOPT_DIR=/home/your_name/Code/Ipopt-3.12.8/buildCaso seu sistema operacional não forneça os binários pré -compilados ou a versão necessária, você também pode instalar facilmente o IPOPT da fonte, conforme descrito aqui. Este resumo pode funcionar para você:
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 ` Se você precisar de uma interface para Snopt, aponte para essa pasta de criação em seu ~/.bashrc por exemplo
export SNOPT_DIR=/home/your_name/Code/Snopte correr como
cmake -DBUILD_SNOPT=ON ..