第12回AIツール入門講座(人工知能学会) RTM講習会

jsai_logo_base_outlined_fix.png

開催報告

2017年11月28日(火)に人工知能学会主催 の 第12回AIツール入門講座 において、RTミドルウエア講習会を開催いたしました。

RTミドルウエアはロボットシステムの構築を効率化するソフトウエアプラットフォームです。RTコンポーネントと呼ばれるモジュール化されたソフトウエアを多数組わせてロボットシステムを構築するため、システムの変更、拡張がしやすいだけでなく、既存のソフトウエア資産をの継承や他人が作ったコンポーネントとの組み合わせも容易になります。講習会では、RTミドルウエアの概要、RTコンポーネントの作成方法について解説します。受講者には各自ノートPCをお持ちいただき、実習形式で実際にRTコンポーネントを作成、既存のコンポーネントなどと組み合わせて簡単なシステムを構築していただきます。本講習会を受講することで、RTコンポーネント設計方法、実装の仕方、システムの作り方をマスターすることができます。

日時・場所

プログラム

10:00 -10:50 第1部:OpenRTM-aistおよびRTコンポーネントプログラミングの概要
担当:安藤慶昭氏 (産業技術総合研究所)
概要:RTミドルウェア(OpenRTM-aist)はロボットシステムをコンポーネント指向で構築するソフトウェアプラットフォームです。RTミドルウェアを利用することで、既存のコンポーネントを再利用し、モジュール指向の柔軟なロボットシステムを構築することができます。RTミドルウエアについて、その概要およびRTコンポーネントの機能やプログラミングの流れについて説明します。
第1部講義資料(PDF)
11:00 -11:50 第2部:RTコンポーネント作成入門
担当:宮本信彦氏 (産業技術総合研究所)
概要:RTコンポーネント設計ツールRTCBuilderとRTシステム構築ツールRTSystemEditorの利用方法を解説するとともに、移動ロボットシミュレータを用いた実習によりRTコンポーネントの開発手順、動作確認手順を学習します。 また、作成したコンポーネントを利用し、移動ロボット実機(RaspberryPiマウス)を制御する方法についても学習します。
チュートリアル(第2部、Windows)
チュートリアル(第2部、Ubuntu)
11:50 -12:00 質疑応答・意見交換
12:00 -13:00 昼食
13:00 -16:30 第3部:プログラミング実習
担当:髙橋三郎氏 (産業技術総合研究所)
概要:深層学習による画像認識を利用した移動ロボット制御システムを作成することで、実際の研究、開発へのアプリケーション応用について学びます。
チュートリアル(第3部 推論結果の検証)
チュートリアル(第3部 データ収集・蓄積)

講習会に参加される方へ

第2,3部の実習には以下の準備が必要です。

必要機材

  • ノートPC
    • OS: Windowsをご用意下さい
    • Eclipseが動作する程度のスペックが必要です
    • メモリ: 1GB以上
    • CPU: Core2Duo以上
    • HDD空き: 5GB以上

Windowsのファイアウォールは必ず切っておいてください。 セキュリティーソフトにもファイアウォールが設定されている場合がありますので、そちらもOFFにしておいてください。

事前にインストールするソフトウエア

あらかじめインストールしておくべきソフトウエアは以下のとおりです。以下のリンクをクリックし、ファイルをダウンロード・インストールしてください。
一部のリンクはダウンロードページへ飛びますので、飛んだ先のページ内で適切なファイルをそれぞれダウンロードしてください。

OpenRTM-aist 1.1.2-RELEASE版 (C++版、Python版)

  • 1.1.2 からは一つのインストーラですべての言語とVisual Studioのバージョンに対応しいます。32bit/64bitのみ選択してください。(32bit推奨)
  • 1.1.2 は インストールしているVisual Studioのバージョンをシステム環境変数で指定しますので、設定を確認して下さい。デフォルトはvc2013の設定になっています。
  • デフォルト設定のままインストールして下さい。
  • OpenRTM-aistを10分で始めよう! を参考に、事前にサンプルコンポーネントを起動して動作確認を行っておいてください。

Python

  • Python2.7.14
    • OpenRTM-aistやPyYAMLをインストールする前にインストールしてください

その他

以下のソフトウェアも必須です。忘れずにインストールしてください。

  • PyYAML
  • Python パッケージ(第3部で使用します)
    • Chainer (Deep Learning フレームワーク) https://chainer.org/
      • pip install chainer でインストールできます
    • OpenCV (画像認識ライブラリ) http://opencv.jp/
      • pip install opencv-python でインストールできます
  • Python用のエディタ

講義資料

第1部

第3部

講習会の様子

171129-01.jpg

171129-02.jpg

171129-03.jpg

171129-04.jpg

チュートリアル(AIツール、第3部、「推論結果の検証」の実習)

目的

RTM(OpenRTM-aist)を利用し、人工知能技術を応用したロボットシステムを構築します.
深層学習による画像認識を利用した移動ロボット制御システムを作成することで、実際の研究、開発へのアプリケーション応用について学びます.

本チュートリアルで構築するRTシステム

カメラ入力により物体を認識し,認識した物体に応じたロボット速度制御を行うシステムを構築します.
実習時間の都合上,学習済みのモデルから推論するRTコンポーネント(ImageToObjectPrediction)を再利用します.
物体認識にはCNNでImageNetを事前に学習したモデルを使います(chainer + GooLeNet で実装してあります).

tutorial_jsai_3_0.png

NameToVelocityコンポーネントの作成

作成するRTコンポーネント

「NameToVelocity」というコンポーネントを作成します.
Webカメラで検知した物体の名前を入力とし、入力された名前によって速度を変更することで、ロボットを操作するコンポーネントです.

作成手順と開発環境

下記URLの「作成手順」「開発環境の確認」を参照ください
http://openrtm.org/openrtm/ja/node/6386

コンポーネントの仕様

NameToVelocityは「Webカメラで検知した物体の名前を入力とするインポート」と「ロボットの移動速度を出力するアウトポート」をそれぞれひとつずつ持ちます.

コンポーネント名 ポート名 型名 説明
NameToVelocity in TimedString Webカメラで検知した物体の名前を入力とするポート
out TimedVelocity2D ロボットの移動速度を出力とするポート

TimedVelocity2D型について

「TimedVelocity2Dについて」を参照ください
http://openrtm.org/openrtm/ja/node/6386

NameToVelocityコンポーネントのひな形の作成

NameToVelocityコンポーネントのひな形の作成は、「RTC Builder」を用いて行います.
まずは Eclipse を起動します.
Windows 8.1の場合は「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 1.1.2」>「OpenRTP」をクリックすると起動できます.
ワークスペースの場所を決める必要があるので指定してください.

tutorial_jsai_3_1.png

指定すると、下記の画面が表示されますが、Welcomeページは必要ないので閉じてください.

tutorial_jsai_3_2.png

「RTC Builder」のパースペクティブを開きます.

tutorial_jsai_3_3.png
tutorial_jsai_3_4.png

新規プロジェクトの作成

NameToVelocityコンポーネントを作成するために、RTC Builderで新規プロジェクトを作成します. 左上の「Open New RTC Builder Editor」アイコンをクリックしてください.

tutorial_jsai_3_5.png

プロジェクト名を入力するウインドウが開くので、プロジェクト名を入力してください.
サンプルとして、ここでは「NameToVelocity」としています.

tutorial_jsai_3_6.png

指定したプロジェクトが生成され、パッケージエクスプローラ内に表示されます.
生成したプロジェクト内には、デフォルトで設定されたRTCプロファイルのXML(RTC.xml)が自動で生成されます.

tutorial_jsai_3_7.png

RTCプロファイルエディタが起動されない場合

RTC.xmlが生成された時点で、RTC Builderのエディタが開らくはずですが、開かれていない場合は、パッケージエクスプローラのRTC.xmlをダブルクリックしてください.

プロファイル情報入力とコード生成

まず、一番左にある「基本」タブを選択し、基本情報を入力します.
先ほど決めた「NameToVelocity」コンポーネントの仕様(名前)の他に、概要やバージョン等を入力してください.
ラベルが赤字の項目は必須項目なので何か入力してください、その他はデフォルトで構いません.

tutorial_jsai_3_8.png

次に、「アクティビティ」タブを選択し、使用するアクションコールバックを指定します.

NameToVelocityコンポーネントでは、onActivated()、onDeactivated()、onExecute() コールバックを使用することとします.
下図のように①の onAtivated をクリック後に②のラジオボタンにて [ON] にチェックを入れて有効化します.
選択されている関数名は赤字になり、有効化すると背景色が青色に変化します.
onDeactivated、onExecute についても同様の手順を実施して有効化してください.

各コールバック関数の概要やいつ呼ばれるかを知りたい方は下記を参照願います.
http://openrtm.org/openrtm/ja/content/rtc開発の流れ

tutorial_jsai_3_9.png

次に、「データポート」タブを選択し、データポートの情報を入力します.
先ほど決めた仕様を元に以下のように入力します.
なお、変数名や表示位置の設定はオプションのため、そのままで問題ありません.

  • InPort Profile:
    • ポート名: in
    • データ型: TimedString
  • OutPort Profile:
    • ポート名: out
    • データ型: TimedVelocity2D
      tutorial_jsai_3_10.png

次に、「言語・環境」タブを選択し、プログラミング言語を選択します. ここでは、Python(言語)を選択します.
なお、プログラミング言語の選択はデフォルトが設定されておらず、指定しない場合にはコード生成時にエラーになりますので、必ず言語の指定を行ってください.

tutorial_jsai_3_11.png

最後に、「基本」タブにある [コード生成] ボタンをクリックしてコンポーネントのひな形を作成します.

tutorial_jsai_3_12.png

ソースコードの編集

自動生成された「NameToVelocity.py」をエディタで開いて編集します.
NameToVelocity.pyは、(指定したワークスペースディレクトリ)¥NameToVelocityフォルダの中にあります.

Pythonがインストールされていれば、標準で付属しているIDLEというエディタが使えるため、 WindowsであればNameToVelocity.pyを右クリックして""Edit with IDLE""を選択すれば編集することができます.

tutorial_jsai_3_13.png

変数初期化部分の修正

OpenRTM-aist 1.1.2のRTC Builderを使用している場合は、変数初期化部分を修正する必要があります. (OpenRTM-aist 1.2.0では修正される予定です)
init関数内の"self._d_in"と"self._d_out"変数初期化部分を修正します. (ポート名をin,out以外に設定している場合は、self._d_XXXを設定した名前で適宜読み替えてください)

変更前

    def __init__(self, manager):
        OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
        
        in_arg = [None] * ((len(RTC._d_TimedString) - 4) / 2)
        self._d_in = RTC.TimedString(*in_arg)
        """
        """
        self._inIn = OpenRTM_aist.InPort("in", self._d_in)
        out_arg = [None] * ((len(RTC._d_TimedVelocity2D) - 4) / 2)
        self._d_out = RTC.TimedVelocity2D(*out_arg)
        """
        """
        self._outOut = OpenRTM_aist.OutPort("out", self._d_out)

変更後

    def __init__(self, manager):
        OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
        
        #in_arg = [None] * ((len(RTC._d_TimedString) - 4) / 2)
        #self._d_in = RTC.TimedString(*in_arg)
        #以下の行を追加
        self._d_in = RTC.TimedString(RTC.Time(0,0), "")
        """
        """
        self._inIn = OpenRTM_aist.InPort("in", self._d_in)
        
        #out_arg = [None] * ((len(RTC._d_TimedVelocity2D) - 4) / 2)
        #self._d_out = RTC.TimedVelocity2D(*out_arg)
        #以下の行を追加
        self._d_out = RTC.TimedVelocity2D(RTC.Time(0,0), RTC.Velocity2D(0.0, 0.0, 0.0))
        """
        """
        self._outOut = OpenRTM_aist.OutPort("out", self._d_out)

アクティビティ処理の実装

NameToVelocityコンポーネントの仕様に従い、入力された文字列によって速度を変換する処理を記述します.

    def onActivated(self, ec_id):
        #ロボットへの出力を初期化しておく
        self._d_out.data.vy = 0.0
        self._d_out.data.vx = 0.0
        self._d_out.data.va = 0.0
        self._outOut.write()
        
        return RTC.RTC_OK

    def onDeactivated(self, ec_id):
        #ロボットを停止する
        self._d_out.data.vy = 0.0
        self._d_out.data.vx = 0.0
        self._d_out.data.va = 0.0
        self._outOut.write()
        
        return RTC.RTC_OK

    def onExecute(self, ec_id):
        # 入力データが存在するか確認
        if self._inIn.isNew():
            # 入力データが存在する場合には、データを別変数に格納
            data = self._inIn.read()
            
            # 入力データの文字列に応じてロボットを操作する
            if data.data == "bow tie":
                self._d_out.data.vx = 0.5
            
            elif data.data == "hook":
                self._d_out.data.vx = -0.5
            
            elif data.data == "pinwheel":
                self._d_out.data.va = 0.3
            
            elif data.data == "envelope":
                self._d_out.data.va = -0.3
                
            else:
                self._d_out.data.vx = 0
                self._d_out.data.vy = 0
                self._d_out.data.va = 0
                
            self._outOut.write()
        
        return RTC.RTC_OK

NameToVelocityコンポーネントの動作確認

まず、シミュレータ上で動作確認を行います.

シミュレーター上の Raspberry Pi マウスでの確認

下記URLの「シミュレータ」を参照ください.
http://openrtm.org/openrtm/ja/node/6386

NameServiceの起動

コンポーネントの参照を登録するためのネームサービスを起動します。
「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 1.1.2」の順に辿り、「Start Naming Service」をクリックしてください.
※ 「Start Naming Service」をクリックしても omniNames が起動されない場合は、フルコンピュータ名が14文字以内に設定されているかを確認してください.

RT System Editorの起動

コンポーネントをGUIで操作するために「RT System Editor」を起動します.

tutorial_jsai_3_sim0.png
tutorial_jsai_3_sim0_1.png

起動するとNameServerView に先ほど起動したネームサーバーが表示されます.

tutorial_jsai_3_sim0_2.png

※もし、NameServerView にネームサーバーが表示されない時は、手動で localhost を追加します.
画像の [ネームサーバの追加] をクリックしダイアログを表示します.
localhost と入力し、[OK] をクリックして追加できます.

tutorial_jsai_3_sim1.png

NameToVelocityコンポーネントの起動

NameToVelocityコンポーネントを起動します.
作成したNameToVelocity.ファイルをダブルクリックしてください.

NameServerView上にNameToVelocityコンポーネントが表示され、Drag&Dropすれば「System Diagram」上で他のコンポーネントと接続できるようになります.

tutorial_jsai_3_sim2.png

シミュレータなど他のコンポーネントの起動と接続

ImageToObjectPrediction.py, OpenCVCameraComp.exe, CameraViewerComp.exeとRaspberryPiMouseSimulatorComp.exeも同様に起動して「System Diagram」上で接続してください.

tutorial_jsai_3_sim3.png

コンポーネントのActivate

「RT System Editor」の上部にある[All Activate] というアイコンをクリックし、全てのコンポーネントをアクティブ化します.
※下図のように、「System Diagram」上で右クリックすることでもアクティブ化できます.

tutorial_jsai_3_sim4.png

正常にアクティベートされた場合には、すべてのコンポーネントが黄緑色で表示され,動作を確認することができます.
カメラで検知した物体によって、シミュレータ上のマウスの操作ができるか確認してください.
なお、ImageToObjectPredictionのコンソールで、どのような文字列がNameToVelocityの入力となっているか確認できます.

tutorial_jsai_3_sim5.png

Activate後にNameToVelocityのソースコードを変更したい場合には、「All Deactivate」を実施した後、NameToVelocityを「Exit」してソースコードを変更してください.
再度、NameToVelocityコンポーネントを起動して接続した後、「All Activate」すれば変更した動作が確認できます.

カメラデバイスの切り替え

内臓カメラのあるPCでWebカメラをお使いの場合、内臓カメラの映像が表示されるかもしれません.
Webカメラなどに切り替えたい場合には、「Ssytem Diagram」上でOpenCVCameraCompをクリックして下図の「device_num」の値を「1」などに変更してください.
動作中に変更可能です.

tutorial_jsai_3_sim6.png

RT Systemの保存と復元

保存:RT Systemを保存する場合は System Diagram 上で右クリックして [Save As...] を選択してください.
復元:復元する場合は [Open and Restore] を選択して、先ほど保存したファイルを選択します.

実機での動作確認

電源の入れ方や注意点の記載が下記にあるので参照ください.
http://openrtm.org/openrtm/ja/node/6386 の「実機での動作確認」以降を参照ください.

コンポーネントの接続例

シミュレータの時と同様にコンポーネントを接続した後、Activateしてください.

tutorial_jsai_3_15.png

チュートリアル(AIツール、第3部、「データ収集・蓄積」の実習)

目的

RTM(OpenRTM-aist)を利用し、人工知能技術を応用したロボットシステムを構築します.
深層学習による画像認識を利用した移動ロボット制御システムを作成することで、実際の研究、開発へのアプリケーション応用について学びます.

本チュートリアルで構築するRTシステム

ロボットをジョイスティックで操作し,その際のカメラ入力やセンサ入力値を自動的に収集するシステムを構築します.
実習時間の都合上,既存の画像収集コンポーネント(ImageDataCollector)を再利用し,ロボットのセンサ入力取得,ファイルへの保存機能を追加します.

tutorial_jsai_3b_0.png

ImageDataCollectorコンポーネントの改造

改造するRTコンポーネント

「ImageDataCollector」というコンポーネントを改造します.
Webカメラの画像を入力とし、入力された画像を定期的にファイルとして保存するコンポーネントです.

作成手順と開発環境

下記URLの「作成手順」「開発環境の確認」を参照ください.
http://openrtm.org/openrtm/ja/node/6386

また,下記のパッケージも事前にインストールしておいてください.

  • Python パッケージ
    • OpenCV (画像認識ライブラリ) http://opencv.jp/
      • pip install opencv-python でインストールできます
    • 画像保存コンポーネント ImageDataCollector

コンポーネントの仕様

ImageDataCollectorは「Webカメラ画像を入力とするインポート」をひとつ持っています.
ここに「ロボットの近接センサ値を入力とするインポート」をひとつ追加します.

コンポーネント名 ポート名 型名 説明
ImageDataCollector image CameraImage Webカメラ画像を入力とするポート
sensor TimedShortSeq ロボットの近接センサ値を入力とするポート

ImageDataCollectorコンポーネントへのポート追加

ImageDataCollectorコンポーネントに新しいポートを追加する作業を「RTC Builder」を用いて行います.
まず Eclipse を起動します.
Windows 8.1の場合は「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 1.1.2」>「OpenRTP」をクリックすると起動できます.
ワークスペースの場所を決める必要があるので指定してください.

tutorial_jsai_3_1.png

指定すると、下記の画面が表示されますが、Welcomeページは必要ないので閉じてください.

tutorial_jsai_3_2.png

「RTC Builder」のパースペクティブを開きます.

tutorial_jsai_3_3.png
tutorial_jsai_3_4.png

新規プロジェクトの作成

ImageDataCollectorコンポーネントを作成するために、RTC Builderで新規プロジェクトを作成します. 左上の「Open New RTC Builder Editor」アイコンをクリックしてください.

tutorial_jsai_3_5.png

プロジェクト名を入力するウインドウが開くので、プロジェクト名を入力してください.
ここでは「ImageDataCollector」としています.

tutorial_jsai_3b_6.png

指定したプロジェクトが生成され、パッケージエクスプローラ内に表示されます.

プロファイルの読み込み

RTC Builder には既存のコンポーネントのプロファイルを読み込み,追加,修正できる機能があります.
「基本」タブにある「プロファイル情報のインポート・エクスポート」の「インポート」ボタンをクリックし,改造元のImageDataCollectorにあるRTC.xmlを選択します.
下記画面のようにモジュール概要などが読み込まれていれば成功です.

tutorial_jsai_3b_10.png

ポートの追加

次に、「データポート」タブを選択し、データポートの情報を入力します.
追加するポート仕様を元に以下のように入力します.
なお、変数名や表示位置の設定はオプションのため、そのままで問題ありません.

  • InPort Profile:
    • ポート名: sensor
    • データ型: TimedShortSeq
      tutorial_jsai_3b_11.png

最後に、「基本」タブにある [コード生成] ボタンをクリックしてコンポーネントのひな形を作成します.

tutorial_jsai_3b_12.png

ソースコードの編集

自動生成された「ImageDataCollector.py」をエディタで開いて編集します.
RTCBuilderには既存コードとのマージ機能もあるのですが,所望のコード形式にならないことがあるので,今回は手作業でマージします.
ImageDataCollector.pyは、(指定したワークスペースディレクトリ)¥ImageDataCollectorフォルダの中にあります.

Pythonがインストールされていれば、標準で付属しているIDLEというエディタが使えるため、 WindowsであればImageDataCollector.pyを右クリックして""Edit with IDLE""を選択すれば編集することができます.

tutorial_jsai_3_13.png

変数初期化部分の修正

init関数内に"self._d_sensor"変数初期化部分と必要なパッケージのimport文を追加します. (ポート名をsensor以外に設定している場合は、self._d_XXXを設定した名前で適宜読み替えてください)

変更前

    import sys
    import time
    sys.path.append(".")
    
    # Import RTM module
    import RTC
    import OpenRTM_aist

    def __init__(self, manager):
        OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
        
        image_arg = [None] * ((len(RTC._d_CameraImage) - 4) / 2)
        self._d_image = RTC.CameraImage(*in_arg)
        """
        """
        self._imageIn = OpenRTM_aist.InPort("image", self._d_image)
        sensor_arg = [None] * ((len(RTC._d_TimedShortSeq) - 4) / 2)
        self._d_sensor = RTC.TimedShortSeq(*sensor_arg)
        """
        """
        self._sensorIn = OpenRTM_aist.InPort("sensor", self._d_sensor)

変更後

    import sys
    import time
    import os
    sys.path.append(".")
    
    # Import RTM module
    import RTC
    import OpenRTM_aist
    
    import cv2
    import numpy as np
    from datetime import datetime as dt

    def __init__(self, manager):
        OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
        
        self._d_image = RTC.CameraImage(RTC.Time(0, 0), 0, 0, 0, [], 0, [])
        self._imageIn = OpenRTM_aist.InPort("image", self._d_image)
        
        self._d_sensor = RTC.TimedShortSeq(RTC.Time(0, 0), [])
        self._sensorIn = OpenRTM_aist.InPort("sensor", self._d_sensor)

アクティビティ処理の実装

ImageDataCollectorコンポーネントの仕様に従い、入力されたでーたを保存する処理を記述します.

    def onActivated(self, ec_id):
        # 変数の初期化
        self._count = 0
        t = dt.now()
        
        # センサ用出力ディレクトリ作成
        self._image_dir = "image_" + t.strftime('%Y%m%d')
        if not os.path.exists(self._image_dir):
            os.mkdir(self._image_dir)
        
        # センサ用出力ディレクトリ作成
        self._sensor_dir = "sensor_" + t.strftime('%Y%m%d')
        if not os.path.exists(self._sensor_dir):
            os.mkdir(self._sensor_dir)
        
        self._f = open(self._sensor_dir + "/sensor.csv", 'w')
        
        return RTC.RTC_OK

    def onDeactivated(self, ec_id):
        self._count = 0
        self._f.close()
        
        return RTC.RTC_OK

    def onExecute(self, ec_id):
        if self._imageIn.isNew():
            # 画像イメージの変換
            data = self._imageIn.read()
            frame = np.frombuffer(data.pixels, dtype=np.uint8)
            frame = frame.reshape(data.height, data.width, 3)
            
            # 画像イメージの保存
            cv2.imwrite(self._image_dir + "/" + str(self._count) + ".png", frame)
            self._count += 1
            
        if self._sensorIn.isNew():
            # センサデータの保存
            data = self._sensorIn.read()
            self._f.write(",".join(map(str, data.data)) + "\n")
            
        return RTC.RTC_OK

ImageDataCollector改造コンポーネントの動作確認

まず、シミュレータ上で動作確認を行います.

シミュレーター上の Raspberry Pi マウスでの確認

下記URLの「シミュレータ」を参照ください.
http://openrtm.org/openrtm/ja/node/6386

NameServiceの起動

コンポーネントの参照を登録するためのネームサービスを起動します。
「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 1.1.2」の順に辿り、「Start Naming Service」をクリックしてください.
※ 「Start Naming Service」をクリックしても omniNames が起動されない場合は、フルコンピュータ名が14文字以内に設定されているかを確認してください.

RT System Editorの起動

コンポーネントをGUIで操作するために「RT System Editor」を起動します.

tutorial_jsai_3_sim0.png
tutorial_jsai_3_sim0_1.png

起動するとNameServerView に先ほど起動したネームサーバーが表示されます.

tutorial_jsai_3_sim0_2.png

※もし、NameServerView にネームサーバーが表示されない時は、手動で localhost を追加します.
画像の [ネームサーバの追加] をクリックしダイアログを表示します.
localhost と入力し、[OK] をクリックして追加できます.

tutorial_jsai_3_sim1.png

コンポーネントの起動

下記のコンポーネントを起動します.
正しく起動が完了した場合,NameServerView上に各コンポーネントが表示され、Drag&Dropすれば「System Diagram」上で他のコンポーネントと接続できるようになります.

ImageDataCollector.py

作成したImageDataCollector.pyファイルをダブルクリックもしくはコマンドプロンプトからpython ImageDataCollector.pyとして起動して下さい.

OpenCVCameraComp.exe

OpenRTM-aistインストール時に同時にインストールされています.
Windowsの検索(Windowsアイコン押下時のプログラムとファイルの検索など)を用い,OpenCVCameraComp.exeを起動して下さい.

CameraViewerComp.exe

OpenRTM-aistインストール時に同時にインストールされています.
Windowsの検索(Windowsアイコン押下時のプログラムとファイルの検索など)を用い,CameraViewerComp.exeを起動して下さい.

RaspberryPiMouseSimulatorComp.exe

USBメモリで配布されたEXEフォルダにあるRaspberryPiMouseSimulatorComp.exeをダブルクリックして起動して下さい.

RobotController.py

第2部で作成したRobotController.pyをダブルクリックして起動して下さい.

tutorial_jsai_3_sim2.png

コンポーネントの接続

「System Diagram」上で下図のようにポートを接続してください.

tutorial_jsai_3b_sim3.png

コンポーネントのActivate

「RT System Editor」の上部にある[All Activate] というアイコンをクリックし、全てのコンポーネントをアクティブ化します.
※下図のように、「System Diagram」上で右クリックすることでもアクティブ化できます.

tutorial_jsai_3_sim4.png

正常にアクティベートされた場合には、すべてのコンポーネントが黄緑色で表示され,動作を確認することができます.
RobotControllerによって、シミュレータ上のマウスの操作ができるか確認してください.
また,ImageDataCollectorを起動したフォルダに画像やセンサ情報が自動で蓄積されていることを確認してください.

tutorial_jsai_3_sim5.png

Activate後にImageDataCollectorのソースコードを変更したい場合には、「All Deactivate」を実施した後、ImageDataCollectorを「Exit」してソースコードを変更してください.
再度、ImageDataCollectorコンポーネントを起動して接続した後、「All Activate」すれば変更した動作が確認できます.

カメラデバイスの切り替え

内臓カメラのあるPCでWebカメラをお使いの場合、内臓カメラの映像が表示されるかもしれません.
Webカメラなどに切り替えたい場合には、「Ssytem Diagram」上でOpenCVCameraCompをクリックして下図の「device_num」の値を「1」などに変更してください.
動作中に変更可能です.

tutorial_jsai_3_sim6.png

RT Systemの保存と復元

保存:RT Systemを保存する場合は System Diagram 上で右クリックして [Save As...] を選択してください.
復元:復元する場合は [Open and Restore] を選択して、先ほど保存したファイルを選択します.

実機での動作確認

電源の入れ方や注意点の記載が下記にあるので参照ください.
http://openrtm.org/openrtm/ja/node/6386 の「実機での動作確認」以降を参照ください.

コンポーネントの接続例

シミュレータの時と同様にコンポーネントを接続した後、Activateしてください.