واجهة C ++ الحديثة ، الخفيفة الوزن ، المستندة إلى Eigen إلى حلول البرمجة غير الخطية ، مثل iPopt و Snopt.
يتم تعريف مثال على ذلك مشكلة التحسين غير الخطية التي يجب حلها على النحو التالي:
الميزات • التثبيت • أمثلة • المساهمة • المنشورات • المؤلفين
يجمع بين مزايا ipopt / snopt و eigen:
| ipopt / snopt | eigen |
|---|---|
| ✔ حلال عالي الجودة للتحسين غير الخطي | ✔ تركيبات حديثة وبديهية للناقلات والمصفوفات |
| C ++ API غير مريح ومعرض للخطأ (مؤشرات RAW ، إدارة الفهرس ، بناء يعقوبي) | ✔ تطبيقات عالية الكفاءة |
| الربط والتصدير صعبًا |
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 و eigen و 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مشكلة أكثر مشاركة ، مأخوذة من TOLR ، مع مجموعات متعددة من المتغيرات والقيود لإنشاء حركات للروبوتات ذات الأرجل تنتج ما يلي:
نحن نحب طلب السحب ، سواء كانت واجهاته إلى حلول إضافية أو إصلاحات الأخطاء أو اختبارات الوحدة أو تحديث الوثائق. يرجى إلقاء نظرة على المساهمة. 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 Build الخاص بك إلى ~/.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 من خلال على سبيل المثال
export SNOPT_DIR=/home/your_name/Code/Snoptوتشغيل cmake
cmake -DBUILD_SNOPT=ON ..