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