概要

画像処理コンポーネントの作成 で紹介されているcv::flipのRTCを参考に,Stepwise Execution Contextに対応したRTCの作成方法を紹介します.
開発環境は,RTCを作成する環境に加えBoostライブラリおよび環境変数の追加が必要になります.
動作確認した環境は下記リンクに書いてあります.
http://openrtm.org/openrtm/ja/node/5720/#RTC_build



作り方

ここではStepwise Execution Contextに対応したcv::flipのRTCを作成する方法について紹介します.
ファイルの編集箇所(行番号)は編集によって変化することがあるので,
「手順通り進めた場合の現在の行番号」(「全く編集していない場合の行番号」)
の形式で記述します.
「Flip.cppの32(29)行」と指定があった場合
を参照して下さい.
  1. RTC Builderでのプロジェクトの作成
    1. [ファイル]→[新規(N)]→[プロジェクト(R)]を選択して新規プロジェクトウィザードを表示する
    2. ウィザード内の[その他]→[RTC Builder]を選択して[次へ(N)]をクリック
    3. [プロジェクト名]に「Flip_StepwiseEC」と入力し、[完了(F)]をクリック
  2. RT-Componentの設定およびコード生成
    1. [基本]タブで[モジュール名]を「Flip_StepwiseEC」に変更
    2. [アクティビティ]タブを開き[onActivated]をクリックし,ページ下部のラジオボタンで[ON]をクリック
    3. [onDeactivated]をクリックし,ページ下部のラジオボタンで[ON]をクリック
    4. [onExecute]をクリックし,ページ下部のラジオボタンで[ON]をクリック
    5. 入力ポートの設定
      1. [データポート]タブを開き[ポート名(InPort)]横の[Add]ボタンをクリック
      2. [dp_name]と表示されているので,クリックして「src」に変更
      3. [データ型]のプルダウンメニューから[RTC::CameraImage]を選択
      4. [変数名]に「src」と記述
    6. 出力ポートの設定
      1. [ポート名(OutPort)]横の[Add]ボタンをクリック
      2. [dp_name]と表示されているので,クリックして「dst」に変更
      3. [データ型]のプルダウンメニューから[RTC::CameraImage]を選択
      4. [変数名]に「dst」と記述
    7. [言語・環境]タブを開き,上部のラジオボタンで[C++]を選択
    8. [基本]タブに戻り[コード生成]ボタンをクリック
  3. ファイルの配置
    1. プロジェクトフォルダ(C:\Users\user_name\workspace\Flip_StepwiseEC)へ移動
    2. 同封の[StepwiseEC]フォルダをプロジェクトフォルダ内にコピー
  4. CMakeLists.txtの編集
    1. src\CMakeLists.txtをテキストエディタで開く
    2. 1(1)行目に下記の2行を挿入(CMake用の変数宣言)
    3. set(STEPWISE_DIRS ${PROJECT_SOURCE_DIR}/StepwiseEC)
      set(libStepwiseEC debug libStepwised.lib optimized libStepwise.lib)
    4. 5(3)行目に下記の1行を挿入(OpenCVを利用する設定)
    5. find_package(OpenCV REQUIRED)
    6. 34(31)行目に下記の1行を挿入(StepwiseECのインクルードディレクトリの追加)
    7. include_directories(${STEPWISE_DIRS})
    8. 42(38)行目に下記の1行を挿入(StepwiseECのライブラリディレクトリの追加)
    9. link_directories(${STEPWISE_DIRS})
    10. 49(44)行目に${OpenCV_LIBS},${libStepwiseEC}を追記
    11. target_link_libraries(${PROJECT_NAME} ${OPENRTM_LIBRARIES} ${OpenCV_LIBS} ${libStepwiseEC})
    12. 53(48)行目に${OpenCV_LIBS},${libStepwiseEC})を追記
    13. target_link_libraries(${PROJECT_NAME}Comp ${OPENRTM_LIBRARIES} ${OpenCV_LIBS} ${libStepwiseEC})
  5. CMakeによるVisual Studio用プロジェクトの生成
    1. CMakeを起動する
    2. プロジェクトディレクトリの[CMakeLists.txt]をCMakeにドラッグ&ドロップ
    3. [Where to build the binaries:]に「/build」を追記する
    4. [Configure]ボタンをクリック
    5. [Yes]をクリックしてディレクトリを生成
    6. プルダウンメニューから[Visual Studio 10 Win64]を選択し,[Finish]をクリック
    7. [Generate]をクリック
  6. Visual Studioでソースコードの編集・ビルド
    1. \buildディレクトリに移動し,生成された「Flip_StepwiseEC.sln」を開く
    2. Flip_StepwiseEC.hの編集
      1. ソリューションエクスプローラで[ソリューション 'Flip_StepwiseEC']→[Flip_StepwiseEC]→[Header Files]→[Flip_StepwiseEC.h]を開く
      2. 31(31)行目に下記の2行を挿入
      3. #include <StepwiseSystem.h>
        #include <opencv2/opencv.hpp>
    3. Flip_StepwiseEC.cppの編集
      1. ソリューションエクスプローラで[ソリューション 'Flip_StepwiseEC']→[Flip_StepwiseEC]→[Source Files]→[Flip_StepwiseEC.cpp]を開く
      2. 43(43)行目に下記の1行を挿入(StepwiseECを使用するための初期化)
      3. StepwiseExecutionContextInit(m_pManager);
      4. 117(116)行目に下記の24行を挿入(データの入出力およびcv::Flipによる処理)
      5. if(!m_srcIn.isNew()){
            STEPWISE_NOTIFY_NO_DATA();
            return RTC::RTC_OK;
        }

        cv::Mat src_Mat;
        cv::Mat flipped_Mat;

        m_srcIn.read();

        // CameraImage型からcv::Mat型へ変換
        src_Mat.create(cvSize(m_src.width,m_src.height),CV_8UC3);
        memcpy(src_Mat.data,(void *)&(m_src.pixels[0]),m_src.pixels.length());

        cv::flip(src_Mat,flipped_Mat,1);

        // cv::Mat型からCameraImage型へ変換
        m_dst.pixels.length(_CORBA_ULong(flipped_Mat.size().height * flipped_Mat.size().width * flipped_Mat.elemSize()));
        m_dst.height = flipped_Mat.size().height;
        m_dst.width = flipped_Mat.size().width;
        memcpy((void *)&(m_dst.pixels[0]),flipped_Mat.data,flipped_Mat.size().height * flipped_Mat.size().width * flipped_Mat.elemSize());

        m_dstOut.write();
    4. ソリューションのビルド

以上でStepwise Execution Contextを用いたFlip RTCが作成できます.



実行コンテキストの切り替え

rtc.confを切り替えることで,StepwiseEC/PeriodicECの切り替えが可能です.
実行ファイルと同じディレクトリ(C:\Users\user_name\workspace\Flip_StepwiseEC\build\src\Debug)または(C:\Users\user_name\workspace\Flip_StepwiseEC\build\src\Release)に同封の[rtc.conf]をコピーします.
コマンドプロンプトで実行ファイルのあるフォルダへ移動し,下記のコマンドを入力するとStepwiseECで動作します.
Flip_StepwiseECComp.exe -f rtc.conf
オプション(-f)を用いなくても同一ディレクトリにあるrtc.confが読み込まれることがあります.
その場合はrtc.confをリネームするなどして対応してください(現在調査中)
RT System Editorのプロパティーウインドウ内の[コンポーネント名]→[owned]→[ExecutionContext]→[Kind]の値でどのExecutionContextを用いて動いているか確認ができます.