Download
latest Releases : 2.0.0-RELESE
2.0.0-RELESE | Download page |
Number of Projects
RT-Component | 153.5 |
RT-Middleware | 35 |
Tools | 22 |
Documentation | 2 |
Choreonoid
Motion editor/Dynamics simulator
OpenHRP3
Dynamics simulator
OpenRTP
Integrated Development Platform
AIST RTC collection
RT-Components collection by AIST
TORK
Tokyo Opensource Robotics Association
DAQ-Middleware
Middleware for DAQ (Data Aquisition) by KEK
はじめに
このケーススタディでは、簡単な画像処理をコンポーネント化する方法を紹介します。 既存のカメラコンポーネントと画像表示コンポーネントを利用し、カメラからの画像を左右(または上下)に反転させる処理部分をコンポーネントとして作成してカメラの画像を反転させ表示するシステムを作成します。
画像を反転する処理は簡単に実装することができますが、ここではより簡単に実装するために OpenCV ライブラリを利用し、より汎用性の高い RTコンポーネントを作成します。
OpenCVとは
OpenCV (オープンシーブイ) とはかつてインテルが、現在は Itseez が開発・公開しているオープンソースのコンピュータービジョン向けライブラリです。
Wikipediaより抜粋。
作成するRTコンポーネント
cv::flip関数のRTコンポーネント化
入力された画像を左右または上下に反転し出力する RTコンポーネントを、OpenCV ライブラリの cv::flip 関数を利用して作成します。作成および実行環境は Ubuntu上 の Code::Blocks (gccコンパイラ) を想定しています。 対象 OpenRTM-aist のバージョンは 1.1.2 です。
作成手順はおおよそ以下のようになります。
cv::flip関数について
cv::flip 関数は、OpenCV で標準的に用いられている cv::Mat型の画像データを垂直軸 (左右反転)、水平軸 (上下反転)、または両軸 (上下左右反転)に対して反転させます。 関数プロトタイプと入出力の引数の意味は以下の通りです。
コンポーネントの仕様
これから作成するコンポーネントを Flip コンポーネントと呼ぶことにします。
このコンポーネントは画像データ型の入力ポート (InPort) と、反転処理した画像を出力するための出力ポート (OutPort) を持ちます。 それぞれのポートの名前を 入力ポート(InPort)名: originalImage、出力ポート(OutPort)名: flippedImage とします。
OpenRTM-aist には、OpenCV を使用したビジョン関連のコンポーネントがサンプルとして付属しています。 これらのコンポーネントのデータポートは画像の入出力に以下のような CameraImage 型を使用しています。
この Flip コンポーネントではこれらのサンプルコンポーネントとデータのやり取りができるよう同じく CameraImage 型を InPort と OutPort に使用することにします。 CameraImage 型は InterfaceDataTypes.idl で定義されており、C++であれば、InterfaceDataTypesSkel.h をインクルードすると使えるようになります。
また、画像を反転させる方向は、左右反転、上下反転、上下左右反転の3通りがあります。これを実行時に指定できるように、RTコンポーネントのコンフィギュレーション機能を使用して指定できるようにします。 パラメーター名は flipMode という名前にします。
flipMode は cv::flip 関数の仕様に合わせて、型は int 型とし 上下反転、左右反転、上下左右反転それぞれに 0、1、-1 を割り当てることにします。
flipMode の各値での画像処理のイメージを下図に示します。
以上から Flip コンポーネントの仕様をまとめます。
上下反転: 0
左右反転: 1
上下左右反転: -1
動作環境・開発環境
Linux (ここでは Ubuntu 16.04 を仮定) 上に開発環境を構築します。
インストールスクリプトでインストールします。
OpenRTP のインストール
こちらのURL からLinux版の OpenRTP(コンポーネント開発ツール、システム開発ツール統合環境) をダウンロード、インストールします。 OepnRTP の実行には Java も必要となりますので default-jre パッケージをインストールします。
Eclipse 起動後、RTSystemEditor でネームサーバーに接続できない場合があります。その場合、/etc/hosts の localhost の行に自ホスト名を追記してください。
CMake のインストール
OpenCV および OpenCV コンポーネントのインストール
OpenCV および OpenCV のコンポーネントをインストールします。
まず、Ubuntu が提供している OpenCV のパッケージを下記のようにインストールします。
リポジトリからソースコードをチェックアウトして、手動でコンパイルを行います。
Code::Blocksのインストール
Code::Blocks は C/C++ に対応した統合開発環境です。 以下のコマンドでインストールできます。
最新版を入手したい場合は以下のコマンドを入力します。
Flip コンポーネントの雛型の生成
Flip コンポーネントの雛型の生成は、RTCBuilder を用いて行います。
RTCBuilderの起動
Eclipse では、各種作業を行うフォルダーを「ワークスペース」(Work Space)とよび、原則としてすべての生成物はこのフォルダーの下に保存されます。 ワークスペースはアクセスできるフォルダーであれば、どこに作っても構いませんが、このチュートリアルでは以下のワークスペースを仮定します。
まずは Eclipse を起動します。 OpenRTP を展開したディレクトリーに移動して以下のコマンドを入力します。
最初にワークスペースの場所を尋ねられますので、上記のワークスペースを指定してください。
すると、以下のような「ようこそ」画面が表示されます。
「ようこそ」画面は必要ないので左上の [×] ボタンをクリックして閉じてください。
右上の [Open Perspective] ボタンをクリックしてください。
「RTC Builder」を選択し、[OK] ボタンをクリックすることで、RTCBuilder が起動します。
新規プロジェクトの作成
Flip コンポーネントを作成するために、RTCBuilder で新規プロジェクトを作成する必要があります。
左上の [Open New RTCBuilder Editor] のアイコンをクリックしてください。
「プロジェクト名」欄に作成するプロジェクト名 (ここでは Flip) を入力して [終了] をクリックします。
指定した名称のプロジェクトが生成され、パッケージエクスプローラ内に追加されます。
生成したプロジェクト内には、デフォルト値が設定された RTC プロファイル XML(RTC.xml) が自動的に生成されます。
RTC プロファイルエディタの起動
RTC.xml が生成された時点で、このプロジェクトに関連付けられているワークスペースとして RTCBuilder のエディタが開くはずです。 もし起動しない場合はパッケージエクスプローラーの RTC.xml をダブルクリックしてください。
プロファイル情報入力とコードの生成
まず、いちばん左の「基本」タブを選択し、基本情報を入力します。先ほど決めた Flip コンポーネントの仕様(名前)の他に、概要やバージョン等を入力してください。 ラベルが赤字の項目は必須項目です。その他はデフォルトで構いません。
次に、「アクティビティ」タブを選択し、使用するアクションコールバックを指定します。
Flip コンポーネントでは、onActivated()、onDeactivated()、onExecute() コールバックを使用します。下図のように①の onAtivated をクリック後に ②のラジオボタンにて [ON] にチェックを入れます。 onDeactivated、onExecute についても同様の操作を行います。
さらに、「データポート」タブを選択し、データポートの情報を入力します。 先ほど決めた仕様を元に以下のように入力します。なお、変数名や表示位置はオプションなので変更しないで結構です。
次に、「コンフィギュレーション」タブを選択し、先ほど決めた仕様を元に、Configuration の情報を入力します。制約条件および Widget とは、RTSystemEditor でコンポーネントのコンフィギュレーションパラメーターを表示する際に、スライダー、スピンボタン、ラジオボタンなど、GUIで値の変更を行うためのものです。
ここでは、flipMode が取りうる値は先ほど仕様を決めたときに、-1、0、1 の3つの値のみ取ることにしたので、ラジオボタンを使用することにします。
-flipMode
次に、「言語・環境」タブを選択し、プログラミング言語を選択します。 ここでは、C++(言語)を選択します。なお、言語・環境はデフォルト等が設定されておらず、指定し忘れるとコード生成時にエラーになりますので、必ず言語の指定を行うようにしてください。
また、C++ の場合デフォルトでは CMake を利用してビルドすることになっていますが、旧式の VC のプロジェクトやソリューションを直接 RTCBuilder が生成する方法を利用したい場合は [Use old build environment] をチェックしてください。
最後に、「基本」タブにある [コード生成] ボタンをクリックし、コンポーネントの雛型を生成します。
※ 生成されるコード群は、Eclipse 起動時に指定したワークスペースフォルダーの中に生成されます。 現在のワークスペースは、[ファイル] > [ワークスペースの切り替え] で確認することができます。
CMake によるビルドに必要なファイルの生成
RTC Builder で生成したコードの中には CMake でビルドに必要な各種ファイルを生成するための CMakeLists.txt が含まれています。 CMake を利用することにより CMakeLists.txt から Visual Studio のプロジェクトファイル、ソリューションファイル、もしくは Makefile 等を自動生成できます。
CMakeList.txt の編集
src/CMakeLists.txt を gedit などで開いて編集します。 もしくは Eclipse 画面左のパッケージエクスプローラで src/CMakeLists.txt をダブルクリックもしくはエディタへドラッグアンドドロップしても編集できます。
このコンポーネントでは OpenCV を利用していますので、OpenCV のヘッダのインクルードパス、ライブラリやライブラリサーチパスを与えてやる必要があります。 幸い OpenCV は CMake に対応しており、以下の2行を追加・変更するだけで OpenCV のライブラリがリンクされ使えるようになります。
CMake(cmake-gui)の操作
CMake を利用してビルド環境の Configure を行います。 まずは CMake (cmake-gui) を起動してください。
画面上部に以下のようなテキストボックスがありますので、それぞれソースコードの場所 (CMakeList.txtがある場所) と、ビルドディレクトリーを指定します。
ソースコードの場所は Flip コンポーネントのソースが生成された場所で CMakeList.txt が存在するディレクトリーです。 デフォルトでは <ワークスペースディレクトリー>/Flip になります。
ビルドディレクトリとは、ビルドするためのプロジェクトファイルやオブジェクトファイル、バイナリを格納する場所のことです。 場所は任意ですが、この場合 <ワークスペースディレクトリー>/Flip/build のように分かりやすい名前をつけた Flip のサブディレクトリーを指定することをお勧めします。
指定したら、下のConfigureボタンを押します。すると下図のようなダイアログが表示されますので、生成したいプロジェクトの種類を指定します。 今回は CodeBlocks - Unix Makefiles を指定します。 Code::Blocks を使わない場合は Unix Makefiles を使ってください。
また cmake-gui を使用しない場合は以下のコマンドでファイルを生成できます。
ダイアログで [Finish] をクリックすると Configure が始まります。問題がなければ下部のログウインドウに「Configuring done」と表示されますので、続けて [Generate] ボタンをクリックします。 「Generating done」と表示されればプロジェクトファイル(.cbp)・Makefile 等の出力が完了します。
なお、CMake は Configure の段階でキャッシュファイルを生成しますので、トラブルなどで設定を変更したり環境を変更した場合は [File] > [Delete Cache] でキャッシュを削除して Configure からやり直してください。
ヘッダ、ソースの編集
次に先ほど指定した build ディレクトリーの中の Flip.cbp をダブルクリックして Code::Blocks を起動します。
ヘッダ (include/Flip/Flip.h) およびソースコード (src/Flip.cpp) をそれぞれ編集します。 Code::Blocks の Projects から Flip.h、Flip.cpp をダブルクリックすることで編集画面が開きます。
64bitの環境の場合に Code::Blocks の動作が不安定になることがあります。その場合は code completion というプラグインを無効化すると動作することがあります。
「Plugins」>「Manage plugins...」を選択します。
「code completion」を選択して [Disable] をクリックします。
動作しないときはこの手順を試してください。
アクティビティ処理の実装
Flip コンポーネントでは、InPort から受け取った画像を画像保存用バッファに保存し、その保存した画像を OpenCVのcv::flip() 関数にて変換します。 その後、変換された画像を OutPort から送信します。
onActivated()、onExecute()、onDeactivated() での処理内容を下図に示します。
onExecute() での処理を下図に示します。
ヘッダファイル (Flip.h) の編集
OpenCV のライブラリを使用するため、OpenCV のインクルードファイルをインクルードします。
反転した画像の保存用にメンバー変数を追加します。
ソースファイル (Flip.cpp) の編集
下記のように、onActivated()、onDeactivated()、onExecute() を実装します。
Code::Blocks によるビルド
ビルドの実行
Code::Blocksの [ビルド] ボタンをクリックしてビルドを行います。
Flip コンポーネントの動作確認
ここでは、カメラコンポーネント (OpenCVCameraComp)とビューアコンポーネント (CameraViewerComp)を接続し動作確認を行います。
NameService の起動
コンポーネントの参照を登録するためのネームサービスを起動します。
rtc.conf の作成
RTコンポーネントでは、ネームサーバーのアドレスやネームサーバーへの登録フォーマットなどの情報を rtc.conf というファイルで指定する必要があります。
下記の内容を rtc.conf というファイル名で保存し、Flip\build\srcフォルダーに置いて下さい。
※ Eclipse 起動時に workspace をデフォルトのままにしていた場合、Flip フォルダーのパスは、 C:\Documents and Settings\<ログインユーザー名>\workspace となります。
Flip コンポーネントの起動
Flip コンポーネントを起動します。
先程 rtc.conf ファイルを置いたフォルダにある、FlipComp ファイルを実行してください。
カメラコンポーネントとビューアコンポーネントの起動
USBカメラのキャプチャー画像を OutPort から出力する OpenCVCameraComp と InPort で受け取った画像を画面に表示する CameraViewerComp を起動します。
これら2つのコンポーネントは、下記のコマンドにて起動できます。
コンポーネントの接続
下図のように、RTSystemEditor にて OpenCVCameraComp と Flip、CameraviewerComp コンポーネントを接続します。
コンポーネントの Activate
RTSystemEditor の上部にあります [All Activate] というアイコンをクリックし、全てのコンポーネントをアクティブ化します。 正常にアクティベートされた場合、下図のように黄緑色でコンポーネントが表示されます。
動作確認
下図のようにコンフィギュレーションビューにてコンフィギュレーションを変更することができます。
Flipコンポーネントのコンフィギュレーションパラメーター「flipMode」を「0」や「-1」などに変更し、画像の反転が行われるかを確認してください。