Robotics Studioの肝、“通知”の発行Robotics Studio活用術 はじめて作るサービス(5)(1/2 ページ)

Robotics Studioにおける「サービスの作成」の集大成! 今回は通知を発行するサービスを作り、動作検証を行います

» 2007年11月21日 00時00分 公開
[大川 善邦 工学博士 日本大学工学部非常勤講師/大阪大学名誉教授,@IT MONOist]

 ロボットに限らず、一般的な機械装置の制御では“割り込み信号(interrupt signal)”の取り扱いが重要な課題となります。

 ちなみに、本連載で取り扱っているマイクロソフトのRobotics Studio(以下、MSRS)では、この割り込み信号のことを“通知(notification)”と呼んでいます。

 一般的に、組み込み分野で使う割り込み信号は、いわゆる“電気的な信号”のことですが、SOAの通知の場合は“ソフトウェアによって組み上げられた疑似的な信号”を指します。どちらも内容的には同じなのですが、SOAの通知の処理スピードは一般的な組み込み分野での割り込み信号に比べて“低速”です。その点には、十分に注意してください。

 というわけで、今回はMSRSにおける“通知の作り方”について解説していこうと思います。

通知と処理の流れ

 ここでの“割り込み処理の流れ”というのは、“ロボットが障害物にぶつかる”などの事態が発生した際、それまで実行していた処理(A)を中断して、別のプログラム処理(B)(例えば、駆動モーターを停止するなど)を実行し、その処理(B)が完了したら、また元のプログラム処理(A)へ戻る、というものです。

 この例の場合、「障害物にぶつかった!」という検知がSOAでの“通知”を意味します。

 “会議中に携帯電話が鳴ったので、席を外して電話を受け、終わったら会議へ戻る”といった状況に置き換えると分かりやすいと思います。この場合は「携帯電話の呼び出し音」がSOAでの“通知”となります。

サブスクリプションとは?

 次に、通知を説明するうえで欠かせない「サブスクリプション」について説明します。

 例えば、1つのサービス(サービスA)が、ほかのサービス(サービスBやCなど)に対して通知を発行するとします。この場合、サービスAを“通知の発行元”といい、サービスBやCなどを“通知の発行先”といいます。

 通知の発行先であるサービスBやCは、図1のように通知の発行元であるサービスAに対して事前に「通知を受けるよ」という登録をします。この手続きを「サブスクリプション(subscription)」といいます。

サブスクリプション 図1 サブスクリプション

 つまり、通知とは「その通知に対して、サブスクリプションの手続きをしたものにのみ発行されるメッセージ」をいいます。

 図1のようにサービスBとCが、サービスAに対してサブスクリプションの手続きをしたとします。このとき、サービスBとCのことを“サービスAの「サブスクライバ(subscriber)」”といいます。例えば、この状態でロボットのバンパーが障害物に接触し、“障害物にぶつかった”ことを検知したとします。すると、サービスAはサブスクライバであるサービスBとCに対して、図2のように「障害物を検知した!」という通知を発行します。

通知の発行 図2 通知の発行

サブスクリプション マネージャ 〜 通知のメカニズム 〜

 続いて、通知の発行元(サービスA)にフォーカスして解説します。

 まず、図3を見てください。

サービスAの構造 図3 サービスAの構造

 サービスAは、通知の発行に関する事務処理を行うために、「サブスクリプション マネージャ(subscription manager)」というサービスを“パートナー”として生成します。

 そして、サービスAはサブスクリプション マネージャに処理を命じるためにSendPositionという名前のポートを作成します(注)。サブスクリプション マネージャに対して、何か処理を依頼するときには必ずこのSendPositionを通して依頼しなければなりません。

※注:
SendPositionという名前は、本連載で作成するプログラム内に使用されている名前です。ほかの任意の名前でも問題ありません。


 また、サービスAはサブスクライバ(サービスB)から登録のメッセージを受け付けるために、Subscribeという名前のポートを開設しておく必要があります。

 サービスBがサービスAからの通知を受け取るためには、まず、サービスAに対してSubscribeというポートを通じて登録のメッセージを投げます。これを受けたサービスAは、SendPositionを通じてサブスクリプション マネージャに「サービスBを登録しなさい」と命令します。

 これでサービスBは、サービスAからの通知を受けることができます。

 以上が、「サブスクリプションの手順」となります。

 それでは、実際に通知を発行する事態が発生したらどうなるのでしょうか?

 サービスAはSendPositionを通して、サブスクリプション マネージャに「これこれこのデータを通知しなさい」と命令します。これを受けたサブスクリプション マネージャは、サービスAからの命令(データ)をサービスBやCなどのサブスクライバすべてに対して通知します。

 これがMSRSにおける通知のメカニズムです。

通知を発行するプログラミング

 それでは、実際に通知のプログラムを作成してみましょう(注)。

※注:
本連載では、C#の文法についての解説は基本的に行いません。C#についてはInsider.NETなどを参考になさってください。


 Microsoft Visual C# 2005 Express SP1(以下、VC#)を起動して、連載第3回「サービスはロボットの状態と連動して動くもの」を参考に、新規プロジェクト「MyProj3」を作成してください。

 まずは、サービスの“状態”が必要となるので、ソース1のようにMyProj3Types.csに対して、状態を定義します。

状態の書き込み ソース1 状態の書き込み

 今回は、ロボットの状態のプロパティとして、表1のように定義します。

プロパティ名 変数の型 内容
_name string ロボットの名前
_position float ロボットの現在位置
表1 ロボットの状態のプロパティ定義

 _nameプロパティはダミーですが、_positionプロパティはサブスクライバへ送信するデータです。

 次に、ポートセットに対して、ソース2のように「SendPosition」と「Subscribe」という2つのポートを追記します。

ポートの増設 ソース2 ポートの増設

 そして、メッセージを定義するクラスをソース3のように記述します。

メッセージのクラス ソース3 メッセージのクラス

 通知に対してロボットの現在位置(_position)を同封することにしたので、メッセージのクラスは長くなりますが、内容は同じ形式の文の繰り返しです。メッセージにデータを含める際は、このようにBodyのプロパティとして定義します。

 続いて、MyProj3.csを開きます。

 ソース4のように、サブスクリプション マネージャに関連する名前空間を追加します。

名前空間の追加 ソース4 名前空間の追加

 次に、MyProj3Serviceにおいて、ソース5のようにパートナーとしてサブスクリプション マネージャを生成します。

マネージャの生成 ソース5 マネージャの生成

 最後に、ソース6のようにポートのハンドラを記述します。

ハンドラ ソース6 ハンドラ

 サブスクリプション マネージャの生成に関しては、MSRSに含まれているクラスやヘルパーを使うので、このように書くものだと理解してください。

 最後に、ソース7のようにサブスクリプション マネージャに対して通知を発行する命令を記述してください。

通知の発行 ソース7 通知の発行

 これでプログラムは完成です。

 それでは、プロジェクトをビルドしてください。ビルドに成功したら、いよいよVisual Programming Language(以下、VPL)による検証を行います。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.