読者です 読者をやめる 読者になる 読者になる

szmlb.net

tips for robotics

qpOASESメモ

二次計画問題を解くためのライブラリ.
https://projects.coin-or.org/qpOASES

  • インストール

https://projects.coin-or.org/qpOASES/wiki/QpoasesInstallation

インストールから使用までの手引きは以下のpdfファイルに記載してある.
http://www.coin-or.org/qpOASES/doc/3.2/manual.pdf

zipファイルをDLして,

$ zip qpOASES-3.2.0.zip
$ cd qpOASES-3.2.0
$ vim make.mk

使用するOSに準じて変更する↓(Macを使用する例)
#include ${TOP}/make_linux.mk
#include ${TOP}/make_cygwin.mk
#include ${TOP}/make_windows.mk
include ${TOP}/make_osx.mk

次に, 対応するmkファイルを編集する.
$ vim make_osx.mk

例えば, XcodeMatlabのパスを自分の環境に合わせて変更する必要がある.

################################################################################
# user configuration

# include directories, relative
IDIR =   ${TOP}/include
SRCDIR = ${TOP}/src
BINDIR = ${TOP}/bin

# MacOSX SDK
SYSROOT = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/<b>MacOSX10.11</b>.sdk
SDK = -isysroot ${SYSROOT} -stdlib=libc++

# Matlab include directory (ADAPT TO YOUR LOCAL SETTINGS!)
MATLAB_IDIR   = /Applications/<b>MATLAB_R2015b.app</b>/extern/include/
MATLAB_LIBDIR =

最後に,

$ make

これでOK.

自分で使用するプロジェクト内で使用するために, 手動でincludeファイルとlinkファイルを以下のようにコピーした.

$ sudo cp ./include/* /usr/local/include
$ sudo cp ./bin/libqpOASES.* /usr/local/lib

  • 実行例

以下の2次計画問題を解く.
http://cvxopt.org/_images/math/7f776871eb1407c7fecdb53e4be9fc3e3826668e.png
Solving a quadratic program — CVXOPT
問題はcvxoptのドキュメントから拝借しました.
解は, (x1, x2)=(0.25, 0.75)です.

コードは以下の通りです.
github.com

#include <qpOASES.hpp>

int main( )
{
    USING_NAMESPACE_QPOASES

    /* Setup data of QP. */
    real_t H[2*2] = { 4.0, 1.0, 1.0, 2.0 };
    real_t A[2*1] = { 1.0, 1.0 };
    real_t g[2] = { 1.0, 1.0 };
    real_t lb[2] = { 0.0, 0.0 };
    real_t ub[2] = { 10000.0, 10000.0 };
    real_t lbA[1] = { 1.0 }; // lbAとubAを等しくすることで等式制約として設定可能
    real_t ubA[1] = { 1.0 };

    /* Setting up QProblem object. */
    QProblem example( 2,1 );

    Options options;
    example.setOptions( options );

    /* Solve first QP. */
    int_t nWSR = 10;
    example.init( H,g,A,lb,ub,lbA,ubA, nWSR );

    /* Get and print solution of first QP. */
    real_t xOpt[2];
    real_t yOpt[2+1];
    example.getPrimalSolution( xOpt );
    example.getDualSolution( yOpt );
    printf( "\nxOpt = [ %e, %e ];  yOpt = [ %e, %e, %e ];  objVal = %e\n\n",
            xOpt[0],xOpt[1],yOpt[0],yOpt[1],yOpt[2],example.getObjVal() );

    example.printOptions();
    example.printProperties();

    return 0;
}

Makefileの中で以下のようにリンクすればOK.

CPP = clang++
CFRAGS = -stdlib=libstdc++ -O3 -Wall -lm -g
QPOASES_INCLUDE_DIR = -I/usr/local/include/
QPOASES_LIB_DIR = -L/usr/local/lib -lqpOASES

OBJS_MAIN = main.o

main : $(OBJS_MAIN)
	$(CPP) -o main $(CFLAGS) $(QPOASES_INCLUDE_DIR) $(QPOASES_LIB_DIR) $(OBJS_MAIN)

# main program
main.o: main.cpp
		$(CPP) -c $(CFLAGS) $(QPOASES_INCLUDE_DIR) $(QPOASES_LIB_DIR) main.cpp