チュートリアル(Raspberry Pi Mouse、RTM講習会)

チュートリアル(RTコンポーネントの作成入門、Raspberry Pi Mouse、Windows)

※OpenRTM-aist 1.2と2.0でOpenRTPのボタンのアイコンが変わっている場合があります。以下のアイコンについては注意してください。

/ja/node/6550

はじめに

このページではシミュレーター上の Raspberry Pi マウスを操作するためのコンポーネントの作成手順を説明します。

/ja/node/6198

資料のダウンロード

まずは資料をダウンロードしてください。講習会でUSBメモリを配布している場合はダウンロードは不要です。

ZIPファイルは右クリック「すべて展開」で展開するか、7ZIPや Lhaplus 等などのツールで展開してください。

注意:ダブルクリックすると中身は見ることはできますが、それだけでは展開されませんのでご注意ください。

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。

シミュレーター

シミュレーターは Open Dynamics Engine(ODE) という物理演算エンジンと ODE 付属の描画ライブラリ(drawstuff)を使用して開発しています。 OpenGL が動作すれば動くので、大抵の環境で動作するはずです。

以下の Raspberry Piマウス というロボットのシミュレーションができます。

/jp/node/6005

シミュレーター上の Raspberry Pi マウスの動力学計算、接触応答だけではなく、距離センサーのデータも現実のロボットに近い値を再現するようにしています。

Raspberry Piマウスの仕様

Raspberry Piマウスはアールティが販売している独立二輪駆動型の移動ロボットです。

/ja/node/6550

Raspberry Piマウスの仕様
CPU Raspberry Pi 2 Model B(Raspberry Piマウス v2)、Raspberry Pi 3 Model B(Raspberry Piマウス v3)
モーター ステッピングモーターST-42BYG020 2個
モータードライバー SLA7070MRPT 2個
距離センサー 赤色LED+フォトトランジスタ(ST-1K3) 4個
モニター用赤色LED 4個
ブザー 1個
スイッチ 3個
バッテリー LiPo3セル(11.1V)1000mAh 1個

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

  • RobotController コンポーネント

RaspberryPiMouseSimulator コンポーネントと接続してシミュレーター上のロボットを操作するためのコンポーネントです。

RobotController コンポーネントの作成

GUI(スライダー)によりシミュレーター上のロボットの操作を行い、センサー値が一定以上の時には自動的に停止するコンポーネントの作成を行います。

/ja/node/6310

作成手順

作成手順は以下の通りです。

  • 開発環境の確認
  • コンポーネントの仕様を決める
  • RTC Builderによるソースコードのひな型コードの作成
  • ソースコードの編集
  • コンポーネントの動作確認

開発環境の確認

以下の環境を想定しています。

コンポーネントの仕様

RobotController は目標速度を出力するアウトポート、センサー値を入力するインポート、目標速度や停止するセンサー値を設定するコンフィギュレーションパラメーターを持っています。

コンポーネント名称 RobotController
InPort
ポート名 in
RTC::TimedShortSeq
説明 センサー値
OutPort
ポート名 out
RTC::TimedVelocity2D
説明 目標速度
Configuration
パラメーター名 speed_x
double
デフォルト値 0.0
制約 -1.5<x<1.5
Widget slider
Step 0.01
説明 直進速度の設定
Configuration
パラメーター名 speed_r
double
デフォルト値 0.0
制約 -2.0<x<2.0
Widget slider
Step 0.01
説明 回転速度の設定
Configuration
パラメーター名 stop_d
int
デフォルト値 30
説明 停止するセンサー値の設定

TimedVelocity2D 型について

2次元平面上の移動ロボットの移動速度を格納するデータ型である TimedVelocity2D 型を使用します。

     struct Velocity2D
     {
           /// Velocity along the x axis in metres per second.
           double vx;
           /// Velocity along the y axis in metres per second.
           double vy;
           /// Yaw velocity in radians per second.
           double va;
     };
 
 
     struct TimedVelocity2D
     {
           Time tm;
           Velocity2D data;
     };

このデータ型にはX軸方向の速度vx、Y軸方向の速度vy、Z軸周りの回転速度vaが格納できます。

vxvyvaはロボット中心座標系での速度を表しています。


/ja/node/6042

vxはX方向の速度、vyはY方向の速度、vaはZ軸周りの角速度です。

Raspberry Pi マウスのように2個の車輪が左右に取り付けられているロボットの場合、横滑りしないと仮定するとvyは0になります。

直進速度vx、回転速度vaを指定することでロボットの操作を行います。

距離センサーのデータについて

Raspberry Pi マウスの距離センサーのデータは物体との距離が近づくほど大きな値を出力するようになっています。


/ja/node/6550

デバイスファイルから取得した数値 実際の距離[m]
1394 0.01
792 0.02
525 0.03
373 0.04
299 0.05
260 0.06
222 0.07
181 0.08
135 0.09
100 0.10
81 0.15
36 0.20
17 0.25
16 0.30

シミュレーターではこの値を再現して出力しています。 RobotController コンポーネントではこの値が一定以上の時に自動的に停止する処理を実装します。

RobotController コンポーネントのひな型コードの生成

RobotController コンポーネントのひな型コードの生成は、RTCBuilder を用いて行います。

RTCBuilder の起動

OpenRTP では、各種作業を行うフォルダーを「ワークスペース」(Work Space)とよび、原則としてすべての生成物はこのフォルダーの下に保存されます。

まずは OpenRTP を起動します。

デスクトップのショートカットをダブルクリックして起動してください。


/ja/node/6550

最初にワークスペースの場所を尋ねられますので、適当なフォルダを指定してください。
/ja/node/6550

すると、以下のようなWelcomeページが表示されます。


/ja/node/6550
OpenRTP の初期起動時の画面

Welcomeページはいまは必要ないので左上の「×」ボタンをクリックして閉じてください。

右上の [Open Perspective] ボタンをクリックしてください。

/ja/node/6026
パースペクティブの切り替え

「RTC Builder」を選択することで、RTCBuilder が起動します。メニューバーに「カナヅチとRT」の RTCBuilder のアイコンが表示されます。

/ja/node/6550
パースペクティブの選択

新規プロジェクトの作成

RobotController コンポーネントを作成するために、RTC Builder で新規プロジェクトを作成する必要があります。

左上の [Open New RTCBuilder Editor] のアイコンをクリックしてください。

/ja/node/6057
RTC Builder 用プロジェクトの作成

「プロジェクト名」欄に作成するプロジェクト名 (ここでは RobotController) を入力して [終了] ボタンをクリックします。

/ja/node/6310

指定した名称のプロジェクトが生成され、パッケージエクスプローラ内に追加されます。

/ja/node/6310

生成したプロジェクト内には、デフォルト値が設定された RTC プロファイル XML(RTC.xml) が自動的に生成されます。

RTC プロファイルエディタの起動

RTC.xml が生成された時点で、このプロジェクトに関連付けられているワークスペースとして RTCBuilder のエディタが開くはずです。 もし起動しない場合はパッケージエクスプローラーの RTC.xml をダブルクリックしてください。

/ja/node/6026

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

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

  • コンポーネント名: RobotController
  • 概要: 任意(Robot Controller component)
  • バージョン: 任意(1.0.0)
  • ベンダ名: 任意
  • カテゴリ: 任意(Controller)


 /ja/node/6550
基本情報の入力


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

RobotController コンポーネントでは、onActivated()、onDeactivated()、onExecute() コールバックを使用します。下図のように①の onAtivated をクリック後に②のラジオボタンにて [ON] にチェックを入れます。 onDeactivated、onExecute についても同様の手順を行います。


/ja/node/6310
アクティビティコールバックの選択


さらに、「データポート」タブを選択し、データポートの情報を入力します。 先ほど決めた仕様を元に以下のように入力します。なお、変数名や表示位置はオプションで、そのままで結構です。


  • InPort Profile:
    • ポート名: in
    • データ型: RTC::TimedShortSeq

  • OutPort Profile:
    • ポート名: out
    • データ型: RTC::TimedVelocity2D


/ja/node/6310
データポート情報の入力


次に、「コンフィギュレーション」タブを選択し、先ほど決めた仕様を元に、Configuration の情報を入力します。 制約条件および Widget とは、RTSystemEditor でコンポーネントのコンフィギュレーションパラメーターを表示する際に、スライダー、スピンボタン、ラジオボタンなど、GUI で値の変更を行うためのものです。

直進速度 speed_x、回転速度 speed_r はスライダーのより操作できるようにします。


  • speed_x
    • 名称: speed_x
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -1.5<x<1.5
    • Widget: slider
    • Step: 0.01
  • speed_r
    • 名称: speed_r
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -2.0<x<2.0
    • Widget: slider
    • Step: 0.01
  • stop_d
    • 名称: stop_d
    • データ型: int
    • デフォルト値: 30
    • Widget: text


/ja/node/6310
コンフィグレーション情報の入力


次にプログラミング言語の選択とコードの生成を行いますが、OpenRTM-aist 2.0と1.2でツールの仕様が変わっています。

まずは2.0以降のバージョンの手順について説明します。

「基本」タブを選択して、下にスクロールすると見える「言語」の項目でC++を選択します。

/ja/node/7151

次に1.2.2以前のバージョンの手順について説明します。

「言語・環境」タブを選択し、プログラミング言語を選択します。ここでは、C++(言語)を選択します。なお、言語・環境はデフォルト等が設定されておらず、指定し忘れるとコード生成時にエラーになりますので、必ず言語の指定を行うようにしてください。

/ja/node/6310
プログラミング言語の選択


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


/ja/node/6310
ひな型コードの生成(Generate)


プロジェクトを右クリックして、「表示方法」→「システム・エクスプローラー」を選択するとワークスペースをエクスプローラーで開くことができます。

/ja/node/6550

CMake によるビルドに必要なファイルの生成

RTC Builder で生成したコードの中には CMake でビルドに必要な各種ファイルを生成するための CMakeLists.txt が含まれています。 CMake を利用することにより CMakeLists.txt からVisual Studio のプロジェクトファイル、ソリューションファイル、もしくは Makefile 等を自動生成できます。

CMake(cmake-gui) の操作

CMake を利用してビルド環境の Configure を行います。 まずは CMake(cmake-gui) を起動してください。Windows 10の場合は左下の「ここに入力して検索」にCMakeと入力して検索してください。

/ja/node/6310
CMake GUI の起動とディレクトリーの指定

画面上部に以下のようなテキストボックスがありますので、それぞれソースコードの場所 (CMakeList.txtがある場所) と、ビルドディレクトリーを指定します。

  • Where is the soruce code
  • Where to build the binaries

ソースコードの場所は RobotController コンポーネントのソースが生成された場所で CMakeList.txt が存在するディレクトリーです。 デフォルトでは <ワークスペースディレクトリー>/RobotController になります。

このディレクトリーはエクスプローラから cmake-gui にドラッグアンドドロップすると手入力しなくても設定されます。

ビルドディレクトリーとは、ビルドするためのプロジェクトファイルやオブジェクトファイル、バイナリを格納する場所のことです。 場所は任意ですが、この場合 <ワークスペースディレクトリー>/RobotController/build のように分かりやすい名前をつけた RobotController のサブディレクトリーを指定することをお勧めします。

Where is the soruce code C:\workspace\RobotController
Where to build the binaries C:\workspace\RobotController\build

指定したら、下の [Configure] ボタンをクリックします。すると下図のようなダイアログが表示されますので、生成したいプロジェクトの種類を指定します。 今回は Visual Studio 16 2022 とします。Visual Studio 2017や Visual Studio 2019を利用している方はそれぞれ変更してください。

/ja/node/6550
生成するプロジェクトの種類の指定

ダイアログで [Finish] ボタンをクリックすると Configure が始まります。 問題がなければ下部のログウインドウに「Configuring done」と出力されますので、続けて [Generate] ボタンをクリックします。 「Generating done」と出ればプロジェクトファイル・ソリューションファイル等の出力が完了します。

なお、CMake は Configure の段階でキャッシュファイルを生成しますので、トラブルなどで設定を変更したり環境を変更した場合は [File] > [Delete Cache] でキャッシュを削除して Configure からやり直してください。

ヘッダ、ソースの編集

次に先ほど指定した build ディレクトリーの中の RobotController.sln をダブルクリックして Visual Studioを起動します。

※cmake-gui の新しいバージョンでは cmake-gui 上のボタンをクリックすることで起動できます。


/ja/node/6310

ヘッダ (include/RobotController/RobotController.h) およびソースコード (src/RobotController.cpp) をそれぞれ編集します。 Visual Studio のソリューションエクスプローラから RobotController.h、RobotController.cpp をクリックすることで編集画面が開きます。
/ja/node/6550

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

RobotController コンポーネントでは、コンフィギュレーションパラメーター(speed_x、speed_y)をスライダーで操作しその値を目標速度としてアウトポート(out)から出力します。 インポート(in) から入力された値を変数に格納して、その値が一定以上の場合は停止するようにします。


onActivated()、onExecute()、onDeactivated() での処理内容を下図に示します。

/ja/node/6310
アクティビティ処理の概要


ヘッダファイル (RobotController.h) の編集

センサー値を一時的に格納する変数 sensor_data を宣言します。

   private:
      int sensor_data[4];    //センサー値を一時格納する変数

ソースファイル (RobotController.cpp) の編集

下記のように、onActivated()、onDeactivated()、onExecute() を実装します。

 RTC::ReturnCode_t RobotController::onActivated(RTC::UniqueId ec_id)
 {
         //センサー値初期化
         for (int i = 0; i < 4; i++)
         {
                 sensor_data[i] = 0;
         }
 
         return RTC::RTC_OK;
 }

 RTC::ReturnCode_t RobotController::onDeactivated(RTC::UniqueId ec_id)
 {
         //ロボットを停止する
         m_out.data.vx = 0;
         m_out.data.va = 0;
         m_outOut.write();
 
         return RTC::RTC_OK;
 }

 RTC::ReturnCode_t RobotController::onExecute(RTC::UniqueId ec_id)
 {
         //入力データの存在確認
         if (m_inIn.isNew())
         {
             //入力データ読み込み
             m_inIn.read();
             for (int i = 0; i < m_in.data.length(); i++)
             {
                 //入力データ格納
                 if (i < 4)
                 {
                     sensor_data[i] = m_in.data[i];
                 }
             }
         }
 
         //前進するときのみ停止するかを判定
         if (m_speed_x > 0)
         {
             for (int i = 0; i < 4; i++)
             {
                 //センサー値が設定値以上か判定
                 if (sensor_data[i] > m_stop_d)
                 {
                         //センサー値が設定値以上の場合は停止
                         m_out.data.vx = 0;
                         m_out.data.va = 0;
                         m_outOut.write();
                         return RTC::RTC_OK;
                 }
             }
         }
         //設定値以上の値のセンサーが無い場合はコンフィギュレーションパラメーターの値で操作
         m_out.data.vx = m_speed_x;
         m_out.data.va = m_speed_r;
         m_outOut.write();
           return RTC::RTC_OK;
 }

Visual Studio によるビルド

ビルドの実行

Visual Studioの [ビルド] >「ソリューションのビルド」を選択してビルドを行います。


/ja/node/6026
ビルドの実行


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

作成した RobotController をシミュレーターコンポーネントと接続して動作確認を行います。

RTSystemEditorの起動

OpenRTPのパースペクティブを開くのウインドウからRT System Editorを選択して起動します。


/ja/node/6550

NameService の起動

コンポーネントの参照を登録するためのネームサービスを起動します。


RT System Editorのネームサービス起動ボタンを押すと起動します。

/ja/node/6550

※ 「Start Naming Service」をクリックしても omniNames が起動されない場合は、フルコンピュータ名が14文字以内に設定されているかを確認してください。

RobotController コンポーネントの起動

RobotController コンポーネントを起動します。

RobotController\build\src\Debug(もしくは、Release)フォルダーの RobotControllerComp.exe ファイルを実行してください。

シミュレーターコンポーネントの起動

このコンポーネントは先ほどダウンロードしたファイル(RTM_Tutorial.zip)を展開したフォルダーの EXE/RaspberryPiMouseSimulatorComp.exe を実行すると起動します。

コンポーネントの接続

下図のように、RTSystemEditor にて RobotController コンポーネント、RaspberryPiMouseSimulator コンポーネントを接続します。

/ja/node/6310
コンポーネントの接続

コンポーネントのActivate

RTSystemEditor の上部にあります [Activate Systems] というアイコンをクリックし、全てのコンポーネントをアクティブ化します。 正常にアクティベートされた場合、下図のように黄緑色でコンポーネントが表示されます。


/ja/node/6550
コンポーネントのアクティブ化


動作確認

下図のようにコンフィギュレーションビューの [編集] ボタンからコンフィギュレーションを変更することができます。


/ja/node/6310

スライダーを操作してシミュレーター上の [Raspberry Pi] マウスの操作ができるかを確認してください。


/ja/node/6310
コンフィギュレーションパラメーターの変更


実機での動作確認

講習会で Raspberry Pi マウス実機を用意している場合は実機での動作確認が可能ですので、時間に余裕がある人は試してみてください。

手順は以下の通りです。

  • Raspberry Pi マウスの電源を投入する
  • Raspberry Pi マウスのアクセスポイントに接続
  • ポートの接続
  • コンポーネントのアクティブ化

電源を投入する

Raspberry PiマウスにはRaspberry Piの電源スイッチとモーターの電源スイッチの2つがあります。


/ja/node/6550


内側の電源スイッチをオンにするとRaspberry Piが起動します。


/ja/node/6550


電源を切る場合

Raspberry Piの電源を切る場合は、電源スイッチから直接オフにはしないようにしてください。 3つ並んだボタンの中央のボタンを数秒押すとシャットダウンが始まります。 10秒程度でRaspbianのシャットダウンが終了するため、その後に電源スイッチをオフにしてください。


/ja/node/6042

アクセスポイントに接続

アクセスポイントへの接続方法は以下のページを参考にしてください。

SSID、パスワードは Rasoberry Pi マウスに貼り付けたシールに記載してあります。

まず右下のネットワークアイコンをクリックしてください。


/ja/node/6042

次に一覧から raspberrypi_*** (もしくはRPiMouse***)を選択してください。


/ja/node/6042

パスワードを入力してください。


/ja/node/6042

※ネットワークが切り替わった場合にネームサーバーへのコンポーネントの登録やポートの接続が失敗する場合があるのでOpenRTP、ネームサーバ、コンポーネントを一旦全て終了してください。 ネットワーク切り替え後に起動した場合には問題ないので、終了させる必要はありません。

OpenRTPを終了するには右上の×を押して終了してください。システムダイアグラムを保存するかどうか聞かれますが、Don't Saveを選択してください。

/ja/node/6550

OpenRTPをデスクトップのショートカットをダブルクリックして起動してください。

RT System Editor上でネームサーバーを再起動するには「ネームサービスを起動」ボタンを再度クリックします。

/ja/node/6550

Raspberry Pi上のネームサーバー、RTC起動

※この作業は以下のRaspberry Piマウス V3 (LiDARが付属している) で必要な作業です。Raspberry Piマウス V2 (LiDARが付属していない) の場合は次の作業へ進んでください。

23b47429c42d672e7f94ae0a3c9c9d6c.png

Edge、Chrome、Firefox等のWEBブラウザで192.168.11.1のアドレスにアクセスしてください。

/jp/node/6550

するとRaspberryPiMouse with OpenRTM-aistの画面が表示されます。

まずはネームサーバーを起動するため、Start NameServerボタンを押してください。

/jp/node/6550

RaspberryPiMouseRTCStartを押してください。

/jp/node/6550

元の画面に戻らない場合はBack to the top page.をクリックしてください。

/jp/node/6550

これで完了です。

ネームサーバー追加

続いてRTシステムエディタの [ネームサーバー追加] ボタンで 192.168.11.1 を追加してください。


tutorial_raspimouse0_2.png tutorial_raspimouse1.png



するとRaspberryPiMouseRTCという RTC が見えるようになります。

/ja/node/6550

RaspberryPiMouseRTC は名城大学のロボットシステムデザイン研究室で開発されているラズパイマウス制御用の RTコンポーネントです。

ポートの接続

RTシステムエディタで RaspberryPiMouseRTC、RobotController コンポーネントを以下のように接続します。

/ja/node/6310

モーターの電源を投入する

動作の前に、モーターの電源スイッチをオンにしてください。 モーターの電源はこまめに切るようにしてください。


/ja/node/6550


アクティブ化

そして RTC をアクティブ化すると Raspberry Pi マウスの操作ができるようになります。

チュートリアル(RTコンポーネントの作成入門、Raspberry Pi Mouse、Ubuntu)

はじめに

このページではシミュレーター上の Raspberry Pi マウスを操作するためのコンポーネントの作成手順を説明します。

/jp/node/6198

資料のダウンロード

まずは資料をダウンロードしてください。講習会でUSBメモリを配布している場合はダウンロードは不要です。

 git clone https://github.com/OpenRTM/RTM_Tutorial

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。

シミュレーター

シミュレーターは Open Dynamics Engine(ODE) という物理演算エンジンと ODE 付属の描画ライブラリ(drawstuff)を使用して開発しています。 OpenGL が動作すれば動くので、大抵の環境で動作するはずです。

以下の Raspberry Piマウス というロボットのシミュレーションができます。

/jp/node/6005

シミュレーター上の Raspberry Pi マウスの動力学計算、接触応答だけではなく、距離センサーのデータも現実のロボットに近い値を再現するようにしています。

Raspberry Piマウスの仕様

Raspberry Piマウスはアールティが販売している独立二輪駆動型の移動ロボットです。

/ja/node/6550

ラズパイマウスの仕様
CPU Raspberry Pi 2 Model B
モーター ステッピングモーターST-42BYG020 2個
モータードライバー SLA7070MRPT 2個
距離センサー 赤色LED+フォトトランジスタ(ST-1K3) 4個
モニター用赤色LED 4個
ブザー 1個
スイッチ 3個
バッテリー LiPo3セル(11.1V)1000mAh 1個

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

  • RobotController コンポーネント

RaspberryPiMouseSimulator コンポーネントと接続してシミュレーター上のロボットを操作するためのコンポーネントです。

RobotController コンポーネントの作成

GUI(スライダー)によりシミュレーター上のロボットの操作を行い、センサー値が一定以上の時には自動的に停止するコンポーネントの作成を行います。

/ja/node/6310

作成手順

作成手順は以下の通りです。

  • 開発環境の確認
  • コンポーネントの仕様を決める
  • RTC Builder によるソースコードのひな型コードの作成
  • ソースコードの編集
  • コンポーネントの動作確認

動作環境・開発環境

Linux (ここでは Ubuntu 18.04 を仮定) 上に開発環境を構築します。

OpenRTM-aistのインストール

 $ wget https://raw.githubusercontent.com/OpenRTM/OpenRTM-aist/master/scripts/pkg_install_ubuntu.sh
 $ pkg_install_ubuntu.sh -l all --yes

JDKのインストール

 # Ubuntu 18.04、18.10の場合
 $ sudo apt-get install openjdk-8-jdk
 # Ubuntu 16.04の場合
 $ sudo apt-get install default-jdk

Ubuntu 18.04、18.10の場合は以下のコマンドでjava8に切り替えます。

 $ sudo update-alternatives --config java

openrtp起動後、RTSystemEditor でネームサーバに接続できない場合があります。その場合、/etc/hosts の localhost の行に自ホスト名を追記してください。

 $ hostname
 ubuntu1804 ← ホスト名は ubuntu1804
 $ sudo vi /etc/hosts

 127.0.0.1       localhost
 を以下のように変更
 127.0.0.1       localhost ubuntu1804

gitのインストール

 $ sudo apt-get install git

cmake-guiのインストール

 $ sudo apt-get install cmake-qt-gui

Code::Blocks のインストール

Code::Blocks は C/C++ に対応した統合開発環境です。 以下のコマンドでインストールできます。

 $ sudo apt-get install codeblocks

最新版を入手したい場合は以下のコマンドを入力します。

 $ sudo add-apt-repository ppa:damien-moore/codeblocks-stable
 $ sudo apt-get update
 $ sudo apt-get install codeblocks

Premake、GLUTのインストール

ODEのビルドに必要です。

 $ sudo apt-get install premake4 freeglut3-dev

RaspberryPiMouseSimulator コンポーネント

シミュレーターコンポーネントについては手動でビルドを行います。 以下のコマンドを入力してください。

 $ wget https://raw.githubusercontent.com/OpenRTM/RTM_Tutorial/master/script/install_raspimouse_simulator.sh
 $ sudo sh install_raspimouse_simulator.sh

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布の USBメモリー内のスクリプトを起動してください。

 $ sudo sh install_raspimouse_simulator_usb.sh

コンポーネントの仕様

RobotController は目標速度を出力するアウトポート、センサー値を入力するインポート、目標速度や停止するセンサー値を設定するコンフィギュレーションパラメーターを持っています。

コンポーネント名称 RobotController
InPort
ポート名 in
RTC::TimedShortSeq
説明 センサー値
OutPort
ポート名 out
RTC::TimedVelocity2D
説明 目標速度
Configuration
パラメーター名 speed_x
double
デフォルト値 0.0
制約 -1.5<x<1.5
Widget slider
Step 0.01
説明 直進速度の設定
Configuration
パラメーター名 speed_r
double
デフォルト値 0.0
制約 -2.0<x<2.0
Widget slider
Step 0.01
説明 回転速度の設定
Configuration
パラメーター名 stop_d
int
デフォルト値 30
説明 停止するセンサー値の設定

TimedVelocity2D 型について

2次元平面上の移動ロボットの移動速度を格納するデータ型である TimedVelocity2D 型を使用します。

     struct Velocity2D
     {
         /// Velocity along the x axis in metres per second.
         double vx;
         /// Velocity along the y axis in metres per second.
         double vy;
         /// Yaw velocity in radians per second.
         double va;
     };
 
 
     struct TimedVelocity2D
     {
         Time tm;
         Velocity2D data;
     };

このデータ型にはX軸方向の速度vx、Y軸方向の速度vy、Z軸周りの回転速度vaが格納できます。

vxvyvaはロボット中心座標系での速度を表しています。


/ja/node/6042

vxはX方向の速度、vyはY方向の速度、vaはZ軸周りの角速度です。

Raspberry Piマウスのように2個の車輪が左右に取り付けられているロボットの場合、横滑りしないと仮定するとvyは0になります。

直進速度vx、回転速度vaを指定することでロボットの操作を行います。

距離センサーのデータについて

Raspberry Pi マウスの距離センサーのデータは物体との距離が近づくほど大きな値を出力するようになっています。


/ja/node/6550

デバイスファイルから取得した数値 実際の距離[m]
1394 0.01
792 0.02
525 0.03
373 0.04
299 0.05
260 0.06
222 0.07
181 0.08
135 0.09
100 0.10
81 0.15
36 0.20
17 0.25
16 0.30

シミュレーターではこの値を再現して出力しています。 RobotController コンポーネントではこの値が一定以上の時に自動的に停止する処理を実装します。

RobotController コンポーネントのひな型コードの生成

RobotController コンポーネントのひな型コードの生成は、RTCBuilder を用いて行います。

RTCBuilder の起動

OpenRTP では、各種作業を行うフォルダーを「ワークスペース」(Work Space)とよび、原則としてすべての生成物はこのフォルダーの下に保存されます。 ワークスペースはアクセスできるフォルダーであれば、どこに作っても構いませんが、このチュートリアルでは以下のワークスペースを仮定します。

  • /home/ユーザー名/workspace

まずは OpenRTP を起動します。

 $ openrtp2

最初にワークスペースの場所を尋ねられますので、上記のワークスペースを指定してください。

/ja/node/6058

すると、以下のような Welcome ページが表示されます。


/ja/node/6026
OpenRTP の初期起動時の画面

Welcome ページはいまは必要ないので左上の「×」ボタンをクリックして閉じてください。

右上の [Open Perspective] ボタンをクリックしてください。

/ja/node/6026
パースペクティブの切り替え

「RTC Builder」を選択することで、RTCBuilderが起動します。メニューバーに「カナヅチとRT」の RTCBuilder のアイコンが現れます。

/ja/node/6550
パースペクティブの選択

新規プロジェクトの作成

RobotController コンポーネントを作成するために、RTC Builder で新規プロジェクトを作成する必要があります。

左上の [Open New RTCBuilder Editor] のアイコンをクリックしてください。

/ja/node/6057
RTC Builder 用プロジェクトの作成

「プロジェクト名」欄に作成するプロジェクト名 (ここでは RobotController) を入力して [終了] をクリックします。

/ja/node/6310

指定した名称のプロジェクトが生成され、パッケージエクスプローラ内に追加されます。

/ja/node/6310

生成したプロジェクト内には、デフォルト値が設定された RTC プロファイル XML(RTC.xml) が自動的に生成されます。

RTC プロファイルエディタの起動

RTC.xmlが生成された時点で、このプロジェクトに関連付けられているワークスペースとして RTCBuilder のエディタが開くはずです。 もし起動しない場合はパッケージエクスプローラーの RTC.xml をダブルクリックしてください。

/ja/node/6026

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

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

  • コンポーネント名: RobotController
  • 概要: 任意(Robot Controller component)
  • バージョン: 任意(1.0.0)
  • ベンダ名: 任意
  • カテゴリ: 任意(Controller)


 /ja/node/6550
基本情報の入力


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

RobotController コンポーネントでは、onActivated()、onDeactivated()、onExecute() コールバックを使用します。下図のように①の onAtivated をクリック後に②のラジオボタンにて [ON] にチェックを入れます。 onDeactivated、onExecute についても同様の手順を行います。


/ja/node/6310
アクティビティコールバックの選択


さらに、「データポート」タブを選択し、データポートの情報を入力します。 先ほど決めた仕様を元に以下のように入力します。なお、変数名や表示位置はオプションで、そのままで結構です。


  • InPort Profile:
    • ポート名: in
    • データ型: RTC::TimedShortSeq

  • OutPort Profile:
    • ポート名: out
    • データ型: RTC::TimedVelocity2D


/ja/node/6310
データポート情報の入力


次に、「コンフィギュレーション」タブを選択し、先ほど決めた仕様を元に、Configuration の情報を入力します。 制約条件および Widget とは、RTSystemEditor でコンポーネントのコンフィギュレーションパラメーターを表示する際に、スライダー、スピンボタン、ラジオボタンなど、GUI で値の変更を行うためのものです。

直進速度 speed_x、回転速度 speed_r はスライダーのより操作できるようにします。


  • speed_x
    • 名称: speed_x
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -1.5<x<1.5
    • Widget: slider
    • Step: 0.01
  • speed_r
    • 名称: speed_r
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -2.0<x<2.0
    • Widget: slider
    • Step: 0.01
  • stop_d
    • 名称: stop_d
    • データ型: int
    • デフォルト値: 30
    • Widget: text


/ja/node/6310
コンフィグレーション情報の入力


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

/ja/node/6310
プログラミング言語の選択


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


/ja/node/6310
ひな型コードの生成(Generate)


※ 生成されるコード群は、OpenRTP起動時に指定したワークスペースフォルダーの中に生成されます。 現在のワークスペースは、[ファイル] > [ワークスペースの切り替え...] で確認することができます。

CMake によるビルドに必要なファイルの生成

RTC Builder で生成したコードの中には CMake でビルドに必要な各種ファイルを生成するための CMakeLists.txt が含まれています。 CMake を利用することにより CMakeLists.txt から Visual Studio のプロジェクトファイル、ソリューションファイル、もしくは Makefile 等を自動生成できます。

CMake(cmake-gui) の操作

CMake を利用してビルド環境の Configure を行います。 まずは CMake(cmake-gui) を起動してください。

 $ cmake-gui
/ja/node/6311
CMake GUI の起動とディレクトリーの指定

画面上部に以下のようなテキストボックスがありますので、それぞれソースコードの場所 (CMakeList.txt がある場所) と、ビルドディレクトリーを指定します。

  • Where is the soruce code
  • Where to build the binaries

ソースコードの場所は RobotController コンポーネントのソースが生成された場所で CMakeList.txt が存在するディレクトリーです。 デフォルトでは <ワークスペースディレクトリー>/RobotController になります。

このディレクトリーはエクスプローラから cmake-gui にドラッグアンドドロップすると手入力しなくても設定されます。

ビルドディレクトリーとは、ビルドするためのプロジェクトファイルやオブジェクトファイル、バイナリを格納する場所のことです。 場所は任意ですが、この場合 <ワークスペースディレクトリー>/RobotController/build のように分かりやすい名前をつけた RobotController のサブディレクトリーを指定することをお勧めします。

Where is the soruce code /home/ユーザー名/workspace/RobotController
Where to build the binaries /home/ユーザー名/workspace/RobotController/build

指定したら、下の [Configure] ボタンをクリックします。すると下図のようなダイアログが表示されますので、生成したいプロジェクトの種類を指定します。 今回は CodeBlocks - Unix Makefiles を指定します。 Code::Blocks を使わない場合は Unix Makefiles を使ってください。

/ja/node/6551
生成するプロジェクトの種類の指定

また cmake-gui を使用しない場合は以下のコマンドでファイルを生成できます。

 $ mkdir build
 $ cd build
 $ cmake .. -G "CodeBlocks - Unix Makefiles"

ダイアログで [Finish] をクリックすると Configure が始まります。問題がなければ下部のログウインドウに「Configuring done」と出力されますので、続けて [Generate] ボタンをクリックします。 「Generating done」と出ればプロジェクトファイル・ソリューションファイル等の出力が完了します。

なお、CMake は Configure の段階でキャッシュファイルを生成しますので、トラブルなどで設定を変更したり環境を変更した場合は [File] > [Delete Cache] を選択して、キャッシュを削除してから Configure からやり直してください。

ヘッダ、ソースの編集

次に先ほど指定した build ディレクトリーの中の RobotController.cbp をダブルクリックしてCode::Blocks を起動します。

ヘッダ (include/RobotController/RobotController.h) およびソースコード (src/RobotController.cpp) をそれぞれ編集します。 Code::BlocksのProjectsからRobotController.h、RobotController.cpp をクリックすることで編集画面が開きます。

/ja/node/6311

64bitの環境の場合に Code::Blocks の動作が不安定になることがあります。 その場合は code completion というプラグインを無効化すると動作することがあります。

「Plugins」>「Manage plugins...」を選択します。

/ja/node/6057/

「code completion」を選択して [Disable] ボタンをクリックします。

/ja/node/6057/

動作しないときはこの手順を試してください。

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

RobotController コンポーネントでは、コンフィギュレーションパラメーター(speed_x、speed_y)をスライダーで操作しその値を目標速度としてアウトポート(out)から出力します。 インポート(in)から入力された値を変数に格納して、その値が一定以上の場合は停止するようにします。


onActivated()、onExecute()、onDeactivated() での処理内容を下図に示します。

/ja/node/6310/
アクティビティ処理の概要


ヘッダファイル (RobotController.h) の編集

センサー値を一時的に格納する変数 sensor_data を宣言します。

   private:
      double sensor_data[4];    //センサー値を一時格納する変数

ソースファイル (RobotController.cpp) の編集

下記のように、onActivated()、onDeactivated()、onExecute() を実装します。

 RTC::ReturnCode_t RobotController::onActivated(RTC::UniqueId ec_id)
 {
     //センサー値初期化
     for (int i = 0; i < 4; i++)
     {
         sensor_data[i] = 0;
     }
 
   return RTC::RTC_OK;
 }

 RTC::ReturnCode_t RobotController::onDeactivated(RTC::UniqueId ec_id)
 {
     //ロボットを停止する
     m_out.data.vx = 0;
     m_out.data.va = 0;
     m_outOut.write();
 
   return RTC::RTC_OK;
 }

 RTC::ReturnCode_t RobotController::onExecute(RTC::UniqueId ec_id)
 {
     //入力データの存在確認
     if (m_inIn.isNew())
     {
         //入力データ読み込み
         m_inIn.read();
         for (int i = 0; i < m_in.data.length(); i++)
         {
             //入力データ格納
             if (i < 4)
             {
                 sensor_data[i] = m_in.data[i];
             }
         }
     }
 
     //前進するときのみ停止するかを判定
     if (m_speed_x > 0)
     {
         for (int i = 0; i < 4; i++)
         {
             //センサ値が設定値以上か判定
             if (sensor_data[i] > m_stop_d)
             {
                 //センサ値が設定値以上の場合は停止
                 m_out.data.vx = 0;
                 m_out.data.va = 0;
                 m_outOut.write();
                 return RTC::RTC_OK;
             }
         }
     }
     //設定値以上の値のセンサーが無い場合はコンフィギュレーションパラメーターの値で操作
     m_out.data.vx = m_speed_x;
     m_out.data.va = m_speed_r;
     m_outOut.write();
   return RTC::RTC_OK;
 }

Code::Blocks によるビルド

ビルドの実行

Code::Blocksの [ビルド] ボタンをクリックしてビルドを行います。


/ja/node/6311
ビルドの実行


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

作成した RobotController をシミュレーターコンポーネントと接続して動作確認を行います。

RTSystemEditorの起動

OpenRTPのパースペクティブを開くのウインドウからRT System Editorを選択して起動します。


/ja/node/6550

NameService の起動

コンポーネントの参照を登録するためのネームサービスを起動します。


RT System Editorのネームサービス起動ボタンを押すと起動します。

/ja/node/6550

※ 「Start Naming Service」をクリックしても omniNames が起動されない場合は、フルコンピュータ名が14文字以内に設定されているかを確認してください。

RobotController コンポーネントの起動

RobotController コンポーネントを起動します。

RobotController/build/srcフォルダーの RobotControllerComp ファイルを実行してください。

 $ ./RobotControllerComp

シミュレーターコンポーネントの起動

RaspberryPiMouseSimulator コンポーネントをインストールしたディレクトリー({install_raspimouse_simulator.shを実行したディレクトリ}/RasPiMouseSimulatorRTC/build)に移動後、下記のコマンドにて起動できます。

 $ ./src/RaspberryPiMouseSimulatorComp

コンポーネントの接続

下図のように、RTSystemEditorにて RobotController コンポーネント、RaspberryPiMouseSimulator コンポーネントを接続します。

/ja/node/6310
コンポーネントの接続

コンポーネントの Activate

RTSystemEditor の上部にあります [Activate Systems] というアイコンをクリックし、全てのコンポーネントをアクティブ化します。 正常にアクティベートされた場合、下図のように黄緑色でコンポーネントが表示されます。


/ja/node/6310
コンポーネントのアクティブ化


動作確認

下図のようにコンフィギュレーションビューの [編集] ボタンからコンフィギュレーションを変更することができます。


/ja/node/6311

スライダーを操作してシミュレーター上の Raspberry Pi マウスの操作ができるかを確認してください。


/ja/node/6310
コンフィギュレーションパラメーターの変更


実機での動作確認

講習会で Raspberry Pi マウス実機を用意している場合は実機での動作確認が可能です。

手順は以下の通りです。

  • Raspberry Pi マウスの電源を投入する
  • Raspberry Pi マウスのアクセスポイントに接続
  • ポートの接続
  • コンポーネントのアクティブ化

電源を投入する

Raspberry PiマウスにはRaspberry Piの電源スイッチとモーターの電源スイッチの2つがあります。


/ja/node/6550


内側の電源スイッチをオンにするとRaspberry Piが起動します。


/ja/node/6550


電源を切る場合

Raspberry Piの電源を切る場合は、電源スイッチから直接オフにはしないようにしてください。 3つ並んだボタンの中央のボタンを数秒押すとシャットダウンが始まります。 10秒程度でRaspbianのシャットダウンが終了するため、その後に電源スイッチをオフにしてください。


/ja/node/6042

アクセスポイントに接続

SSID、パスワードは Rasoberry Pi マウスに貼り付けたシールに記載してあるので、その SSID に接続してください。

※ネットワークが切り替わった場合にネームサーバーへのコンポーネントの登録やポートの接続が失敗する場合があるのでOpenRTP、ネームサーバ、コンポーネントを一旦全て終了してください。 ネットワーク切り替え後に起動した場合には問題ないので、終了させる必要はありません。

OpenRTPを終了するには右上の×を押して終了してください。システムダイアグラムを保存するかどうか聞かれますが、Don't Saveを選択してください。

/ja/node/6550

openrtpコマンドを実行してOpenRTPを起動してください。

RT System Editor上でネームサーバーを再起動するには「ネームサービスを起動」ボタンを再度クリックします。

/ja/node/6550

Raspberry Pi上のネームサーバー、RTC起動

※この作業は以下のLiDAR付Raspberry Piマウスで必要な作業です。LiDAR無しのRaspberry Piマウスの場合は次の作業へ進んでください。

23b47429c42d672e7f94ae0a3c9c9d6c.png

Edge、Chrome、Firefox等のWEBブラウザで192.168.11.1のアドレスにアクセスしてください。

/jp/node/6550

するとRaspberryPiMouse with OpenRTM-aistの画面が表示されます。

まずはネームサーバーを起動するため、Start NameServerボタンを押してください。

/jp/node/6550

RaspberryPiMouseRTCStartを押してください。

/jp/node/6550

元の画面に戻らない場合はBack to the top page.をクリックしてください。

/jp/node/6550

これで完了です。

ネームサーバー追加

続いてRTシステムエディタの [ネームサーバー追加] ボタンで 192.168.11.1 を追加してください。


/ja/node/6550 tutorial_raspimouse1.png



するとRaspberryPiMouseRTCという RTC が見えるようになります。

/ja/node/6311

RaspberryPiMouseRTC は名城大学のロボットシステムデザイン研究室で開発されているラズパイマウス制御用の RTコンポーネントです。

ポートの接続

RTシステムエディタで RaspberryPiMouseRTC、RobotController コンポーネントを以下のように接続します。

/ja/node/6310

モーターの電源を投入する

動作の前に、モーターの電源スイッチをオンにしてください。 モーターの電源はこまめに切るようにしてください。


/ja/node/6550


アクティブ化

そして RTC をアクティブ化すると Raspberry Pi マウスの操作ができるようになります。

チュートリアル(RTシステム構築実習、Raspberry Pi Mouse)

このページではRaspberry PiマウスとLEGO Mindstorms EV3を連携したRTシステムの構築を行います。

Raspberry Piマウスをアクセスポイントとして、ノートPCとEV3をアクセスポイントに接続します。

※Raspberry Piマウスと同じ番号のEV3を使用するようにしてください。


/ja/node/6552

EV3のデバイス

EV3 には以下のデバイスが付属しています。

ジャイロセンサー
technology-ev3-img7.jpg
確度モード: 精度 +/- 3°
角速度モード: 最大 440 deg/sec
サンプリングレート 1,000 Hz
カラーセンサー
technology-ev3-img5.jpg
計測: 赤色光の反射光、 周囲の明るさ、色
検出カラー数: 8色 (無色、黒、青、緑、黄、赤、白、茶)
サンプリングレート 1,000 Hz
距離 約1mm~18mm(アフレル調査値)
タッチセンサー
technology-ev3-img6.jpg
オン (1), オフ (0)
スイッチ可動域: 約4mm
超音波センサー
technology-ev3-img8.jpg
距離計測可能範囲: 3cmから250cm
距離計測精度: +/- 1 cm
前面電飾: 点灯:超音波発信中、 点滅:超音波観測中
EV3 Lモーター
45502_LargeMotor.jpg
フィードバック: 1°単位
回転数: 160から170RPM
定格トルク: 0.21 N・m (30oz*in)
停動トルク: 0.42 N・m (60oz*in)
重さ: 76 g
EV3 Mモーター
45503_MediumMotor.jpg
フィードバック 1°単位
回転数: 240から250RPM
定格トルク: 0.08 N・m (11oz*in)
停動トルク: 0.12 N・m (17oz*in)
重さ: 36 g

EV3の組立て

まず、EV3本体を土台に装着します。


/ja/node/6552

次に25cmケーブルでEV3と左右のLモーターを接続します。


45502_LargeMotor.jpg
Lモーター


Lモーター右 ポート C 25cmケーブル
Lモーター左 ポート B 25cmケーブル


/ja/node/6552

ケーブルに接続するポート、デバイス名は記載してあります。

他のデバイスを取り付ける場合は、チュートリアル(EV3)を参考にしてください。

EV3との接続

ノートPCとRaspberry Piの接続

第二部の、実機での動作確認まで完了してください。 この時点でノートPCとアクセスポイントのRaspberry Piが接続されているはずです。


/ja/node/6552

EV3の電源の入れ方/切り方

電源の入れ方

中央のボタンを押せば電源が投入されます。


/ja/node/6041

電源の切り方

EV3 の電源を切る場合は最初の画面で EV3 本体の左上の戻るボタンを押して「Power Off」を選択してください。


/ja/node/6041


/ja/node/6041

再起動

再起動する場合は最初の画面で EV3 本体の左上の戻るボタンを押して「Reboot」を選択してください。

リセット

ev3dev の起動が途中で停止する場合には、中央ボタン、戻るボタン(左上)、左ボタンを同時押ししてください。画面が消えたら戻るボタンを離すと再起動します。


/ja/node/6041

Raspberry PiとEV3の接続

EV3の電源を投入してください。

起動後にRaspberry Piに自動接続します。 自動接続できた場合は、EV3の画面左上にIPアドレスが表示されます。 IPアドレスは192.168.11.yyyが表示されます。


/ja/node/6384

ネームサーバー、RTCの起動

EV3の画面上の操作でネームサーバーとRTCを起動します。

EV3 の操作画面から「File Browser」→「scripts」を選択してください。

ネームサーバー、RTCはstart_rtcs.shのスクリプトを実行することで起動します。

 ------------------------------
 192.168.11.yyy
 ------------------------------
         File Browser
 ------------------------------
 /home/robot/scripts
 ------------------------------
 ../
 Component/
 ・・
 [start_rtcs.sh                 ]
 ------------------------------


/ja/node/6384

ネームサーバー追加

RTシステムエディタから、192.168.11.yyyのネームサーバーに接続してください。


tutorial_raspimouse0.png tutorial_ev3_irex22.png



この時点でRTシステムエディタのネームサービスビューにはlocalhost、192.168.11.1、192.168.11.yyyのネームサーバーが登録されています。 192.168.11.yyyのネームサーバーに登録されているRTCの名前はEducatorVehicle1となります。


/ja/node/6552

  • localhost
    • RobotController0
  • 192.168.11.1
    • RaspberryPiMouseRTC0
    • OpenCVCamera0
    • artp0
  • 192.168.11.yyy
    • EducatorVehicle1

動作確認

RaspberryPiMouseRTC0(192.168.11.1)とEducatorVehicle1(192.168.11.yyy)をシステムダイアグラム上で接続してください。 EducatorVehicle0の現在の速度出力をRaspberryPiMouseRTC0の目標速度入力に接続することで、EV3の動きにRaspberry Piマウスが追従するようになります。


/ja/node/6552

RTCをアクティベートしてEducator Vehicleの車輪を転がすと、Raspberry Piマウスがそれに合わせて動作します。


/ja/node/6552

自由課題

これで実習は一通り終了ですが、時間が余っている場合は以下のような課題に挑戦してみてください。

EV3のタッチセンサのオンオフでRaspberry Piマウスを操作

EV3のタッチセンサーのオンオフでRaspberry Piマウスを前進後退させるRTシステムを作成します。


45507_TouchSensor.jpg
タッチセンサー


タッチセンサー接続

EV3とタッチセンサーを35cmケーブルで接続してください。

タッチセンサー右 ポート 3 35cmケーブル
タッチセンサー左 ポート 1 35cmケーブル

RTCの作成

以下のような仕様のRTCを作成します。

コンポーネント名称 SampleTouchSensor
InPort
ポート名 touch
TimedBooleanSeq
説明 タッチセンサーのオンオフ
OutPort
ポート名 target_velocity
TimedVelocity2D
説明 目標速度
Configuration
パラメーター名 speed
double
デフォルト値 0.2
説明 タッチセンサがオンの時の直進速度の設定

アクティビティでonExecuteを有効にしてください。

SampleTouchSensorのonExecute関数に以下のように記述します。

 RTC::ReturnCode_t SampleTouchSensor::onExecute(RTC::UniqueId ec_id)
 {
     //新規データの確認
     if (m_touchIn.isNew())
     {
         //データの読み込み
         m_touchIn.read();
         //配列の要素数が1以上かを確認
         if (m_touch.data.length() == 2)
         {
             //0番目のデータがオンの場合は直進する指令を出力
             //0番目のデータは右側のタッチセンサに対応
             if (m_touch.data[0])
             {
                 //目標速度を格納
                 m_target_velocity.data.vx = m_speed;
                 m_target_velocity.data.vy = 0;
                 m_target_velocity.data.va = 0;
                 setTimestamp(m_target_velocity);
                 //データ出力
                 m_target_velocityOut.write();
             }
             //1番目のデータがオンの場合は後退する指令を出力
             //1番目のデータは左側のタッチセンサに対応
             else if (m_touch.data[1])
             {
                 //目標速度を格納
                 m_target_velocity.data.vx = -m_speed;
                 m_target_velocity.data.vy = 0;
                 m_target_velocity.data.va = 0;
                 setTimestamp(m_target_velocity);
                 //データ出力
                 m_target_velocityOut.write();
             }
             //オフの場合は停止する
             else
             {
                 //目標速度を格納
                 m_target_velocity.data.vx = 0;
                 m_target_velocity.data.vy = 0;
                 m_target_velocity.data.va = 0;
                 setTimestamp(m_target_velocity);
                 //データ出力
                 m_target_velocityOut.write();
             }
         }
     }
   return RTC::RTC_OK;
 }

RTシステム作成

データポートを以下のように接続後、タッチセンサをオンオフするとRaspberry Piが前進後退します。


/ja/node/6552

ジョイスティックコンポーネントで2台同時に操作

以下GUIジョイスティックでRaspberry Piマウス、EV3を操作するRTシステムを作成します。


/ja/node/6552

ジョイスティックコンポーネント起動

ジョイスティックコンポーネントはOpenRTM-aist Python版のサンプルにあります(TkJoyStickComp.py)。 ジョイスティックコンポーネントは、Windows 8.1の場合は「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 1.2.0」>「Python_Examples」をクリックして、エクスプローラーで「TkJoyStickComp.bat」をダブルクリックして起動してください。

RTC作成

TkJoyStickComp.pyのアウトポートのデータ型はTimedFloatSeq型であるため、TimedVelocity2D型に変換するRTCを作成する必要があります。

以下のような仕様のRTCを作成してください。

コンポーネント名称 FloatSeqToVelocity
InPort
ポート名 in
TimedFloatSeq
説明 変換前のデータ
OutPort
ポート名 out
TimedVelocity2D
説明 変換後のデータ
Configuration
パラメーター名 rotation_by_position
double
デフォルト値 -0.02
説明 ジョイスティックのX座標の位置に対する角速度の変化量
Configuration
パラメーター名 velocity_by_position
double
デフォルト値 0.002
説明 ジョイステックのY座標に対する速度の変化量

アクティビティはonExecuteをオンにしてください。

onExecute関数を以下のように編集してください。

 RTC::ReturnCode_t FloatSeqToVelocity::onExecute(RTC::UniqueId ec_id)
 {
     //新規データの確認
     if (m_inIn.isNew())
     {
         //データの読み込み
         m_inIn.read();
         //配列のデータ数確認
         if (m_in.data.length() >= 2)
         {
             //目標速度格納
             m_out.data.vx = m_in.data[1] * m_velocity_by_position;
             m_out.data.vy = 0;
             m_out.data.va = m_in.data[0] * m_rotation_by_position;
             setTimestamp(m_out);
             //目標速度出力
             m_outOut.write();
         }
     }
   return RTC::RTC_OK;
 }

RTシステム作成

以下のようにデータポートを接続してください。


/ja/node/6552

EV3をしゃべらせる

EducatorVehicleRTCのsoundという名前のインポートに文字列(TimedString型)を入力すると、EV3が発声します。

RTC作成

以下のような仕様のRTCを作成してください。

コンポーネント名称 SpeechSample
OutPort
ポート名 out
TimedString
説明 発話する文字列

アクティビティはonExecuteをオンにしてください。

onExecute関数を以下のように編集してください。

 RTC::ReturnCode_t SpeechSample::onExecute(RTC::UniqueId ec_id)
 {
     std::cout << "Please input: ";
     std::string ret;
     //文字入力
     std::cin >> ret;
     //データに格納
     m_out.data = CORBA::string_dup(ret.c_str());
     setTimestamp(m_out);
     //データ出力
     m_outOut.write();
 
   return RTC::RTC_OK;
 }

文字列(const char*)をデータポートで出力する際はCORBA::string_dup関数で文字列をコピーする必要があります。

 m_out.data= CORBA::string_dup("abc");

RTシステム作成

以下のようにデータポートを接続してください。


/ja/node/6552

マーカーの追従

Raspberry Piマウスを起動すると、OpenCVCameraコンポーネントとarptコンポーネントが起動します。 OpenCVCameraコンポーネントは画像を取得するコンポーネント、artpコンポーネントは画像データからマーカの位置姿勢を計算して出力するコンポーネントです。


/ja/node/6552

Raspberry Piマウスがマーカーに追従するRTシステムを作成します。

カメラの装着

まずはカメラをRaspberry Piマウスに装着します。

以下の土台部品をRaspberry Piマウスに取り付けていきます。


/ja/node/6552

部品①をRaspberry Piマウスの上部に装着してください。 左から押し込むようにして取り付けます。


/ja/node/6552


この時、左側の突起がプレートを挟むように取り付けてください。


/ja/node/6552

部品②を部品①の左側に上から差し込んでください。


/ja/node/6552



/ja/node/6552

部品③を左側から部品②に差し込んでください。


/ja/node/6552

最後にカメラを搭載して、USBケーブルをRaspberry Piに差し込んだら完成です。


/ja/node/6552



/ja/node/6552


RTC作成

以下の仕様でRTCを作成してください。

コンポーネント名称 testARToolKit
InPort
ポート名 marker_pos
TimedPose3D
説明 マーカーの位置
OutPort
ポート名 target_vel
TimedVelocity2D
説明 ロボットの目標速度
Configuration
パラメーター名 x_distance
double
デフォルト値 0.5
説明 マーカーまでの目標距離(X軸)
Configuration
パラメーター名 y_distance
double
デフォルト値 0
説明 マーカーまでの目標距離(Y軸)
Configuration
パラメーター名 x_speed
double
デフォルト値 0.1
説明 X軸方向移動速度
Configuration
パラメーター名 r_speed
double
デフォルト値 0.2
説明 回転方向移動速度
Configuration
パラメーター名 error_range_x
double
デフォルト値 0.1
説明 X軸方向目標距離の許容範囲
Configuration
パラメーター名 error_range_y
double
デフォルト値 0.05
説明 Y軸方向目標距離の許容範囲

アクティビティはonExecuteをONにしてください。

onExecuteを以下のように編集してください。

 RTC::ReturnCode_t testARToolKit::onExecute(RTC::UniqueId ec_id)
 {
     //新規データの確認
     if (m_marker_posIn.isNew())
     {
         m_target_vel.data.vx = 0;
         m_target_vel.data.vy = 0;
         m_target_vel.data.va = 0;
 
         //データの読み込み
         m_marker_posIn.read();
         //マーカーの位置(X軸)が目標距離(X軸)よりも大きい場合
         if (m_marker_pos.data.position.x > m_x_distance + m_error_range_x/2.0)
         {
             m_target_vel.data.vx = m_x_speed;
         }
         //マーカーの位置(X軸)が目標距離(X軸)よりも小さい場合
         else if (m_marker_pos.data.position.x < m_x_distance - m_error_range_x/2.0)
         {
             m_target_vel.data.vx = -m_x_speed;
         }
         //マーカーの位置(Y軸)が目標距離(Y軸)よりも大きい場合
         else if (m_marker_pos.data.position.y > m_y_distance + m_error_range_y/2.0)
         {
             m_target_vel.data.va = m_r_speed;
         }
         //マーカーの位置(Y軸)が目標距離(Y軸)よりも小さい場合
         else if (m_marker_pos.data.position.y < m_y_distance - m_error_range_y/2.0)
         {
             m_target_vel.data.va = -m_r_speed;
         }
         setTimestamp(m_target_vel);
         //データ書き込み
         m_target_velOut.write();
     }
   return RTC::RTC_OK;
 }

RTシステム作成

データポートを以下のように接続してください。


/ja/node/6552

RTCをアクティベートしてカメラの前でマーカーを動かして、Raspberry Piマウスが移動するかを確認してください。

チュートリアル(RTミドルウェア応用実習、Raspberry Pi Mouse)

はじめに

このページではLibreOffice Calc用RTCによるRTCの動作確認手順について説明します。 Calcのセルの値をInPortに入力、OutPortの出力した値をセルに表示することで対象RTCの挙動を確認できます。

/jp/node/6586

RTM講習会ではUSBメモリでポータブル版LibreOfficeとRTCを配布します。 Windowsで実行できます。


Ubuntuの場合は以下のコマンドでインストールできます。

 sudo apt install libreoffice-script-provider-python
 git clone https://github.com/Nobu19800/OOoRTCs
 cd OOoRTCs
 sh install.sh

この実習では第2部で作成したRobotControllerコンポーネントを使用します。

LibreOfficeとは?

表計算、パワーポイント、ワープロ機能等を提供するオフィススイートです。 フリーソフトとして公開されており、今回の講習会では以下のポータブル版を使用します。

LibreOffice Calc用RTCの起動

Windowsの場合は、配布したUSBメモリ内のポータブル版LibreOffice\run_CalcRTC.batを実行します。
Ubuntuの場合は、OOoRTCs/OOoCalcRTC/OOoCalcRTC.odsをダブルクリックして開きます。
LibreOffice Calcが起動するため、RTC起動ボタンをクリックすることでOOoCalcControlというRTCを起動します。

/jp/node/6586

OutPortの接続

RobotControllerのOutPortと接続し、Calcで出力データの確認ができるようにします。 Calcの操作ダイアログ起動ボタンをクリックしてください。

/jp/node/6586

まずは出力データを確認するOutPortと接続します。 ツリー表示ボタンを押下してネームサーバーに登録されたRTCのポート一覧を表示後、ツリーからRobotController0のoutを選択します。

/jp/node/6586

次に、一部の設定を変更します。

列を移動させるのチェックを外してください。 このチェックが有効の場合、データを受信する度にセルの位置が移動するモードで動作します。 グラフに描画する場合は位置が移動するモードを使用しますが、今回は単純に値を確認したいだけのためチェックを外します。

行番号3を入力してください。
列番号の右のボックスにCと入力してください。
これで2行目のAC列のセルにOutPortの出力データを表示するようになりました。

設定完了後、作成ボタンを押してください。

/jp/node/6586

OutPortの動作確認

RT System Editor上でRTCをアクティブ化して動作を確認してください。

/jp/node/6586

この状態でコンフィギュレーションパラメータを操作してCalcのセルの値が変化するかを確認してください。

/jp/node/6586

InPortの接続

RobotControllerのInPortと接続し、Calcからデータの入力を行うようにします。

ツリー表示ボタンを押下してネームサーバーに登録されたRTCのポート一覧を表示後、ツリーからRobotController0のinを選択します。

/jp/node/6586

次に一部設定を変更します。

列を移動させるのチェックを外してください。

列番号の右のボックスにDと入力してください。 これで3行目のAC列のセルにOutPortの出力データを表示するようになりました。

設定完了後、作成ボタンを押してください。

/jp/node/6586

InPortの動作確認

RT System Editor上でRTCをアクティブ化して動作を確認してください。

この状態でコンフィギュレーションパラメータで前進する速度を設定して、設定した速度がOutPortから出力するように操作してください。 その後、Calcの3行目のAC列のセルに31以上の値を入力するか、30以下の値を入力するかで動作が変化するかを確認してください。

/jp/node/6586

チュートリアル(RTコンポーネントの作成入門、Raspberry Pi Mouse、Python、Windows)

はじめに

このページではシミュレーター上の Raspberry Pi マウスを操作するためのコンポーネントの作成手順を説明します。

/ja/node/6198

資料のダウンロード

まずは資料をダウンロードしてください。

ZIPファイルは Lhaplus 等で展開してください。

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。

シミュレーター

シミュレーターは Open Dynamics Engine(ODE) という物理演算エンジンと ODE 付属の描画ライブラリ(drawstuff)を使用して開発しています。 OpenGL が動作すれば動くので、大抵の環境で動作するはずです。

以下の Raspberry Piマウス というロボットのシミュレーションができます。

/jp/node/6005

シミュレーター上の Raspberry Pi マウスの動力学計算、接触応答だけではなく、距離センサーのデータも現実のロボットに近い値を再現するようにしています。

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

  • RobotController コンポーネント

RaspberryPiMouseSimulator コンポーネントと接続してシミュレーター上のロボットを操作するためのコンポーネントです。

RobotController コンポーネントの作成

GUI(スライダー)によりシミュレーター上のロボットの操作を行い、センサー値が一定以上の時には自動的に停止するコンポーネントの作成を行います。

robotcomp.png

作成手順

作成手順は以下の通りです。

  • 開発環境の確認
  • コンポーネントの仕様を決める
  • RTC Builderによるソースコードのひな型コードの作成
  • ソースコードの編集
  • コンポーネントの動作確認

開発環境の確認

以下の環境を想定しています。

コンポーネントの仕様

RobotController は目標速度を出力するアウトポート、センサー値を入力するインポート、目標速度や停止するセンサー値を設定するコンフィギュレーションパラメーターを持っています。

コンポーネント名称 RobotController
InPort
ポート名 in
TimedShortSeq
説明 センサー値
OutPort
ポート名 out
TimedVelocity2D
説明 目標速度
Configuration
パラメーター名 speed_x
double
デフォルト値 0.0
制約 -1.5<x<1.5
Widget slider
Step 0.01
説明 直進速度の設定
Configuration
パラメーター名 speed_r
double
デフォルト値 0.0
制約 -2.0<x<2.0
Widget slider
Step 0.01
説明 回転速度の設定
Configuration
パラメーター名 stop_d
int
デフォルト値 30
説明 停止するセンサー値の設定

TimedVelocity2D 型について

2次元平面上の移動ロボットの移動速度を格納するデータ型である TimedVelocity2D 型を使用します。

     struct Velocity2D
     {
           /// Velocity along the x axis in metres per second.
           double vx;
           /// Velocity along the y axis in metres per second.
           double vy;
           /// Yaw velocity in radians per second.
           double va;
     };
 
 
     struct TimedVelocity2D
     {
           Time tm;
           Velocity2D data;
     };

このデータ型にはX軸方向の速度vx、Y軸方向の速度vy、Z軸周りの回転速度vaが格納できます。

vxvyvaはロボット中心座標系での速度を表しています。


/ja/node/6042

vxはX方向の速度、vyはY方向の速度、vaはZ軸周りの角速度です。

Raspberry Pi マウスのように2個の車輪が左右に取り付けられているロボットの場合、横滑りしないと仮定するとvyは0になります。

直進速度vx、回転速度vaを指定することでロボットの操作を行います。

距離センサーのデータについて

Raspberry Pi マウスの距離センサーのデータは物体との距離が近づくほど大きな値を出力するようになっています。


/ja/node/6550

デバイスファイルから取得した数値 実際の距離[m]
1394 0.01
792 0.02
525 0.03
373 0.04
299 0.05
260 0.06
222 0.07
181 0.08
135 0.09
100 0.10
81 0.15
36 0.20
17 0.25
16 0.30

シミュレーターではこの値を再現して出力しています。 RobotController コンポーネントではこの値が一定以上の時に自動的に停止する処理を実装します。

RobotController コンポーネントのひな型コードの生成

RobotController コンポーネントのひな型コードの生成は、RTCBuilder を用いて行います。

RTCBuilder の起動

Eclipse では、各種作業を行うフォルダーを「ワークスペース」(Work Space)とよび、原則としてすべての生成物はこのフォルダーの下に保存されます。 ワークスペースはアクセスできるフォルダーであれば、どこに作っても構いませんが、このチュートリアルでは以下のワークスペースを仮定します。

  • C:\workspace

まずは Eclipse を起動します。 Windows 8.1の場合は「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 1.1.2」>「OpenRTP」をクリックすると起動できます。

最初にワークスペースの場所を尋ねられますので、上記のワークスペースを指定してください。

/ja/node/6026

すると、以下のようなWelcomeページが表示されます。


/ja/node/6026
Eclipse の初期起動時の画面

Welcomeページはいまは必要ないので左上の「×」ボタンをクリックして閉じてください。

右上の [Open Perspective] ボタンをクリックしてください。

/ja/node/6026
パースペクティブの切り替え

「RTC Builder」を選択することで、RTCBuilder が起動します。メニューバーに「カナヅチとRT」の RTCBuilder のアイコンが表示されます。

/ja/node/6026
パースペクティブの選択

新規プロジェクトの作成

RobotController コンポーネントを作成するために、RTC Builder で新規プロジェクトを作成する必要があります。

左上の [Open New RTCBuilder Editor] のアイコンをクリックしてください。

/ja/node/6057
RTC Builder 用プロジェクトの作成

「プロジェクト名」欄に作成するプロジェクト名 (ここでは RobotController) を入力して [終了] ボタンをクリックします。

RT-Component-BuilderProject_1.png

指定した名称のプロジェクトが生成され、パッケージエクスプローラ内に追加されます。

PackageExplolrer_1.png

生成したプロジェクト内には、デフォルト値が設定された RTC プロファイル XML(RTC.xml) が自動的に生成されます。

RTC プロファイルエディタの起動

RTC.xml が生成された時点で、このプロジェクトに関連付けられているワークスペースとして RTCBuilder のエディタが開くはずです。 もし起動しない場合はパッケージエクスプローラーの RTC.xml をダブルクリックしてください。

/ja/node/6026

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

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

  • モジュール名: RobotController
  • モジュール概要: 任意(Robot Controller component)
  • バージョン: 任意(1.0.0)
  • ベンダ名: 任意
  • モジュールカテゴリ: 任意(Controller)


Basic_1.png
基本情報の入力


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

RobotController コンポーネントでは、onActivated()、onDeactivated()、onExecute() コールバックを使用します。下図のように①の onAtivated をクリック後に②のラジオボタンにて [ON] にチェックを入れます。 onDeactivated、onExecute についても同様の手順を行います。


Activity_1.png
アクティビティコールバックの選択


さらに、「データポート」タブを選択し、データポートの情報を入力します。 先ほど決めた仕様を元に以下のように入力します。なお、変数名や表示位置はオプションで、そのままで結構です。


  • InPort Profile:
    • ポート名: in
    • データ型: TimedShortSeq

  • OutPort Profile:
    • ポート名: out
    • データ型: TimedVelocity2D


DataPort_1.png
データポート情報の入力


次に、「コンフィギュレーション」タブを選択し、先ほど決めた仕様を元に、Configuration の情報を入力します。 制約条件および Widget とは、RTSystemEditor でコンポーネントのコンフィギュレーションパラメーターを表示する際に、スライダー、スピンボタン、ラジオボタンなど、GUI で値の変更を行うためのものです。

直進速度 speed_x、回転速度 speed_r はスライダーのより操作できるようにします。


  • speed_x
    • 名称: speed_x
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -1.5<x<1.5
    • Widget: slider
    • Step: 0.01
  • speed_r
    • 名称: speed_r
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -2.0<x<2.0
    • Widget: slider
    • Step: 0.01
  • stop_d
    • 名称: stop_d
    • データ型: int
    • デフォルト値: 30
    • Widget: text


Configuration_1.png
コンフィグレーション情報の入力


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

Language_1_2.png
プログラミング言語の選択


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


Generate_1.png
ひな型コードの生成(Generate)


※ 生成されるコード群は、eclipse 起動時に指定したワークスペースフォルダーの中に生成されます。現在のワークスペースは、[ファイル] > [ワークスペースの切り替え..]で確認することができます。

ソースコードの編集

<ワークスペースディレクトリー>/RobotController/RobotController.pyをPython用エディタで開いて編集してください。 Pythonに標準で付属しているIDLEを使う場合は、ファイルを右クリックしてEdit with IDLEをクリックするとファイルを開きます。


idle_1.png


変数初期化部分の修正

OpenRTM-aist 1.1.2のRTC Builderを使用している場合は、変数初期化部分を修正する必要があります。(OpenRTM-aist 1.2.0では修正される予定です)

まずは、init関数のself._d_in変数初期化部分を修正してください。

     def __init__(self, manager):
         OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
 
         #in_arg = [None] * ((len(RTC._d_TimedShortSeq) - 4) / 2) ←削除
         #self._d_in = RTC.TimedShortSeq(*in_arg) ←削除
         #以下の行を追加
         self._d_in = RTC.TimedShortSeq(RTC.Time(0,0),[])

次にself._d_out 変数初期化部分を修正してください。

         #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))

これで完了です。

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

RobotController コンポーネントでは、コンフィギュレーションパラメーター(speed_x、speed_y)をスライダーで操作しその値を目標速度としてアウトポート(out)から出力します。 インポート(in) から入力された値を変数に格納して、その値が一定以上の場合は停止するようにします。


onActivated()、onExecute()、onDeactivated() での処理内容を下図に示します。

RCRTC_State_1.png
アクティビティ処理の概要


下記のように、onActivated()、onDeactivated()、onExecute() を実装します。

     def onActivated(self, ec_id):
         #センサー値初期化
         self.sensor_data = [0,0,0,0]
         return RTC.RTC_OK

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

     def onExecute(self, ec_id):
         #入力データの存在確認
         if self._inIn.isNew():
             data = self._inIn.read()
             #この時点で入力データがm_inに格納される
             #入力データを別変数に格納
             self.sensor_data = data.data[:]
         #前進するときのみ停止するかを判定
         if self._speed_x[0] > 0:
             for d in self.sensor_data:
                 #センサ値が設定値以上か判定
                 if d > self._stop_d[0]:
                     #センサ値が設定値以上の場合は停止
                     self._d_out.data.vx = 0
                     self._d_out.data.va = 0
                     self._outOut.write()
                     return RTC.RTC_OK
                 
         #設定値以上の値のセンサが無い場合はコンフィギュレーションパラメータの値で操作
         self._d_out.data.vx = self._speed_x[0]
         self._d_out.data.va = self._speed_r[0]
         self._outOut.write()
                 
         return RTC.RTC_OK

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

作成した RobotController をシミュレーターコンポーネントと接続して動作確認を行います。

以下より RaspberryPiMouseSimulator コンポーネントをダウンロードしてください。

ZIPファイルは Lhaplus 等で展開してください。

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。

NameService の起動

コンポーネントの参照を登録するためのネームサービスを起動します。


「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 1.1.2」の順に辿り、「Start Naming Service」をクリックしてください。

※ 「Start Naming Service」をクリックしても omniNames が起動されない場合は、フルコンピュータ名が14文字以内に設定されているかを確認してください。

RobotController コンポーネントの起動

RobotController コンポーネントを起動します。

RobotControllerComp.pyファイルをダブルクリックして実行してください。

シミュレーターコンポーネントの起動

このコンポーネントは先ほどダウンロードしたファイル(RTM_Tutorial_2017.zip)を展開したフォルダーの EXE/RaspberryPiMouseSimulatorComp.exe を実行すると起動します。

コンポーネントの接続

下図のように、RTSystemEditor にて RobotController コンポーネント、RaspberryPiMouseSimulator コンポーネントを接続します。

RTSE_Connect_1.png
コンポーネントの接続

コンポーネントのActivate

RTSystemEditor の上部にあります [All Activate] というアイコンをクリックし、全てのコンポーネントをアクティブ化します。 正常にアクティベートされた場合、下図のように黄緑色でコンポーネントが表示されます。


RTSE_Activate_1.png
コンポーネントのアクティブ化


動作確認

下図のようにコンフィギュレーションビューの [編集] ボタンからコンフィギュレーションを変更することができます。


RTSE_Configuration_10.png

スライダーを操作してシミュレーター上の [Raspberry Pi] マウスの操作ができるかを確認してください。


RTSE_Configuration_1.png
コンフィギュレーションパラメーターの変更


実機での動作確認

講習会で Raspberry Pi マウス実機を用意している場合は実機での動作確認が可能です。

手順は以下の通りです。

  • Raspberry Pi マウスの電源を投入する
  • Raspberry Pi マウスのアクセスポイントに接続
  • ポートの接続
  • コンポーネントのアクティブ化

電源を投入する

Raspberry PiマウスにはRaspberry Piの電源スイッチとモーターの電源スイッチの2つがあります。


/ja/node/6550


内側の電源スイッチをオンにするとRaspberry Piが起動します。


/ja/node/6550


電源を切る場合

Raspberry Piの電源を切る場合は、電源スイッチから直接オフにはしないようにしてください。 3つ並んだボタンの中央のボタンを数秒押すとシャットダウンが始まります。 10秒程度でRaspbianのシャットダウンが終了するため、その後に電源スイッチをオフにしてください。


/ja/node/6042

アクセスポイントに接続

アクセスポイントへの接続方法は以下のページを参考にしてください。

SSID、パスワードは Rasoberry Pi マウスに貼り付けたシールに記載してあります。

まず右下のネットワークアイコンをクリックしてください。


/ja/node/6042

次に一覧から raspberrypi_*** を選択してください。


/ja/node/6042

パスワードを入力してください。


/ja/node/6042

※ネットワークが切り替わった場合にネームサーバーへのコンポーネントの登録やポートの接続が失敗する場合があるのでOpenRTP、ネームサーバ、コンポーネントを一旦全て終了してください。 ネットワーク切り替え後に起動した場合には問題ないので、終了させる必要はありません。

OpenRTPを終了するには右上の×を押して終了してください。システムダイアグラムを保存するかどうか聞かれますが、Don't Saveを選択してください。

/ja/node/6550

OpenRTPをデスクトップのショートカットをダブルクリックして起動してください。

RT System Editor上でネームサーバーを再起動するには「ネームサービスを起動」ボタンを再度クリックします。

/ja/node/6550

Raspberry Pi上のネームサーバー、RTC起動

※この作業は以下のLiDAR付Raspberry Piマウスで必要な作業です。LiDAR無しのRaspberry Piマウスの場合は次の作業へ進んでください。

23b47429c42d672e7f94ae0a3c9c9d6c.png

Edge、Chrome、Firefox等のWEBブラウザで192.168.11.1のアドレスにアクセスしてください。

/jp/node/6550

するとRaspberryPiMouse with OpenRTM-aistの画面が表示されます。

まずはネームサーバーを起動するため、Start NameServerボタンを押してください。

/jp/node/6550

RaspberryPiMouseRTCStartを押してください。

/jp/node/6550

元の画面に戻らない場合はBack to the top page.をクリックしてください。

/jp/node/6550

これで完了です。

ネームサーバー追加

続いてRTシステムエディタの [ネームサーバー追加] ボタンで 192.168.11.1 を追加してください。


tutorial_raspimouse0.png tutorial_raspimouse1.png



すると以下の2つの RTC が見えるようになります。

RaspberryPiMouseRTC は名城大学のロボットシステムデザイン研究室で開発されているラズパイマウス制御用の RTコンポーネントです。

ポートの接続

RTシステムエディタで RaspberryPiMouseRTC、RobotController コンポーネントを以下のように接続します。

tutorial_raspimouse41.png

モーターの電源を投入する

動作の前に、モーターの電源スイッチをオンにしてください。 モーターの電源はこまめに切るようにしてください。


/ja/node/6550


アクティブ化

そして RTC をアクティブ化すると Raspberry Pi マウスの操作ができるようになります。

チュートリアル(RTコンポーネントの作成入門、Raspberry Pi Mouse、Python、Ubuntu)

はじめに

このページではシミュレーター上の Raspberry Pi マウスを操作するためのコンポーネントの作成手順を説明します。

/jp/node/6198

資料のダウンロード

まずは資料をダウンロードしてください。

 git clone https://github.com/OpenRTM/RTM_Tutorial_RaspberryPiMouse_Python

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。

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

  • RobotController コンポーネント

RaspberryPiMouseSimulator コンポーネントと接続してシミュレーター上のロボットを操作するためのコンポーネントです。

RobotController コンポーネントの作成

GUI(スライダー)によりシミュレーター上のロボットの操作を行い、センサー値が一定以上の時には自動的に停止するコンポーネントの作成を行います。

/ja/node/6310

作成手順

作成手順は以下の通りです。

  • 開発環境の確認
  • コンポーネントの仕様を決める
  • RTC Builder によるソースコードのひな型コードの作成
  • ソースコードの編集
  • コンポーネントの動作確認

動作環境・開発環境

Linux (ここでは Ubuntu 16.04 を仮定) 上に開発環境を構築します。

OpenRTM-aistのインストール

 $ wget https://raw.githubusercontent.com/OpenRTM/OpenRTM-aist/master/scripts/pkg_install_ubuntu.sh
 $ pkg_install_ubuntu.sh -l all --yes

JDKのインストール

 # Ubuntu 18.04、18.10の場合
 $ sudo apt-get install openjdk-8-jdk
 # Ubuntu 16.04の場合
 $ sudo apt-get install default-jdk

Ubuntu 18.04、18.10の場合は以下のコマンドでjava8に切り替えます。

 $ sudo update-alternatives --config java

openrtp起動後、RTSystemEditor でネームサーバに接続できない場合があります。その場合、/etc/hosts の localhost の行に自ホスト名を追記してください。

 $ hostname
 ubuntu1804 ← ホスト名は ubuntu1804
 $ sudo vi /etc/hosts

 127.0.0.1       localhost
 を以下のように変更
 127.0.0.1       localhost ubuntu1804

Python用エディタのインストール

Visual Studio Code、PyDev等のエディタをインストールしてください。

gitのインストール

 $ sudo apt-get install git

cmakeのインストール

 $ sudo apt-get install cmake

Premake、GLUTのインストール

ODEのビルドに必要です。

 $ sudo apt-get install premake4 freeglut3-dev

RaspberryPiMouseSimulator コンポーネント

シミュレーターコンポーネントについては手動でビルドを行います。 以下のコマンドを入力してください。

 $ wget https://raw.githubusercontent.com/OpenRTM/RTM_Tutorial/master/script/install_raspimouse_simulator.sh
 $ sudo sh install_raspimouse_simulator.sh

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布の USBメモリー内のスクリプトを起動してください。

 $ sudo sh install_raspimouse_simulator_usb.sh

コンポーネントの仕様

RobotController は目標速度を出力するアウトポート、センサー値を入力するインポート、目標速度や停止するセンサー値を設定するコンフィギュレーションパラメーターを持っています。

コンポーネント名称 RobotController
InPort
ポート名 in
TimedShortSeq
説明 センサー値
OutPort
ポート名 out
TimedVelocity2D
説明 目標速度
Configuration
パラメーター名 speed_x
double
デフォルト値 0.0
制約 -1.5<x<1.5
Widget slider
Step 0.01
説明 直進速度の設定
Configuration
パラメーター名 speed_r
double
デフォルト値 0.0
制約 -2.0<x<2.0
Widget slider
Step 0.01
説明 回転速度の設定
Configuration
パラメーター名 stop_d
int
デフォルト値 30
説明 停止するセンサー値の設定

TimedVelocity2D 型について

2次元平面上の移動ロボットの移動速度を格納するデータ型である TimedVelocity2D 型を使用します。

     struct Velocity2D
     {
         /// Velocity along the x axis in metres per second.
         double vx;
         /// Velocity along the y axis in metres per second.
         double vy;
         /// Yaw velocity in radians per second.
         double va;
     };
 
 
     struct TimedVelocity2D
     {
         Time tm;
         Velocity2D data;
     };

このデータ型にはX軸方向の速度vx、Y軸方向の速度vy、Z軸周りの回転速度vaが格納できます。

vxvyvaはロボット中心座標系での速度を表しています。


/ja/node/6042

vxはX方向の速度、vyはY方向の速度、vaはZ軸周りの角速度です。

Raspberry Piマウスのように2個の車輪が左右に取り付けられているロボットの場合、横滑りしないと仮定するとvyは0になります。

直進速度vx、回転速度vaを指定することでロボットの操作を行います。

距離センサーのデータについて

Raspberry Pi マウスの距離センサーのデータは物体との距離が近づくほど大きな値を出力するようになっています。


/ja/node/6550

デバイスファイルから取得した数値 実際の距離[m]
1394 0.01
792 0.02
525 0.03
373 0.04
299 0.05
260 0.06
222 0.07
181 0.08
135 0.09
100 0.10
81 0.15
36 0.20
17 0.25
16 0.30

シミュレーターではこの値を再現して出力しています。 RobotController コンポーネントではこの値が一定以上の時に自動的に停止する処理を実装します。

RobotController コンポーネントのひな型コードの生成

RobotController コンポーネントのひな型コードの生成は、RTCBuilder を用いて行います。

RTCBuilder の起動

Eclipse では、各種作業を行うフォルダーを「ワークスペース」(Work Space)とよび、原則としてすべての生成物はこのフォルダーの下に保存されます。 ワークスペースはアクセスできるフォルダーであれば、どこに作っても構いませんが、このチュートリアルでは以下のワークスペースを仮定します。

  • /home/ユーザー名/workspace

まずは Eclipse を起動します。 OpenRTP を展開したディレクトリーに移動して以下のコマンドを入力します。

 $ ./openrtp

最初にワークスペースの場所を尋ねられますので、上記のワークスペースを指定してください。

/ja/node/6058

すると、以下のような Welcome ページが表示されます。


/ja/node/6026
Eclipse の初期起動時の画面

Welcome ページはいまは必要ないので左上の「×」ボタンをクリックして閉じてください。

右上の [Open Perspective] ボタンをクリックしてください。

/ja/node/6026
パースペクティブの切り替え

「RTC Builder」を選択することで、RTCBuilderが起動します。メニューバーに「カナヅチとRT」の RTCBuilder のアイコンが現れます。

/ja/node/6026
パースペクティブの選択

新規プロジェクトの作成

RobotController コンポーネントを作成するために、RTC Builder で新規プロジェクトを作成する必要があります。

左上の [Open New RTCBuilder Editor] のアイコンをクリックしてください。

/ja/node/6057
RTC Builder 用プロジェクトの作成

「プロジェクト名」欄に作成するプロジェクト名 (ここでは RobotController) を入力して [終了] をクリックします。

/ja/node/6310

指定した名称のプロジェクトが生成され、パッケージエクスプローラ内に追加されます。

/ja/node/6310

生成したプロジェクト内には、デフォルト値が設定された RTC プロファイル XML(RTC.xml) が自動的に生成されます。

RTC プロファイルエディタの起動

RTC.xmlが生成された時点で、このプロジェクトに関連付けられているワークスペースとして RTCBuilder のエディタが開くはずです。 もし起動しない場合はパッケージエクスプローラーの RTC.xml をダブルクリックしてください。

/ja/node/6026

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

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

  • モジュール名: RobotController
  • モジュール概要: 任意(Robot Controller component)
  • バージョン: 任意(1.0.0)
  • ベンダ名: 任意
  • モジュールカテゴリ: 任意(Controller)


/ja/node/6310
基本情報の入力


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

RobotController コンポーネントでは、onActivated()、onDeactivated()、onExecute() コールバックを使用します。下図のように①の onAtivated をクリック後に②のラジオボタンにて [ON] にチェックを入れます。 onDeactivated、onExecute についても同様の手順を行います。


/ja/node/6310
アクティビティコールバックの選択


さらに、「データポート」タブを選択し、データポートの情報を入力します。 先ほど決めた仕様を元に以下のように入力します。なお、変数名や表示位置はオプションで、そのままで結構です。


  • InPort Profile:
    • ポート名: in
    • データ型: TimedShortSeq

  • OutPort Profile:
    • ポート名: out
    • データ型: TimedVelocity2D


/ja/node/6310
データポート情報の入力


次に、「コンフィギュレーション」タブを選択し、先ほど決めた仕様を元に、Configuration の情報を入力します。 制約条件および Widget とは、RTSystemEditor でコンポーネントのコンフィギュレーションパラメーターを表示する際に、スライダー、スピンボタン、ラジオボタンなど、GUI で値の変更を行うためのものです。

直進速度 speed_x、回転速度 speed_r はスライダーのより操作できるようにします。


  • speed_x
    • 名称: speed_x
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -1.5<x<1.5
    • Widget: slider
    • Step: 0.01
  • speed_r
    • 名称: speed_r
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -2.0<x<2.0
    • Widget: slider
    • Step: 0.01
  • stop_d
    • 名称: stop_d
    • データ型: int
    • デフォルト値: 30
    • Widget: text


/ja/node/6310
コンフィグレーション情報の入力


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

/ja/node/6310
プログラミング言語の選択


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


/ja/node/6310
ひな型コードの生成(Generate)


※ 生成されるコード群は、eclipse起動時に指定したワークスペースフォルダーの中に生成されます。 現在のワークスペースは、[ファイル] > [ワークスペースの切り替え...] で確認することができます。

ソースコードの編集

<ワークスペースディレクトリー>/RobotController/RobotController.pyをPython用エディタで開いて編集してください。


idle_1.png


変数初期化部分の修正

OpenRTM-aist 1.1.2のRTC Builderを使用している場合は、変数初期化部分を修正する必要があります。(OpenRTM-aist 1.2.0では修正される予定です)

まずは、init関数のself._d_in変数初期化部分を修正してください。

     def __init__(self, manager):
         OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
 
         #in_arg = [None] * ((len(RTC._d_TimedShortSeq) - 4) / 2) ←削除
         #self._d_in = RTC.TimedShortSeq(*in_arg) ←削除
         #以下の行を追加
         self._d_in = RTC.TimedShortSeq(RTC.Time(0,0),[])

次にself._d_out 変数初期化部分を修正してください。

         #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))

これで完了です。

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

RobotController コンポーネントでは、コンフィギュレーションパラメーター(speed_x、speed_y)をスライダーで操作しその値を目標速度としてアウトポート(out)から出力します。 インポート(in) から入力された値を変数に格納して、その値が一定以上の場合は停止するようにします。


onActivated()、onExecute()、onDeactivated() での処理内容を下図に示します。

RCRTC_State_1.png
アクティビティ処理の概要


下記のように、onActivated()、onDeactivated()、onExecute() を実装します。

     def onActivated(self, ec_id):
         #センサー値初期化
         self.sensor_data = [0,0,0,0]
         return RTC.RTC_OK

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

     def onExecute(self, ec_id):
         #入力データの存在確認
         if self._inIn.isNew():
             data = self._inIn.read()
             #この時点で入力データがm_inに格納される
             #入力データを別変数に格納
             self.sensor_data = data.data[:]
         #前進するときのみ停止するかを判定
         if self._speed_x[0] > 0:
             for d in self.sensor_data:
                 #センサ値が設定値以上か判定
                 if d > self._stop_d[0]:
                     #センサ値が設定値以上の場合は停止
                     self._d_out.data.vx = 0
                     self._d_out.data.va = 0
                     self._outOut.write()
                     return RTC.RTC_OK
                 
         #設定値以上の値のセンサが無い場合はコンフィギュレーションパラメータの値で操作
         self._d_out.data.vx = self._speed_x[0]
         self._d_out.data.va = self._speed_r[0]
         self._outOut.write()
                 
         return RTC.RTC_OK

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

作成した RobotController をシミュレーターコンポーネントと接続して動作確認を行います。

以下より RaspberryPiMouseSimulator コンポーネントをダウンロードしてください。

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。

NameService の起動

コンポーネントの参照を登録するためのネームサービスを起動します。


 $ rtm-naming

RobotController コンポーネントの起動

RobotController コンポーネントを起動します。

RobotController\build\srcフォルダーの RobotControllerComp ファイルを実行してください。

 $ RobotControllerComp

シミュレーターコンポーネントの起動

RaspberryPiMouseSimulator コンポーネントをインストールしたディレクトリーに移動後、下記のコマンドにて起動できます。

 $ src/RaspberryPiMouseSimulatorComp

コンポーネントの接続

下図のように、RTSystemEditorにて RobotController コンポーネント、RaspberryPiMouseSimulator コンポーネントを接続します。

/ja/node/6310
コンポーネントの接続

コンポーネントの Activate

RTSystemEditor の上部にあります [All Activate] というアイコンをクリックし、全てのコンポーネントをアクティブ化します。 正常にアクティベートされた場合、下図のように黄緑色でコンポーネントが表示されます。


/ja/node/6310
コンポーネントのアクティブ化


動作確認

下図のようにコンフィギュレーションビューの [編集] ボタンからコンフィギュレーションを変更することができます。


RTSE_Configuration_10.png

スライダーを操作してシミュレーター上の Raspberry Pi マウスの操作ができるかを確認してください。


/ja/node/6310
コンフィギュレーションパラメーターの変更


実機での動作確認

講習会で Raspberry Pi マウス実機を用意している場合は実機での動作確認が可能です。

手順は以下の通りです。

  • Raspberry Pi マウスの電源を投入する
  • Raspberry Pi マウスのアクセスポイントに接続
  • ポートの接続
  • コンポーネントのアクティブ化

電源を投入する

Raspberry PiマウスにはRaspberry Piの電源スイッチとモーターの電源スイッチの2つがあります。


/ja/node/6550


内側の電源スイッチをオンにするとRaspberry Piが起動します。


/ja/node/6550


電源を切る場合

Raspberry Piの電源を切る場合は、電源スイッチから直接オフにはしないようにしてください。 3つ並んだボタンの中央のボタンを数秒押すとシャットダウンが始まります。 10秒程度でRaspbianのシャットダウンが終了するため、その後に電源スイッチをオフにしてください。


/ja/node/6042

アクセスポイントに接続

SSID、パスワードは Rasoberry Pi マウスに貼り付けたシールに記載してあるので、その SSID に接続してください。

※ネットワークが切り替わった場合にネームサーバーへのコンポーネントの登録やポートの接続が失敗する場合があるのでOpenRTP、ネームサーバ、コンポーネントを一旦全て終了してください。 ネットワーク切り替え後に起動した場合には問題ないので、終了させる必要はありません。

OpenRTPを終了するには右上の×を押して終了してください。システムダイアグラムを保存するかどうか聞かれますが、Don't Saveを選択してください。

/ja/node/6550

openrtpコマンドを実行してOpenRTPを起動してください。

RT System Editor上でネームサーバーを再起動するには「ネームサービスを起動」ボタンを再度クリックします。

/ja/node/6550

Raspberry Pi上のネームサーバー、RTC起動

※この作業は以下のLiDAR付Raspberry Piマウスで必要な作業です。LiDAR無しのRaspberry Piマウスの場合は次の作業へ進んでください。

23b47429c42d672e7f94ae0a3c9c9d6c.png

Edge、Chrome、Firefox等のWEBブラウザで192.168.11.1のアドレスにアクセスしてください。

/jp/node/6550

するとRaspberryPiMouse with OpenRTM-aistの画面が表示されます。

まずはネームサーバーを起動するため、Start NameServerボタンを押してください。

/jp/node/6550

RaspberryPiMouseRTCStartを押してください。

/jp/node/6550

元の画面に戻らない場合はBack to the top page.をクリックしてください。

/jp/node/6550

これで完了です。

ネームサーバー追加

続いてRTシステムエディタの [ネームサーバー追加] ボタンで 192.168.11.1 を追加してください。


tutorial_raspimouse0.png tutorial_raspimouse1.png



すると以下の2つの RTC が見えるようになります。

RaspberryPiMouseRTC は名城大学のロボットシステムデザイン研究室で開発されているラズパイマウス制御用の RTコンポーネントです。

ポートの接続

RTシステムエディタで RaspberryPiMouseRTC、RobotController コンポーネントを以下のように接続します。

/ja/node/6310

モーターの電源を投入する

動作の前に、モーターの電源スイッチをオンにしてください。 モーターの電源はこまめに切るようにしてください。


/ja/node/6550


アクティブ化

そして RTC をアクティブ化すると Raspberry Pi マウスの操作ができるようになります。

チュートリアル(rtshell入門、Raspberry Pi Mouse)

はじめに

ここではシミュレータ上のRaspberry Piマウスを操作するRTシステムの起動、終了を自動化するバッチファイル、シェルスクリプトの作成方法について説明します。 今まで実行ファイルをダブルクリックして起動したり、RTSystemEditorから操作してポートを接続したりしていたのが、スクリプトを実行するだけでシステムの起動に必要な処理を全て実行してくれます。

この実習ではRTコンポーネントの作成入門で作成したRobotControllerコンポーネントを使用します。

RTCの起動とRTSystemEditor上での操作を自動化するバッチファイル、シェルスクリプトを作成する実習を行います。

/ja/node/7097

rtshell

rtshellはコマンドラインからRTCを操作するためのツールで、RTSystemEditorと同等の機能を持ちます。

RTシステム起動の自動化

シミュレータ上のRaspberryPiマウスをRobotControllerコンポーネントで制御するシステムの起動、終了手順は以下の通りです。

  1. RaspberryPiMouseSimulatorコンポーネント、RobotControllerコンポーネントを起動する。
  2. ポートをコネクタで接続する
  3. RTCをアクティブ化する
  4. RTCを終了する

事前準備

この実習ではコマンドラインによる操作を行うため、コマンドプロンプト(Windows)、ターミナル(Ubuntu)を起動してください。

コマンドプロンプト、ターミナルを起動したら「rtls」と入力してください。 ‘rtls’ は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。と表示された場合、PythonのScriptsフォルダ(例えば「C:\Python38\Scripts」)が環境変数Pathに設定されていません。 Pythonをインストール場所を確認して環境変数を設定してください。

ポートの接続自動化

データポートの接続を自動化する手順は以下の通りです。

  • RTSystemEditor(もしくはrtshellのrtconコマンド)でポートを接続する。
  • rtshellのrtcryoコマンドで接続情報をファイルに保存する。
  • 再起動時にrtshellのrtresurrectコマンドで接続を復元する。

前準備として接続情報を保存したXMLファイルを保存し、自動起動時にはrtresurrectコマンドで状態を復元します。

RobotControllerCompRaspberryPiMouseSimulatorCompを起動後、RTSystemEditor上でポートを接続してください。

現在の状態は以下のようになっています。

/ja/node/7097

接続後、以下のコマンドでXMLファイルを保存します。 XMLファイルの保存場所は自分で分かる場所に変更してください。

 rtcryo -o C:\work\robotcontroller.xml localhost

次にrtresurrectコマンドを試してみます。 まずは全てのコネクタを削除してください。 RTSystemEditorでコネクタをクリックしてDeleteキーを押すか、右クリックしてDeleteを選択してください。

/ja/node/7097

現在は以下の状態になっています。

/ja/node/7097

以下のコマンドを入力してください。 XMLファイルの場所は保存した場所に変更してください。

 rtresurrect C:\work\robotcontroller.xml

ポートが接続された状態に戻ったかを確認してください。 現在は以下の状態になっているはずです。

/ja/node/7097

RTCのアクティブ化の自動処理

rtshellのrtstartでRTCをアクティブ化します。 以下のコマンドを入力してください。

 rtstart C:\work\robotcontroller.xml

現在は以下の状態になっており、シミュレータ上のRaspberryPiマウスが操作可能になっているはずです。

/ja/node/7097

次にRTCの非アクティブ化を試してみます。 以下のrtstopコマンドを入力してください。

 rtstop C:\work\robotcontroller.xml

これでRTCが非アクティブ化されて以下の状態になっているはずです。

/ja/node/7097

RTCの終了の自動化

rtshellのrtexitでRTCを終了します。

以下のコマンドを試してみてください。

 rtexit localhost/RaspberryPiMouseSimulator0.rtc
 rtexit localhost/%COMPUTERNAME%.host_cxt/RobotController0.rtc

RTCはデフォルトの設定でホスト名.host_cxtのコンテキストの下にコンポーネントを登録します。

/ja/node/7097

※Ubuntuの場合はHOSTNAME=`hostname`を追加して、%COMPUTERNAME%${HOSTNAME}に変更してください。

これでRTCが終了したはずです。

バッチファイル、シェルスクリプトの作成

RTシステムを起動、終了するバッチファイル、シェルスクリプトを作成します。

Windowsの場合は以下のバッチファイルを作成してください。

  • robotcontroller_start.bat
  • robotcontroller_exit.bat

バッチファイルの作成手順は以下の通りです。

名前変更時に、エクスプローラーで拡張子を非表示にしている場合は注意してください。

バッチファイルはメモ帳などで開いてください。

Ubuntuの場合は以下のシェルスクリプトを作成してください。

  • robotcontroller_start.sh
  • robotcontroller_exit.sh

起動スクリプトの作成

まずはrobotcontroller_start.batrobotcontroller_start.shを編集します。

robotcontroller_start.batをメモ帳などで開いて、RobotControllerComp、RaspberryPiMouseSimulatorCompを起動する手順をバッチファイル、シェルスクリプトに記述します。

Windowsの場合は以下のコマンドを記述してください。

 start "" /d C:\workspace\RobotController\build\src\Release RobotControllerComp.exe
 start "" /d C:\work\RTM_Tutorial\EXE RaspberryPiMouseSimulatorComp.exe
 timeout 2

Ubuntuの場合は以下のコマンドを記述してください。

 cd ~/workspace/RobotController/build/src/
 ./RobotControllerComp&
 cd ~/RasPiMouseSimulatorRTC/build
 src/RaspberryPiMouseSimulatorComp&
 sleep 2

RobotControllerComp、RaspberryPiMouseSimulatorCompのパスは環境に合わせて変更してください。 RTCが起動しないと後のコマンドが実行できないためtimeout、sleepコマンドで待機するようにしてあります。

次にポートの接続、RTCのアクティブ化を実行するコマンドを記述してください。

 rtresurrect C:\work\robotcontroller.xml
 rtstart C:\work\robotcontroller.xml

編集が終わったら、robotcontroller_start.bat、robotcontroller_start.shを実行してみてください。 問題がなければRTCが自動起動してシミュレータが実行されているはずです。 RTCが起動しない、ポートが接続されないなどの場合は、実行ファイルのパス、XMLファイルのパスを確認してください。

終了スクリプトの作成

次にrobotcontroller_exit.batrobotcontroller_exit.shを編集します。

以下のコマンドを記述してください。

 rtexit localhost/RaspberryPiMouseSimulator0.rtc
 rtexit localhost/%COMPUTERNAME%.host_cxt/RobotController0.rtc

Ubuntuの場合は以下のコマンドを記述してください。

 HOSTNAME=`hostname`
 rtexit localhost/RaspberryPiMouseSimulator0.rtc
 rtexit localhost/${HOSTNAME}.host_cxt/RobotController0.rtc

編集が終わったら、robotcontroller_exit.bat、robotcontroller_exit.shを実行してみてください。 問題がなければ実行中のRTCが終了するはずです。

チュートリアル(SLAM実習)

はじめに

このページではLiDAR付RaspberryPiマウスを用いてSLAMによるナビゲーションを行います。

23b47429c42d672e7f94ae0a3c9c9d6c.png

SLAMはSimultaneous Localization and Mappingの略で、環境地図作成と自己位置推定を同時に実行することを指し、本チュートリアルでは 移動ロボットのナビゲーションに関わるRTコンポーネント群を使用します。

移動ロボットのナビゲーションに関わるRTコンポーネント群はMRPTという自己位置推定、環境地図作成、経路計画などの機能を提供するクロスプラットフォームなライブラリを使用しています。

事前準備

LiDARの取り付け

まずRaspberryPiマウスにLiDARを取り付けます。

LiDARマウントには2種類あります。以下に記載の(1)専用LiDARマウント、(2)マルチLiDARマウントの取付手順を参考にしてRaspberry Piマウス本体に取り付けてください。

専用LiDARマウント

以下の画像のように2本のねじで止めるマウントの場合、下記の手順で取り付けてください。

/jp/node/7098

以下のRaspberry Piマウス本体、LiDAR、タッピングビスを用意してください。

/jp/node/7098

次にRaspberry Piマウス底面のねじを外してください。

/jp/node/7098

基盤部分をフレームごとずらしてください。

/jp/node/7098

次にスペーサーを手で回して外してください。

/jp/node/7098

センサ基盤を外してください。

/jp/node/7098
/jp/node/7098

LiDARをRaspberry Piマウスの上部分に載せてビスで固定してください。

/jp/node/7098
/jp/node/7098
/jp/node/7098

Raspberry PiマウスとLiDARをUSBポートで接続してください。

/jp/node/7098
/jp/node/7098

外したパーツを元に戻せば完成です。

マルチLiDARマウント

以下の画像のように4つのツメを引っかけるマウントの場合、下記の手順で取り付けてください。

/jp/node/7098

以下のように4つのツメをRaspberry Piマウス本体に引っかけます。

まず、前方の2つのツメを引っかけてください。

/jp/node/7098

次に後ろのツメを引っかけます。

/jp/node/7098

そして、マルチLiDARマウントの前方2か所をなべタッピングネジ3-8で固定すれば取付完了です。

/jp/node/7098
/jp/node/7098

Raspberry PiマウスとLiDARをUSBポートで接続してください。

/jp/node/7098

LiDARの取り付け作業が完了したらRaspberryPiマウスの電源スイッチをオンにしてアクセスポイントに接続してください。

MapServer、NavigationManagerのダウンロード

講習会でUSBメモリを配布している場合は、ダウンロードは不要です。

MapServer、NavigationManagerはGUIで操作します。 Raspberry Piでも起動可能ですが、その場合Raspberry Piをディスプレイに接続するか、X Window Systemで他のPCに画面を表示するかする必要があります。 今回はMapServer、NavigationManagerをPC上で起動するため、以下から実行に必要なファイルをダウンロードしてください。

MapServer、NavigationManagerはRTM_Tutorial.zipを展開したフォルダのNavigationフォルダに含まれています。

SLAMによるナビゲーション地図生成システム

この章では自己位置推定をしながら環境地図生成を行うシステムを試してみます。 MRPTはICP-SLAM、RBPF-SLAMなどのアルゴリズムが使用可能ですが、移動ロボットのナビゲーションに関わるRTコンポーネント群ではICP-SLAMを使用します。 ICPアルゴリズムは2つの点群データ(地図データ、LRFで取得した最新のデータ)を平行移動、回転を繰り返すことで、対応関係にある点の距離が最短になるように位置合わせをするアルゴリズムです。 ICPアルゴリズムで作成中の地図データの点群データとLRFで取得したデータを位置合わせすることで現在の位置を計算します。

Mapperシステムの起動(Raspberry Pi)

まずはWEBブラウザの操作でMapperシステムを起動します。

/jp/node/7098

元の画面に戻らない場合は「Back to the top page.」を押してください。

/jp/node/7098

NavigationManagerの起動(PC)

次にNavigationManagerを起動します。 Navigationフォルダ内の以下のバッチファイル、シェルスクリプトを実行してください。

  • NavigationManager.bat(Windows)
  • NavigationManager.sh(Ubuntu)

すると以下のGUIが起動します。

/jp/node/7098

ポートの接続、RTCのアクティブ化

RTSystemEditorのネームサービスビューは以下の状態になっているはずです。

/jp/node/7098

まずはWEBブラウザの操作でConnectボタンを押してください。 これでRaspberry Pi上のRTCのポートは接続されます。

/jp/node/7098

システムダイアグラム上で以下のように接続してください。

/jp/node/7098

NavigationManagerに関わる部分以外は接続済みのため、以下のポートを接続します。

コンポーネント名 ポート名 コンポーネント名 ポート名
NavigationManager0 mapperService Mapper_MRPT0 gridMapper
NavigationManager0 currentPose Mapper_MRPT0 estimatedPose
NavigationManager0 targetVelocity RaspberryPiMouseRTC0 target_velocity_in
NavigationManager0 range RPLiderRTC0 range

接続したらRTCをアクティブ化してください。

/jp/node/7098

地図作成

NavigationManagerのGUIのStart Mappingボタンを押してください。

/jp/node/7098

次にRTCをアクティブ化した時に以下のジョイスティックGUIが起動しているため、黄色い円をマウスで操作してください。 それでRaspberry Piマウスが移動します。

/jp/node/7098

しばらく操作すると以下のように環境地図が得られます。

/jp/node/7098

地図生成が終了したらStop Mappingボタンを押してください。

/jp/node/7098

次に地図データを保存します。 Save Mapボタンを押してください。

/jp/node/7098

ファイル名をtestMapと設定して、Navigationフォルダに保存してください。
開くボタンをクリックすると保存されます。

/jp/node/7098

最後にWEBブラウザの操作でMapperシステムを終了させます。

/jp/node/7098

ナビゲーション(経路計画)システムの実行

ここからは作成した環境地図データを用いてRaspberry Piマウスの経路計画を試してみます。

PathPlanシステムの起動(Raspberry Pi)

WEBブラウザの操作でPathPlanシステムを起動します。

/jp/node/7098

元の画面に戻らない場合は「Back to the top page.」を押してください。

NavigationManager、MapServerの起動(PC)

次にNavigationManagerとMapServerを起動します。 NavigationManagerが起動済みの場合はMapServerのみを起動してください。 Navigationフォルダ内の以下のバッチファイル、シェルスクリプトを実行してください。

  • NavigationManager.bat(Windows)、NavigationManager.sh(Ubuntu)
  • MapServer.bat(Windows)、MapServer.sh(Ubuntu)

ポートの接続、RTCのアクティブ化

RTSystemEditorのネームサービスビューは以下の状態になっているはずです。

/jp/node/7098

まずはWEBブラウザの操作でConnectボタンを押してください。 これでRaspberry Pi上のRTCのポートは接続されます。

/jp/node/7098

システムダイアグラム上で以下のように接続してください。

/jp/node/7098

コンポーネント名 ポート名 コンポーネント名 ポート名
NavigationManager0 mapServer MapServer0 mapServer
NavigationManager0 pathPlanner PathPlanner_MRPT0 pathPlanner
NavigationManager0 pathFollower SimplePathFollower0 PathFollower
NavigationManager0 currentPose Localization_MRPT0 estimatedPose
NavigationManager0 range RPLiderRTC0 range
MapServer0 mapServer Localization_MRPT mapServer

接続したらRTCをアクティブ化してください。

/jp/node/7098

経路生成

まずはRaspberry Piマウスの目標位置、目標姿勢角を設定します。 NavigationManagerのGUIの地図上の目標位置となる場所をクリックしてください。 地図上の白い部分が障害物を検出しなかった範囲のため、白い範囲のどこかをクリックしてください。

/jp/node/7098

以下の画面が表示されるので、目標角度を設定します。

/jp/node/7098

適当な場所をクリックすると中心から延びる赤い線の角度が変化するので、適当な角度に設定してください。

/jp/node/7098

OKボタンを押すと地図上に目標位置が表示されます。

/jp/node/7098

次にPlan Pathボタンを押してください。

/jp/node/7098

これで目標位置までの目標経路が計算されました。

/jp/node/7098

経路追従

Followボタンを押すと経路追従を開始します。

/jp/node/7098

動作確認が終了したら、WEBブラウザのStopボタンからPathPlanシステムを終了してください。

/jp/node/7098

チュートリアル(画像処理実習)

はじめに

このページでは、OpenCVの画像処理により図形を検出して移動ロボット (Raspberry Piマウス) を追従させるRTCの作成手順を説明します。

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

  • CircleTracking コンポーネント:OpenCVライブラリのHoughCircles関数で画像から円を検出して、検出した円の方向に移動ロボットが回転するように制御するRTC
    /jp/node/7197

HoughCircles関数について

HoughCirclesはハフ変換を用いてグレースケール画像から円を検出する関数です。 詳細は以下のページを参照。

RTCの概要

カメラで取得した画像をグレースケール画像に変換後、HoughCircles関数で円を検出します。 検出した円の方向に移動ロボットが回転するように制御します。 具体的には、検出した円の位置が画像の右側の場合は右回り、左側の場合は左回りの回転する目標速度を指令します。 また、動作確認用に円の位置情報を付加した画像を出力します。

/jp/node/7197

RTCの作成

以降はRTCの基本的な作成方法を理解している前提で進めます。 基本的な作成手順は以下のページを参照。

RTCBuilderによるひな型コード生成

RTCBuilderで、以下の仕様のRTCのひな型コードを生成します。

コンポーネント名称 CircleTracking
アクティビティ onActivated、onDeactivated、onExecute
言語 C++
InPort
ポート名 image_in
RTC::CameraImage
説明 入力画像
InPort
ポート名 velocity_in
RTC::TimedVelocity2D
説明 変更前の目標速度
OutPort
ポート名 image_out
RTC::CameraImage
説明 円の情報を付加した画像
OutPort
ポート名 velocity_out
RTC::TimedVelocity2D
説明 変更後の目標速度
Configuration
パラメーター名 speed_r
double
デフォルト値 0.5
制約 0.0<x<2.0
Widget slider
Step 0.01
説明 図形の位置により、右回転、左回転する場合の回転速度
Configuration
パラメーター名 houghcircles_dp
double
デフォルト値 2
Widget text
説明 HoughCircles関数の引数dp
Configuration
パラメーター名 houghcircles_minDist
double
デフォルト値 30
Widget text
説明 HoughCircles関数の引数minDist
Configuration
パラメーター名 houghcircles_param1
double
デフォルト値 100
Widget text
説明 HoughCircles関数の引数param1
Configuration
パラメーター名 houghcircles_param2
double
デフォルト値 100
Widget text
説明 HoughCircles関数の引数param2
Configuration
パラメーター名 houghcircles_minRadius
double
デフォルト値 0
Widget text
説明 HoughCircles関数の引数minRadius
Configuration
パラメーター名 houghcircles_maxRadius
double
デフォルト値 0
Widget text
説明 HoughCircles関数の引数maxRadius

RTC::CameraImage型について

RTC::CameraImage型は画像データを格納するデータ型です。

    struct CameraImage
    {
        /// Time stamp.
        Time tm;
        /// Image pixel width.
        unsigned short width;
        /// Image pixel height.
        unsigned short height;
        /// Bits per pixel.
        unsigned short bpp;
        /// Image format (e.g. bitmap, jpeg, etc.).
        string format;
        /// Scale factor for images, such as disparity maps, where the integer pixel value should be divided by this factor to get the real pixel value.
        double fDiv;
        /// Raw pixel data.
        sequence<octet> pixels;
    };

このデータ型には、画像の幅width、画像の高さheight、画像データpixels等を設定できます。

/ja/node/7197

ファイル編集

以下のファイルを編集します。

  • src/CMakeLists.txt
  • include/CircleTracking/CircleTracking.h
  • src/CircleTracking.cpp

src/CMakeLists.txtの編集

srcフォルダのCMakeLists.txtをメモ帳などで開いて編集してください。 ここでは、OpenCVを利用するための設定を行います。

以下のようにfind_packageによりOpenCVのライブラリを検出します。 find_packageの行を追加してください。

 set(comp_srcs CircleTracking.cpp )
 set(standalone_srcs CircleTrackingComp.cpp)
 
 find_package(OpenCV REQUIRED) #追加

次にリンクするライブラリに、OpenCVのライブラリを追加します。 以下の2か所を変更します。

 # target_link_libraries(${PROJECT_NAME} ${OPENRTM_LIBRARIES}) #修正前
 target_link_libraries(${PROJECT_NAME} ${OPENRTM_LIBRARIES} ${OpenCV_LIBS}) #修正後、${OpenCV_LIBS}を追加する

 # target_link_libraries(${PROJECT_NAME}Comp ${OPENRTM_LIBRARIES} ${OpenCV_LIBS}) #修正前
 target_link_libraries(${PROJECT_NAME}Comp  ${OPENRTM_LIBRARIES} ${OpenCV_LIBS}) #修正後、${OpenCV_LIBS}を追加する

include/CircleTracking/CircleTracking.h

include/CircleTracking/CircleTracking.hの編集を行います。 まず、37行目付近でインクルードファイルを記述します。

 #include <rtm/DataInPort.h>
 #include <rtm/DataOutPort.h>
 
 #include <opencv2/opencv.hpp> //追加

314行目付近にprivate:という記述があるため、その下にm_imageBuffm_outputBuffm_directionの3つのメンバ変数を追加します。

 private:
   cv::Mat m_imageBuff; //追加、入力画像を格納する変数
   cv::Mat m_outputBuff; //追加、円の情報を付加した画像を格納する変数
   int m_direction; //追加、移動ロボットの回転方向を格納する変数

src/CircleTracking.cpp

src/CircleTracking.cppの編集を行います。 onActivatedonDeactivatedonExecuteの3つの関数を編集します。

 RTC::ReturnCode_t CircleTracking::onActivated(RTC::UniqueId /*ec_id*/)
 {
   // OutPortの画面サイズを0に設定
   m_image_out.width = 0;
   m_image_out.height = 0;
 
   //進行方向を0(回転方向を指定しない)に設定
   m_direction = 0;
   return RTC::RTC_OK;
 }

 RTC::ReturnCode_t CircleTracking::onDeactivated(RTC::UniqueId /*ec_id*/)
 {
   if (!m_outputBuff.empty())
   {
     // 画像用メモリの解放
     m_imageBuff.release();
     m_outputBuff.release();
   }
 
   return RTC::RTC_OK;
 }

 RTC::ReturnCode_t CircleTracking::onExecute(RTC::UniqueId /*ec_id*/)
 {
   if (m_image_inIn.isNew()) {
     cv::Mat gray;
     std::vector<cv::Vec3f> circles;
     // 画像データの読み込み
     m_image_inIn.read();
 
     // InPortとOutPortの画面サイズ処理およびイメージ用メモリの確保
     if (m_image_in.width != m_image_out.width || m_image_in.height != m_image_out.height)
     {
       m_image_out.width = m_image_in.width;
       m_image_out.height = m_image_in.height;
 
       m_imageBuff.create(cv::Size(m_image_in.width, m_image_in.height), CV_8UC3);
       m_outputBuff.create(cv::Size(m_image_in.width, m_image_in.height), CV_8UC3);
 
     }
 
     // InPortの画像データをm_imageBuffにコピー
     std::memcpy(m_imageBuff.data, (void*)&(m_image_in.pixels[0]), m_image_in.pixels.length());
 
     //カラー画像をグレースケールに変換
     cv::cvtColor(m_imageBuff, gray, cv::COLOR_BGR2GRAY);
 
     //HoughCircles関数で円を検出する
     cv::HoughCircles(gray, circles, cv::HOUGH_GRADIENT, m_houghcircles_dp, m_houghcircles_minDist, 
       m_houghcircles_param1, m_houghcircles_param2, m_houghcircles_minRadius, m_houghcircles_maxRadius);
 
     
     //円を検出できた場合の処理
     if (!circles.empty())
     {
       //円の位置が画像の左側の場合は左回りに回転するように設定
       if (circles[0][0] < gray.cols / 2)
       {
         m_direction = 1;
       }
       //円の位置が画像の右側の場合は右回りに回転するように設定
       else
       {
         m_direction = 2;
       }
     }
     //円を検出できなかった場合は回転方向の指定をしないように設定
     else
     {
       m_direction = 0;
     }
 
     //元のカラー画像をコピーして円の情報を画像に追加
     std::memcpy(m_outputBuff.data, (void*)&(m_image_in.pixels[0]), m_image_in.pixels.length());
 
     for (auto circle : circles)
     {
       cv::circle(m_outputBuff, cv::Point(static_cast<int>(circle[0]), static_cast<int>(circle[1])), static_cast<int>(circle[2]), cv::Scalar(0, 0, 255), 2);
     }
 
     // 画像データのサイズ取得
     int len = m_outputBuff.channels() * m_outputBuff.cols * m_outputBuff.rows;
     m_image_out.pixels.length(len);
 
     // 円の情報を付加した画像データをOutPortにコピー
     std::memcpy((void*)&(m_image_out.pixels[0]), m_outputBuff.data, len);
     //画像データを出力
     m_image_outOut.write();
   }
 
   if (m_velocity_inIn.isNew()) {
     //速度指令値を読み込み
     m_velocity_inIn.read();
     m_velocity_out = m_velocity_in;
     
     //円が画像の左側にある場合、左回りに回転する
     if (m_direction == 1)
     {
       m_velocity_out.data.va = m_speed_r;
     }
     //円が画像の右側にある場合、右回りに回転する
     else if (m_direction == 2)
     {
       m_velocity_out.data.va = -m_speed_r;
     }
     //速度指令値を出力
     m_velocity_outOut.write();
   }
   return RTC::RTC_OK;
 }

RTシステムの構築、動作確認

ここからはRTSystemEditorで作業します。 Raspberry Piマウスを使用する場合は、Raspberry Piのアクセスポイントに接続した状態で作業してください。 以下のページのRobotControllerコンポーネントが必要なため、実機での動作確認まで進めておいてください。

事前準備

動作確認には、Raspberry Piマウス、USBカメラ、カメラ用マウント、LiDAR付属のネジ、円形状の図形を印刷した紙が必要です。 講習会ではUSBカメラとカメラ用マウントは接続済みです。紙も配布しています。

/jp/node/7197

専用LiDARマウントかマルチLiDARマウントかで使用するネジが異なります。

まず、以下の専用LiDARマウントの場合は、ネジは2個付属しているので、それを使用してください。

/jp/node/7098
/jp/node/7197

以下のマルチLiDARマウントの場合は、なべタッピングネジ3-8を使用してください。

/jp/node/7098
/jp/node/7098

以下のようにRaspberry Piマウス前方の2か所で固定します。

/jp/node/7197

PCとUSBカメラをUSBポートで接続してください。

/jp/node/7197

動作確認

RTCの起動

動作確認には、以下の5つのRTCの起動が必要です。

  • RaspberryPiMouseRTC
  • RobotController
  • OpenCVCamera
  • CameraViewer
  • CircleTracking

RaspberryPiMouseRTCとRobotControllerコンポーネントの起動ついては、以下のページの手順を参考にしてください。

OpenCVCamera、CameraViewerはOpenRTM-aist付属のサンプルコンポーネントです。 Windows 10の場合は、画面左下の「ここに入力して検索」にC++_OpenCV-Examplesと入力して、C++_OpenCV-Examplesを選択したら起動するエクスプローラからCameraViewer.batOpenCVCamera.batをダブルクリックして実行してください。

/jp/node/7197

Ubuntuの場合はビルドとインストール作業が必要です。

CircleTrackingはビルドで生成したCircleTrackingComp.exeを実行してください。

RTシステムの構築

RTSystemEditor上で以下のようにポートを接続してください。

/jp/node/7197

RTC名 OutPort名 RTC名 InPort名
OpenCVCamera0 out CircleTracking0 image_in
RobotController0 out CircleTracking0 velocity_in
CircleTracking0 image_out CameraViewer0 in
CircleTracking0 velocity_out RaspberryPiMouseRTC0 target_velocity_in
RaspberryPiMouseRTC0 ir_sensor_out RobotController in

RTCをアクティブ化すれば動作確認を開始します。

カメラの前で円形状の図形を印刷した紙を左右に動かして、動作を確認してください。

opencv9.png

OpenCVCameraコンポーネントがRaspberry Piマウスに取り付けたUSBカメラではなく、別のUSBカメラやノートPC内蔵カメラを使用する場合があります。 この場合は他のカメラの画像が表示されているので、RTSystemEditorでOpenCVCamera0を選択して、コンフィギュレーションパラメータを編集します。

opencv4_2.jpg

以下のdevice_numを変更して確認してください。

opencv5_2.jpg

また、円の誤検出が多い場合、RTSystemEditorでCircleTracking0を選択して、コンフィギュレーションパラメータを変更して試してみてください。

opencv6_2.jpg

HoughCircles関数の引数の詳細についてはOpenCVのドキュメントを参考にしてください。

opencv7_2.jpg

ポートの接続に失敗した場合の対処方法

はじめに

このページでは別々のマシンで起動したRTCのデータポート、サービスポートを接続した場合に発生する問題の解決方法について解説する。

/jp/node/7103

RTSystemEditorで「接続に失敗しました」と表示される場合

以下のようにRTSystemEditorで「接続に失敗しました」と表示される場合、エンドポイントの設定が適切ではないか、あるいはファイアーウォールなどで通信が遮断されているケースが考えられます。

/jp/node/7103

ファイアーウォールで通信が遮断されることが原因の場合

Windowsファイアウォールの場合はファイアウォールの場合はファイアウォールを無効にするか、RobotController.exeの通信を許可するように設定する必要があります。

ウィルス対策ソフトのファイアウォールで遮断されている場合は、使用しているウィルス対策ソフトのマニュアルなどを読んで対応してください。

エンドポイントの設定が不適切のため到達できないアドレスに設定されていることが原因の場合

コマンドプロンプトを起動して、ipconfigコマンドでIPアドレスを確認してください。

講習会で使用するRaspberry Piマウスのアクセスポイントに接続した場合は192.168.11.**のIPアドレスが設定されているはずです。 EV3のアクセスポイントの場合は192.168.0.**です。

次にPCで起動したRTCのエンドポイントの設定を確認します。

RTSystemEditorのネームサービスビューでRTCを右クリックしてIORを表示してください。

/jp/node/7103

IOR表示の画面でProfileからIPアドレスを確認できます。

/jp/node/7103

ここで確認したIPアドレスが192.168.11.**(もしくは192.168.0.**)でない場合はRTC起動時にエンドポイントの設定を行う必要があります。 rtc.confのcorba.endpointsオプションで設定します。

 corba.endpoints: 192.168.11.**

rtc.confをテキストエディタで開いて編集して、RTCの実行ファイルと同じフォルダに配置して起動するか、コマンドラインオプションでrtc.confを指定して起動します。

 RobotControllerComp.exe -f rtc.conf

もしくは、コマンドラインオプションで直接corba.endpointsを設定することもできます。

  RobotControllerComp.exe -o corba.endpoints:192.168.11.**

データポートの片方で色が変化しない、もしくはコネクタが表示されない場合

RTSystemEditorでデータポートの接続を行った場合に、以下のようにデータポートの片方の色が変化しない事があります。

/jp/node/7103

もしくはコネクタが表示されない場合もあります。

この場合は、一旦System DiagramからRTCを削除してください。※終了(exit)ではありません。
RTCを選択してDeleteキーを押すか、右クリックしてDeleteを選択してください。

/jp/node/7103

削除したら、もう一度ネームサービスビューからSystem Diagramにドラッグアンドドロップしてください。 これで問題が解決していれば、RTSystemEditorのコンポーネントオブザーバー機能が原因のため、大抵の場合はOpenRTPの再起動で解決します。

RTSystemEditorが応答なしになる場合

RTSystemEditorが応答なしになる場合、もしくはしばらく待てば動くが片方のポートの色が変化しない場合等があります。 この場合は、ファイアウォールなどで通信が遮断されていることが原因であることがほとんどです。

それで解決しない場合はRaspberry Pi、EV3側のRTCを再起動してください。RTCの実行中の問題で応答なしになっている可能性があります。

またSystem Diagramを長時間使用していると不具合が発生することがあります。 System Diagramを×を押して削除後、もう一度System Diagramを表示して下さい。