タッチセンサーに反応して、『痛っ!』と音声出力するプログラムを「Visual Programming Language」で作成する
第2回目では、ロボットの選定から組み立て、ファームウェアの更新を行い、LEGOのMindstorms NXT(以下、NXT)とマイクロソフトのRobotics Studio(以下、MSRS)を接続しました。
今回は、実際にMyロボットを制御してみましょう。「Visual Programming Language(以下、VPL)」を使用して、サンプルプログラム(サービス)を作成します。
まず、MSRSとNXTによるロボット開発環境について、おさらいします。
本連載のハードウェア構成は、MSRSおよびLEGOのSDKをインストールしたPCとNXT(ロボット)の2つです。NXTのファームウェアは、ブリック内のROMに書き込まれています。さらに、書き込み可能なRAMも存在します(図1)。
LEGOのSDKで制作したプログラムは、通信回線を介してブリックのRAMへダウンロードされ、ブリックのCPUで処理されます。また、MSRSで作成したプログラムはPC内で稼働します。
例えば、「ロボットが障害物にぶつかったら、モーターを停止する」というプログラムをLEGOのSDKで作ったとします。このプログラムは、ロボットのバンパーで感知したオン/オフ信号を基に、bitがハイになったらモーターのアンプの電圧を0Vにクリアします。このような制御プログラムの場合はブリックのRAMで実行されます。
一方、MSRSで作成したプログラムはPC上で処理されます。ロボットが障害物にぶつかると、NXTのバンパーの情報はBluetoothを経由して、PCに通知されます。この通知を受けてMSRSのサービスは、NXTのモーターの回転速度をゼロにする指令を再度、Bluetoothを介してNXTに伝えます。MSRSのプログラムの場合、NXTとの通信にBluetoothを使用しているため、PC上での操作とNXTの動作にタイムラグが生じます。そのため、系が不安定になるタイプのフィードバック制御は実行できません。応答のスピードが問題になるようなプログラムは、ブリック内で実行するようにします。
逆に「ロボットが障害物にぶつかったならその場所を記憶して、二度と同じ障害物にぶつからない」という知的行動を伴うロボットを作る場合は、MSRSで実現します。なぜなら、ブリック内のコンピュータで実行しようとしても、CPUの処理能力やメモリ容量などの問題から実現が困難だからです。
つまり、条件反射のような局所的応答は「ロボット内部(ブリック)」で行い、行動計画のような全体判断は「PC」で行う。これが使い分けのポイントです!
ロボット制御のイメージがつかめたところで、サンプルプログラム(サービス)を作成してみましょう。
作成する内容は、NXTのタッチセンサー(画像1)が押されたら、「あ痛っ!(ouch)」とPC側で音声出力するプログラム(サービス)です。
ロボットのタッチセンサーを押したときに通知が発生し、Bluetoothを経由してPCへ届き、PCのノードがその通知を拾って言葉を発します。
ここでは、VPLを使用して開発します(注)。
SOAの基本原則に従えば、サービスはC#やVisual Basicでプログラム、ビルドしてノードに配置、実行することになります。しかし、この方法を入門者が理解するとなると少し難しい気がします。SOAの原則に基づいた開発は、MSRSについてもう少し熟知してから挑戦した方がよいでしょう。
VPLでは、ツールボックスの基本的なアクティビティ(Basic Activities)やサービス(Services)をドラッグ&ドロップして、Diagram(設計図)を作成していきます。Diagramが完成したら[実行]ボタンでロボットの制御を開始します(ノードやサービスは自動的に作成される)。
それでは、VPLを使ってサンプル開発を進めましょう!
PCの[start(スタート)]−[All Programs(プログラム)]−[Microsoft Robotics Studio(1.0)]−[Visual Programming Language]をクリックして、VPLを起動します。
画面1中央の広いスペースは、Diagramと呼ばれるプログラムを組み上げる場所です。画面1左に[Basic Activities]と[Services]、2つのツールボックスがあります。基本はこれらのツールボックスからアイコンをDiagramへドラッグ&ドロップして作業を行います。
ロボットのタッチセンサーから通知を受け取るサービスは[Services]ツールボックス内にあります。このサービスをDiagramへ取り込むのですが、サービスの数が多いため探すのが大変です。そこで、検索用のテキストボックス([Services]の記載のすぐ下)を利用します。
テキストボックスに「contact」と入力してください。その結果が、画面2左のように抽出されます。
検索結果の中にある[Generic Contact Sensors]をDiagramへドラッグ&ドロップします(画面2右)。
VPLを使っていると、[Generic Contact Sensors]のように『Generic』という文字を冠したサービスに出合います。このGenericは、“ロボットに搭載したリミットスイッチからの信号に特化した”“その範囲において一般的に使用できる”というような限定した意味で使われます。
この「Generic」を冠したサービスを使用する場合、プロパティを設定して対象を特定する必要があります。
[GenericContactSensors]を右クリックして、ショートカットメニューから[Set Configuration]を選択します。
[GenericContactSensors]タブの内容が画面中央に表示されます。
[Set Configuration]ドロップダウンリストの内容は、初期状態で「None」です。これを「Use a manifest」に変更します。
画面下部にドロップダウンリストとボタンが表示されます。そのまま[Import Manifest...]ボタンをクリックします。
今度は[Import Manifest]ダイアログが開きます。一覧から「LEGO.NXT.MotorTouchSensor.manifest.xml」(画面6)を選択して、[OK]ボタンをクリックします。
これで[GenericContactSensors]のプロパティ設定は完了です。
Copyright © ITmedia, Inc. All Rights Reserved.