Download
latest Releases : 2.0.0-RELESE
2.0.0-RELESE | Download page |
Number of Projects
RT-Component | 152 |
RT-Middleware | 33 |
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 とはかつてインテルが、現在は Willow Garage が開発・公開しているオープンソースのコンピュータービジョン向けライブラリです。
Wikipediaより抜粋。
作成する RTコンポーネント
cvFlip 関数の RTコンポーネント化
入力された画像を左右または上下に反転し出力する RTコンポーネントを、OpenCV ライブラリの cvFlip 関数を利用して作成します。 作成および実行環境は Windows上の Visual C++ を想定しています。対象 OpenRTM-aist のバージョンは 1.1 です。
作成手順はおおよそ以下のようになります。
動作環境の確認
Linux (ここでは Ubuntu 14.04 を仮定) 上に開発環境を構築します。
OpenRTM-aist のインストール
Choreonoid を利用する場合、以下のように PPA から OpenRTM-aistを インストールしてください。 一括インストールスクリプトをすでに実行している場合、/etc/apt/sources.list の下の方に追記されている openrtm.org のリポジトリをコメントアウトした上で、 apt-get update してください。
OpenRTP のインストール
こちらのURL から Linux版の OpenRTP (コンポーネント開発ツール、システム開発ツール統合環境) をダウンロード、インストールします。 OepnRTP の実行には Java も必要となりますので default-jre パッケージをインストールします。
eclipse 起動後、RTSystemEditor でネームサーバーに接続できない場合があります。その場合、/etc/hosts の localhost の行に自ホスト名を追記してください。
OpenCV および OpenCV コンポーネントのインストール
OpenCV および OpenCV のコンポーネントをインストールします。
まず、Ubuntu が提供している OpenCV のパッケージを下記のようにインストールします。
OpenCV RTC のパッケージは下記 URL にありますので、手動でダウンロードして、dpkg コマンドでインストールします。
cvFlip 関数について
cvFlip 関数は、OpenCV で標準的に用いられている IplImage型の画像データを垂直軸 (左右反転)、水平軸 (上下反転)、または両軸 (上下左右反転) に対して反転させます。関数プロトタイプと入出力の引数の意味は以下の通りです。
コンポーネントの仕様
これから作成するコンポーネントを 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 は cvFlip 関数の仕様に合わせて、型は int 型とし 上下反転、左右反転、上下左右反転それぞれに 0、1、-1 を割り当てることにします。
flipModeの各値での画像処理のイメージを下図に示します。
以上から Flip コンポーネントの仕様をまとめます。
上下反転: 0
左右反転: 1
上下左右反転: -1
動作環境・開発環境
ここで動作環境および開発環境を確認しておきます。
OpenRTM-aist-1.1 以降では、コンポーネントのビルドに CMake を使用します。また、RTC のひな形生成ツール RTCBuilder では、ドキュメントを入力してこれを Doxygen に処理させることで、コンポーネントのマニュアルも自動で生成することができるようになっています。 このため CMakeで Configure を行うときに Doxygen が要求されるため、予めインストールしておく必要があります。
Flip コンポーネントの雛型の生成
Flip コンポーネントの雛型の生成は、RTCBuilder を用いて行います。
RTCBuilder の起動
Eclipse では、各種作業を行うフォルダーを「ワークスペース」(Work Space)とよび、原則としてすべての生成物はこのフォルダーの下に保存されます。 ワークスペースはアクセスできるフォルダーであれば、どこに作っても構いませんが、このチュートリアルでは以下のワークスペースを仮定します。
Eclipse を起動すると、ワークスペースの場所を尋ねられます。Eclipse を最初に起動したとき、または -clean オプション付きで起動した場合は、デフォルトで上記のディレクトリーが指定されますので、そのまま [OK] ボタンをクリックしてください。以下のような「ようこそ」画面が表示されます。 「ようこそ」画面はいまは必要ないので左上の「×」ボタンをクリックして閉じてください。
右上の [Open Perspective] ボタンをクリックし、プルダウンの「Other…」を選択します。
「RTC Builder」を選択することで、RTCBuilder が起動します。メニューバーに「カナヅチとRT」の RTCBuilder のアイコンが表示されます。
新規プロジェクトの作成
Flip コンポーネントを作成するために、RTCBuilder で新規プロジェクトを作成する必要があります。プロジェクトを作成する方法は2種類あります。
どちらの方法でも、次ようなプロジェクト作成ウィザードが開始されます。 「プロジェクト名」欄に作成するプロジェクト名 (ここでは Flip) を入力して [完了] ボタンをクリックします。
指定した名称のプロジェクトが生成され、パッケージエクスプローラー内に追加されます。
生成したプロジェクト内には、デフォルト値が設定された RTC プロファイル XML(RTC.xml) が自動的に生成されます。
RTC プロファイルエディタの起動
RTC.xml が生成された時点で、このプロジェクトに関連付けられているワークスペースとして RTCBuilder のエディタが開くはずです。 もし開かない場合は、ツールバーの「Open New RtcBuilder Editor」ボタンをクリックするか、メニューバーの [ファイル] > [Open New Builder Editor] を選択します。
プロファイル情報入力とコードの生成
まず、いちばん左の「基本」タブを選択し、基本情報を入力します。先ほど決めた Flip コンポーネントの仕様(名前)の他に、概要やバージョン等を入力してください。 ラベルが赤字の項目は必須項目です。その他はデフォルトで構いません。
次に、「アクティビティ」タブを選択し、使用するアクションコールバックを指定します。
Flip コンポーネントでは、onActivated()、onDeactivated()、onExecute() コールバックを使用します。下図のように①の onAtivated をクリック後に ②のラジオボタンにて [ON] にチェックを入れます。 onDeactivated、onExecute についても同様の操作を行います。
さらに、「データポート」タブを選択し、データポートの情報を入力します。 先ほど決めた仕様を元に以下のように入力します。なお、変数名や表示位置はオプションで、そのままで結構です。
-InPort Profile:
-OutPort Profile:
次に、「コンフィギュレーション」タブを選択し、先ほど決めた仕様を元に、Configuration の情報を入力します。 制約条件および Widget とは、RTSystemEditor でコンポーネントのコンフィギュレーションパラメーターを表示する際に、スライダー、スピンボタン、ラジオボタンなど、GUI で値の変更を行うためのものです。
ここでは、flipMode が取りうる値は先ほど仕様を決めたときに、-1、0、1 の3つの値のみ取ることにしたので、ラジオボタンを使用することにします。
-flipMode
次に、「言語・環境」タブを選択し、プログラミング言語を選択します。ここでは、C++(言語)を選択します。 なお、言語・環境はデフォルト等が設定されておらず、指定し忘れるとコード生成時にエラーになりますので、必ず言語の指定を行うようにしてください。
また、C++の場合デフォルトでは CMake を利用してビルドすることになっていますが、旧式の VC のプロジェクトやソリューションを直接 RTCBuilder が生成する方法を利用したい場合は [Use old build environment] をチェックしてください。
最後に、「基本」タブにある [コード生成] ボタンをクリックし、コンポーネントの雛型を生成します。
※ 生成されるコード群は、Eclipse 起動時に指定したワークスペースフォルダーの中に生成されます。 現在のワークスペースは、[ファイル] > [ワークスペースの切り替え] で確認することができます。
仮ビルド
さて、ここまでで Flip コンポーネントのソースコードが生成されました。処理の中身は実装されていないので、InPort に画像を入力しても何も出力されませんが、生成直後のソースコードだけでもコンパイルおよび実行はできます。
※サービスポートとプロバイダを持つコンポーネントの場合、実装を行わないとビルドが通らないものもあります。
では、まず CMake を利用してビルド環境の Configure を行います。Linux であれば、Flip コンポーネントのソースが生成されたディレクトリーで
とすれば、Configure およびビルドが完了するはずです。ビルド終了後、からの FlipComp を起動してみましょう。
起動後、RTSystemEditor などでアクセスしてみてください。Flip というコンポーネントが表示されているはずです。 カメラコンポーネント (OpenCVCameraComp) や表示コンポーネント (CameraViewerComp) などとも接続できますが、中で何も処理を行っていないでの、表示コンポーネントには何も表示されません。
次からは、コンポーネントのソースコードを作成し、中身を実装していきます。
ヘッダ、ソースの編集
ヘッダ (include/Flip/Flip.h) およびソースコード (src/Flip.cpp) をそれぞれ編集します。 Eclipse 画面左のパッケージエクスプローラーでそれぞれのファイルをダブルクリックすると、通常は Visual C++ の編集画面が開きますので、そこで編集します。 Eclipse の中央のエディタにドラッグアンドドロップしても編集できます。
アクティビティ処理の実装
Flip コンポーネントでは、InPort から受け取った画像を画像保存用バッファに保存し、その保存した画像を OpenCV の cvFlip()関数にて変換します。 その後、変換された画像を OutPort から送信します。
onActivated()、onExecute()、onDeactivated() での処理内容を下図に示します。
onExecute() での処理を下図に示します。
ヘッダファイル (Flip.h) の編集
OpenCV のライブラリを使用するため、OpenCV のインクルードファイルをインクルードします。
この cvFlip コンポーネントでは、画像領域の確保、Flip 処理、確保した画像領域の解放のそれぞれの処理を行います。 これらの処理は、それぞれ onActivated()、onDeactivated()、onExecute() のコールバック関数にて行います。
反転した画像の保存用にメンバー変数を追加します。
ソースファイル (Flip.cpp) の編集
下記のように、onActivated()、onDeactivated()、onExecute()を実装します。
CMake によるビルドに必要なファイルの生成
CMakeList.txt の編集
Eclipse 画面左のパッケージエクスプローラーで src/CMakeLists.txt をダブルクリックもしくはエディタへドラッグアンドドロップして編集します。
このコンポーネントでは OpenCV を利用していますので、OpenCV のヘッダのインクルードパス、ライブラリやライブラリサーチパスを与えてやる必要があります。 幸い OpenCV は CMake に対応しており、以下の2行を追加・変更するだけで OpenCV のライブラリがリンクされ使えるようになります。
ビルド
ビルドの実行
CMakeList.txt を編集したので、再度 CMake で Configure および Generate を行います。
Flip コンポーネントの動作確認
ここでは、OpenRTM-aist-1.1 以降で同梱されるようになったカメラコンポーネント (OpenCVCameraComp、または DirectShowCamComp)とビューアコンポーネント (CameraViewerComp)を接続し動作確認を行います。
NameService の起動
コンポーネントの参照を登録するためのネームサービスを起動します。
rtc.conf の作成
RTコンポーネントでは、ネームサーバーのアドレスやネームサーバーへの登録フォーマットなどの情報を rtc.conf というファイルで指定する必要があります。
下記の内容を rtc.conf というファイル名で保存し、workspace/Flip/build/src/ ディレクトリーに置いてください。
Flip コンポーネントの起動
Flip コンポーネントを起動します。
先程 rtc.conf ファイルを置いたフォルダーにある、FlipComp.exe ファイルを実行してください。
カメラコンポーネントとビューアコンポーネントの起動
USBカメラのキャプチャー画像を OutPort から出力する OpenCVCameraComp、InPort で受け取った画像を画面に表示する CameraViewerComp を起動します。
コンポーネントの接続
下図のように、RTSystemEditor にて OpenCVCameraComp (またはDirectShowcomp) と Flip、CameraviewerComp コンポーネントを接続します。
Eclipse起動後、RTSystemEditor でネームサーバーに接続できない場合があります。その場合、/etc/hosts の localhost の行に自ホスト名を追記してください。
コンポーネントの Activate
RTSystemEditor の上部にあります「ALL」というアイコンをクリックし、全てのコンポーネントをアクティブ化します。正常にアクティベートされた場合、下図のように黄緑色でコンポーネントが表示されます。
動作確認
下図のようにコンフィギュレーションビューにてコンフィギュレーションを変更することができます。
Flip コンポーネントのコンフィギュレーションパラメーター「flipMode」を「0」や「-1」などに変更し、画像の反転が行われるかを確認してください。
Flip コンポーネントの全ソース
Flip コンポーネントソースファイル (Flip.cpp)
Flip コンポーネントのヘッダファイル (Flip.h)
Flip コンポーネントの全ソースコード
Flip コンポーネントの全ソースコードを以下に添付します。
Flip.zip