Robotics Studioの肝、“通知”の発行:Robotics Studio活用術 はじめて作るサービス(5)(1/2 ページ)
Robotics Studioにおける「サービスの作成」の集大成! 今回は通知を発行するサービスを作り、動作検証を行います
ロボットに限らず、一般的な機械装置の制御では“割り込み信号(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のようにサービスBとCが、サービスAに対してサブスクリプションの手続きをしたとします。このとき、サービスBとCのことを“サービスAの「サブスクライバ(subscriber)」”といいます。例えば、この状態でロボットのバンパーが障害物に接触し、“障害物にぶつかった”ことを検知したとします。すると、サービスAはサブスクライバであるサービスBとCに対して、図2のように「障害物を検知した!」という通知を発行します。
サブスクリプション マネージャ 〜 通知のメカニズム 〜
続いて、通知の発行元(サービスA)にフォーカスして解説します。
まず、図3を見てください。
サービスAは、通知の発行に関する事務処理を行うために、「サブスクリプション マネージャ(subscription manager)」というサービスを“パートナー”として生成します。
そして、サービスAはサブスクリプション マネージャに処理を命じるためにSendPositionという名前のポートを作成します(注)。サブスクリプション マネージャに対して、何か処理を依頼するときには必ずこのSendPositionを通して依頼しなければなりません。
また、サービスAはサブスクライバ(サービスB)から登録のメッセージを受け付けるために、Subscribeという名前のポートを開設しておく必要があります。
サービスBがサービスAからの通知を受け取るためには、まず、サービスAに対してSubscribeというポートを通じて登録のメッセージを投げます。これを受けたサービスAは、SendPositionを通じてサブスクリプション マネージャに「サービスBを登録しなさい」と命令します。
これでサービスBは、サービスAからの通知を受けることができます。
以上が、「サブスクリプションの手順」となります。
それでは、実際に通知を発行する事態が発生したらどうなるのでしょうか?
サービスAはSendPositionを通して、サブスクリプション マネージャに「これこれこのデータを通知しなさい」と命令します。これを受けたサブスクリプション マネージャは、サービスAからの命令(データ)をサービスBやCなどのサブスクライバすべてに対して通知します。
これがMSRSにおける通知のメカニズムです。
通知を発行するプログラミング
それでは、実際に通知のプログラムを作成してみましょう(注)。
Microsoft Visual C# 2005 Express SP1(以下、VC#)を起動して、連載第3回「サービスはロボットの状態と連動して動くもの」を参考に、新規プロジェクト「MyProj3」を作成してください。
まずは、サービスの“状態”が必要となるので、ソース1のようにMyProj3Types.csに対して、状態を定義します。
今回は、ロボットの状態のプロパティとして、表1のように定義します。
プロパティ名 | 変数の型 | 内容 | |
---|---|---|---|
_name | string | ロボットの名前 | |
_position | float | ロボットの現在位置 | |
表1 ロボットの状態のプロパティ定義 |
_nameプロパティはダミーですが、_positionプロパティはサブスクライバへ送信するデータです。
次に、ポートセットに対して、ソース2のように「SendPosition」と「Subscribe」という2つのポートを追記します。
そして、メッセージを定義するクラスをソース3のように記述します。
通知に対してロボットの現在位置(_position)を同封することにしたので、メッセージのクラスは長くなりますが、内容は同じ形式の文の繰り返しです。メッセージにデータを含める際は、このようにBodyのプロパティとして定義します。
続いて、MyProj3.csを開きます。
ソース4のように、サブスクリプション マネージャに関連する名前空間を追加します。
次に、MyProj3Serviceにおいて、ソース5のようにパートナーとしてサブスクリプション マネージャを生成します。
最後に、ソース6のようにポートのハンドラを記述します。
サブスクリプション マネージャの生成に関しては、MSRSに含まれているクラスやヘルパーを使うので、このように書くものだと理解してください。
最後に、ソース7のようにサブスクリプション マネージャに対して通知を発行する命令を記述してください。
これでプログラムは完成です。
それでは、プロジェクトをビルドしてください。ビルドに成功したら、いよいよVisual Programming Language(以下、VPL)による検証を行います。
Copyright © ITmedia, Inc. All Rights Reserved.