• 検索結果がありません。

スライド 1

N/A
N/A
Protected

Academic year: 2021

シェア "スライド 1"

Copied!
23
0
0

読み込み中.... (全文を見る)

全文

(1)

UEC Tokyo

Dept. of Mechanical Engineering and Intelligent Systems

OpenRTMを使ってみよう!

基本編(コンソール版)-

電気通信大学情報理工学研究科

知能機械工学専攻

長井隆行、中村友昭

(2)

RTMとは

R

obot

T

echnology

M

iddleware

コンポーネント(モジュール)を動かす実行環境のこと

 ミドルウェア上で動作するコンポーネントであればOS・言語等 に関係なく通信が可能  DiGORO ⇨ ClientNet+サーバー(DiGORO.net)に相当

RTM上で動くものであれば、他の人が作成したコンポー

ネントを使用できる(再利用性が高い)

RTミドルウェア チャット コンポーネント1 チャット コンポーネント2 Windows, C# Linux, C++ カメラ 音声 アーム 台車 RTミドルウェア RTMよるロボットの構成

(3)

OpenRTM

RTMの実装の1つ

DiGORO.net, ROS, OpenRTM等がある

DiGORO.net : 長井研ローカル、再利用性低い

ROS : Windowsのサポートがいまいち

OpenRTM : 国産、様々なOSに対応、資料が日本語

OpenRTMとDiGORO.netの違い

DiGORO.net

単純なデータの送信のみをサポート

OpenRTM

データだけでなく機能を変更するようなクラスも送受信可能 その他いろんな機能があるみたい 

(4)

開発言語

OpenRTM-aist

 オリジナルのOpenRTMで産総研が開発  C++, Python, Javaに対応  なんか使いづらい

OpenRTM.Net, PyRTSeam

 株式会社セックが改良 (http://www.sec.co.jp/robot/)  C#, C++/CLI, Python  非常に使いやすいが、C++が使えない

とりあえず

 C++/CLI ⇨ C++と互換性あり

OpenRTM.NETのC++/CLIで作ってみよう!

(5)

C++/CLI

C++ / Common Language Interface

 C++と.Net(MSが作った言語)が同時に使用可能

.Netの概要

 関数は存在せず全てクラスになっている

 int, float, double等数値(数値型)以外は全てクラス(参照クラス)

 int, float, double等数値型も実はクラス(ボックス化)

 .Netのクラスの宣言には^を付ける (参照クラス=高機能ポインタ)

 C++ : Class c;

 .Net : Class ^c;

 .Netのクラスはgcnew(garbage collection new)しなければならない (ポインタと同じなので生成が必要)

 Class ^c = gcnew Class();

(6)

C++/CLI

例:C++と.Netを同時使用した例

int arr1[10]; // C++配列の宣言

array<int> ^arr2 = gcnew array<int>(10); // .Netの配列クラスの宣言 // 代入

for(int i=0 ; i<10 ; i++ ){ arr1[i] = i; arr2[i] = i; }

// 表示

for(int i=0 ; i<10 ; i++ ){

printf("%d %d¥n" , arr1[i] , arr2[i] ); }

(7)

インストール

以下の2つを順にインストール

OpenRTM-aist-1.1.0-RELEASE_vc9.msi

http://www.openrtm.org/openrtm/ja/node/5012

OpenRTM.NET-1.3.0.msi

http://www.sec.co.jp/robot/download_rtm.html

Javaを最新版にする

http://www.java.com/ja/

実験PCはインストール済みなので必要ない

(8)

サンプルの起動

 ネーミングサービスの開始  [スタータ]→[プログラム]→[OpenRTM.Net]→[ツール] →[ネーミングサービスの開始]  コンポーネント起動  [スタータ]→[プログラム]→[OpenRTM.Net]→[サンプル]→[バイナリ]  SimpleIO¥ConsoleIn¥ConsoleIn.Exe  SimpleIO¥ConsoleOut¥ConsoleOut.Exe  コンポーネント接続プログラムを起動  [スタータ]→[プログラム]→[OpenRTM-aist 1.1]→[C++]→[tools] →[RTSystemEditor]

(9)

RT System Editor

コンポーネント同士を接続するためのGUIプログラム

ONにする 現在起動 中のコン ポーネント 2つのコンポネントを ドラッグアンドドロップ

(10)

コンポーネントの接続 1/3

コンポーネント同士の入力ピンと出力ピンの接続

一方のピンをドラッグし、 もう一方のピンへドロップ 出力ピン 入力ピン

(11)

コンポーネントの接続 2/3

コンポーネント同士の入力ピンと出力ピンの接続

出力ピン

(12)

コンポーネントの接続 3/3

コンポーネント同士の入力ピンと出力ピンの接続

出力ピン 入力ピン 右クリック ⇓ All Activate

(13)

コンポーネントの通信

I/F name: ConsoleIn0.out

I/F type: IDL:RTC/TimedLong:1.0 Polarity: PROVIDED

I/F name: ConsoleIn0.out

I/F type: OpenRTM.Core.TimedLong Polarity: PROVIDED

Properties

port.port_type: DataOutPort

dataport.data_type: IDL:RTC/TimedLong:1.0 dataport.dataflow_type: push, pull

dataport.subscription_type: flush, new, periodic dataport.interface_type: corba_cdr, local

Please Input Number> 10 Please Input Number>

ConsoleIn

I/F name: ConsoleOut0.in

I/F type: IDL:RTC/TimedLong:1.0 Polarity: REQUIRED

I/F name: ConsoleOut0.in

I/F type: OpenRTM.Core.TimedLong Polarity: REQUIRED

Properties

port.port_type: DataInPort

dataport.data_type: IDL:RTC/TimedLong:1.0 dataport.dataflow_type: push, pull

dataport.subscription_type: any

dataport.interface_type: corba_cdr, local time = 2012/03/12 9:07:25

data = 10

ConsoleOut

(14)

コンポーネントの作り方

 ダイアログのテンプレートから作成  DiGOROClientRTC_Con ver1.1 (2012年8月23日現在)  整数型のデータを受信し、その値に100を足して送信するサンプル  main関数内を見れば簡単に理解できる  送受信できる型(すべて.Netのクラス)  TimedLong :整数型  TimedString :文字列型  TimedDouble :少数型  TimedLongSeq :整数配列  TimedStringSeq :文字列配列  TimedDoubleSeq : 少数配列

 これ以外にも、Float, Short, ULong等一般的な型が存在

 タイムスタンプとデータから構成 TimedLong ^data = gcnew TimedLong();

(15)

ロボット向け拡張データ型

TimedVelocity2D

data ⇒ Data ⇒

double VelocityX, double VelocityY, double VelocityYaw

data ⇒ Time

例)

double velYaw = 0.0;

TimedVelocity2D ^data = gcnew TimedVelocity2D(); //ロボットの移動 m_component->GetInData( data ) //データの受信 velYaw = data->Data->VelocityYaw;

(16)

送受信するデータの定義

「PortDefine.h」で定義

#define MODULE_NAME "DiGOROTest"

// 入力ポートの定義 // INPORT( type , name ) // type : 送信するデータ型 // name : 名前

INPORT( TimedLong^ , InData )

// 出力ポートの定義

// OUTPORT( type , name ) // type : 送信するデータ型 // name : 名前

OUTPORT( TimedLong^ , OutData )

入力ポート(受信するデータ)の定義 TimedLong(整数型)を受信

出力ポート(送信するデータ)の定義 TimedLong(整数型)を送信

INPORT( TimedString^ , InData2)

複数個宣言することも可能

OUTPORT( TimedFloat^ , OutData2 )

(17)

受信方法

例:DiGOROClientRTC.cpp

main関数内

TimedLong ^inData; // 受信データ用メモリ ・・・ 途中省略 ・・・ // 受信用関数名はGet + [変数名] (ただし、[変数名]はPortDefine.hで定義したもの)

if ( m_component->GetInData( inData ) ) // データの受信(データがあれば戻り値がtrue)

{

・・・ 省略 ・・・ }

ここでデータを受信して受信できればif文に入る

Get + InData ( InDataはPortDefine.hに定義されている) 受信されたデータがinDataに入る

(18)

送信方法

例:DiGOROClientRTC.cpp

main関数内

TimedLong ^inData; // 受信データ用メモリ ・・・ 途中省略 ・・・ // 受信用関数名はGet + [変数名] (ただし、[変数名]はPortDefine.hで定義したもの)

if ( m_component->GetInData( inData ) ) // データの受信(データがあれば戻り値がtrue)

{

outData->Data = inData->Data + 100; // 受信したデータに100を足して送信用メモリにコピーしている

TimeExtension::SetCurrentTime( outData->Time ); // 現在時刻を代入

m_component->SendOutData( outData ); // 送信用の関数名は、Send + [変数名]

} outDataの中身を送信する

(19)

サンプルを動かしてみよう

さっき動かした ConsoleIn, ConsoleOut, クライアントのサ

ンプル( DiGOROClientRTC_Con ver1.1 )を起動

 起動できない場合は(Windows7の場合)実行ファイルのプロパ ティでXP互換モードにする)

以下のように接続し All Activate

サンプルソースと実際の動作を見比べてみましょう

 ConsoleInで数値を入力→通信→DiGOROClientでそれを表示し値 を変更(100を足す)→通信→ConsoleOutで表示

(20)

作り方まとめ

データ通信関連のクラス ⇒ m_component

送受信できるデータは Timed**

 PortDefine.hで型と変数名を定義

Time***

 とりあえず宣言には^を付ける  送信するために何か代入したいときはgcnewをする  メンバへのアクセスは->を使用  データの実体は [変数名]->Data  タイムスタンプは [変数名]->Time

送信

 データ送信メンバ関数 ⇒ m_componet.Send+[変数名]

受信

(21)

.Net tips1 : 文字列の相互変換

文字列の相互変換

C++ : CString (普通のクラス)

.Net : String^ (参照クラス)

TimedString ^ts =

gcnew

TimedString();

CString str;

// Windowから文字列取得

m_edit.GetWindowText( str );

(22)

.Net tips2 : 配列の作り方

Timed*Sec

TimedLongSec : 整数配列

TimedFloatSec : 小数配列

// 宣言と確保

// .Netのクラスなので、とりあえず^を付けてgcnew

TimedLongSeq ^tls =

gcnew

TimedLongSeq();

// Add関数で要素を追加

tls->Data->Add( 1 );

tls->Data->Add( 2 );

tls->Data->Add( 4 );

(23)

おわりに

RTCを作るためのテンプレート

DiGOROClientRTC_Con ver1.1  これをベースにすれば比較的簡単にRTCが作れる

C++/CLIは最も簡単に作成できると判断して選びました

 C#, F#, VBでも開発可能

セックが作成したPython版も使い易そう

オリジナルのOpenRTMではC++も動きます

なので言語は何でもいいです

 但し、ここではC++/CLI (基本はC++)で作ることを想定します

謝辞

 このスライドは、中村友昭 博士(長井研ポスドク)が作成した研究 室内向けRTM講習会のスライドを実験用に修正したものです。ス ライドの使用を許可してくれた中村さんに感謝いたします。

参照

関連したドキュメント

[リセット] タブでは、オンボードメモリーを搭載した接続中の全 Razer デバイスを出荷状態にリセットで きます。また Razer

が前スライドの (i)-(iii) を満たすとする.このとき,以下の3つの公理を 満たす整数を に対する degree ( 次数 ) といい, と書く..

ガイダンス: 5G 技術サプライヤと 5G サービスプロバイダは、 5G NR

ひかりTV会員 提携 ISP が自社のインターネット接続サービス の会員に対して提供する本サービスを含めたひ

本手順書は複数拠点をアグレッシブモードの IPsec-VPN を用いて FortiGate を VPN

Q-Flash Plus では、システムの電源が切れているとき(S5シャットダウン状態)に BIOS を更新する ことができます。最新の BIOS を USB

現在、電力広域的運営推進機関 *1 (以下、広域機関) において、系統混雑 *2 が発生

その他 2.質の高い人材を確保するため.