腕上げロボット

概要

「腕上げロボット」は、「左(右)をあげて」、「左(右)をさげて」などの指示をロボットに指示を与え、それに応じて腕を上げたり下げたりするロボットシステムの例です。 ロボットとして、HPI Japan社製のホビーロボットG-ROBOTS GR-001を使います。

このシステムは、SEATの状態遷移モデル作成の例としてとりあげています。

腕上げロボットのハードウェア構成

腕上げロボットのハードウェアとして、

  • Windows 7の動作するパソコン
  • G-ROBOTS GR-001 (Choreonoidを用いる場合には不要)
  • パソコン対応マイク

を使います。GR-001は、パソコンとRS-232Cで接続されていることを前提にしています。 GR-001の接続と操作方法に関しては、 2011年国際ロボット展で実施されたセミナーのサイト にChoreonoidの操作方法と共に記載されておりますのでそちらを参照して下さい。 パソコン対応マイクはミニプラグをPCに差し込みます。

GR-001とパソコンの接続は、下図のようになっています。

../../_images/GROBOT.jpg

ロボットの動作パターン

腕上げロボットの動作パターンの生成には、ロボット知能ソフトウェアプラットフォームのツールである Choreonoid を利用します。 Choreonoidの操作方法は、オフィシャルサイトを参照して下さい。

この例で使用する、腕上げロボットの「左(右)をあげて」、「左(右)をさげて」に対応する動作は、下記の「ダウンロード」にあるSample−FlagGame.zipに含まれています。

使用するコンポーネント

この例では、以下のコンポーネントを利用します。

  • AudioInputコンポーネント: 音声データの取得
  • Juliusコンポーネント: 日本語、英語音声認識
  • SEATコンポーネント: 音声対話制御
  • RobotMotionRTCコンポーネントまたはGRobotRTC: GR-001制御用コンポーネント

RobotMotionRTCは、Choreonoid上に表示したGR-001のモデルを外部から操作するためのコンポーネントです。 下記の「ダウンロード」にあるSample-FlagGame.zipに含まれています。

GRobotRTCは、ロボット知能ソフトウェアプラットフォームのオフィシャルサイトに掲載されている GRobotRTCの機能拡張2 のコンポーネントを利用致します。

ダウンロード

音声認識コンポーネント用の文法ファイル、音声対話コンポーネント用の対話スクリプトおよびChoreonoid用のプラグインと動作ファイルは、ここからダウンロードすることができます。

GRobotRTCについては、 こちらのページ の添付ファイルであるGR001.zip をダウンロードして下さい。

コンポーネントの接続

すべてのコンポーネントをエディタ画面に配置し、各コンポーネント間に以下のリンクを作成します。:

PulseAudioInput -> Julius
Julius(result) -> SEAT
SEAT -> RobotMotion(command) または GRobotRTC(command)

リンクを作成すると、下図のようになります。

../../_images/FlagGame-System.png

音声認識文法モデル

Juliusコンポーネントが起動時に読み込む腕上げロボットの文法モデルを定義します。 ロボットへの命令は「右あげて」、「右あげない」、「右さげて」、「右さげない」、 「左あげて」、「左あげない」、「左さげて」、「左さげない」のいずれかにします。 このような命令を認識する音声認識文法は、下のように定義することができます。

<?xml version="1.0" encoding="UTF-8" ?>
<grammar xmlns="http://www.w3.org/2001/06/grammar"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.w3.org/2001/06/grammar
                             http://www.w3.org/TR/speech-grammar/grammar.xsd"
         xml:lang="jp"
         version="1.0" mode="voice" root="command">
 
  <rule id="command">
    <one-of>
      <item></item>
      <item></item>
    </one-of>
    <one-of>
      <item>あげて</item>
      <item>あげない</item>
      <item>さげて</item>
      <item>さげない</item>
    </one-of>
  </rule>
 
</grammar>

上記の文法モデルは、「右」または「左」の次に、「あげて」「あげない」「さげて」「さげない」のいずれかが続くという文法を定義しています。

対話スクリプト

ここではSEATコンポーネントが起動時に読み込む状態遷移モデルを定義します。

腕上げロボットでは、腕を上げたり下げたりしますが、一度上げた腕はもう一度上げることができません。 そのため、ここでは腕上げの動作を「状態遷移モデル」を使って記述してみます。

「状態遷移モデル」では、システムの「状態」を定義した上で、その状態の間の「遷移」と「遷移条件」を記述することでシステムの振る舞いを定義します。

このロボットでは、システムに以下の4つの状態があると考えられるでしょう:

  • 両方下げる
  • 左を上げる
  • 右を上げる
  • 両方上げる

ロボットの初期状態では両手を下げた状態で始まります。 ここで、「左あげて」はシステムの状態を左腕を上げた状態に遷移させます。

システムが左腕を上げた状態で「右あげて」と命令するとシステムの状態は「両腕上げる」になります。

システムが両方上げた状態で「左あげて」と命令してもそれ以上の状態遷移は起こりません。

すなわち、このシステムでのロボットの状態遷移は下記のように書くことができます。

../../_images/State.png

SEATは状態遷移モデルをXML形式で記述することができます。 上記で説明した旗上げゲームは以下のように記述できます。

<?xml version="1.0" encoding="UTF-8"?>
<seatml>
  <general name="flaggame">
    <agent name="speechin" type="rtcin" datatype="TimedString" />
    <agent name="command" type="rtcout" datatype="TimedString" />
  </general>
  <state name="both_down">
    <rule>
      <key>右 (あげて|さげない)</key>
      <command host="command">rightup1</command>
      <statetransition>right_up</statetransition>
    </rule>
    <rule>
      <key>左 (あげて|さげない)</key>
      <command host="command">leftup1</command>
      <statetransition>left_up</statetransition>
    </rule>
    <rule>
      <key>(右|左) (さげて|あげない)</key>
      <command host="command">none</command>
    </rule>
  </state>
  <state name="both_up">
    <rule>
      <key>右 (さげて|あげない)</key>
      <command host="command">rightdown2</command>
      <statetransition>left_up</statetransition>
    </rule>
    <rule>
      <key>左 (さげて|あげない)</key>
      <command host="command">leftdown2</command>
      <statetransition>right_up</statetransition>
    </rule>
    <rule>
      <key>(右|左) (あげて|さげない)</key>
      <command host="command">none</command>
    </rule>
  </state>
  <state name="left_up">
    <rule>
      <key>左 (さげて|あげない)</key>
      <command host="command">leftdown1</command>
      <statetransition>both_down</statetransition>
    </rule>
    <rule>
      <key>右 (あげて|さげない)</key>
      <command host="command">rightup2</command>
      <statetransition>both_up</statetransition>
    </rule>
    <rule>
      <key>左 (あげて|さげない)</key>
      <key>右 (さげて|あげない)</key>
      <command host="command">none</command>
    </rule>
  </state>
  <state name="right_up">
    <rule>
      <key>左 (あげて|さげない)</key>
      <command host="command">leftup2</command>
      <statetransition>both_up</statetransition>
    </rule>
    <rule>
      <key>右 (さげて|あげない)</key>
      <command host="command">rightdown1</command>
      <statetransition>both_down</statetransition>
    </rule>
    <rule>
      <key>左 (さげて|あげない)</key>
      <key>右 (あげて|さげない)</key>
      <command host="command">none</command>
    </rule>
  </state>
</seatml>

以上で音声対話システムの解説は終了です。

コンポーネントを起動

システムを構成するRTコンポーネントを起動します。 ※コンポーネントを起動する前にネーミングサーバも起動しておいてください。

AudioInputコンポーネント

AudioInputコンポーネントはマイクから音声データを取得し出力するコンポーネントで、OpenHRIコンポーネント群に含まれています。

[スタートメニュー]にある[OpenHRI]>[audio]>[portaudioInput]をクリックして起動します。

Juliusコンポーネント

Juliusコンポーネントは文法ファイルを元に日本語・英語の音声を認識するコンポーネントで、OpenHRIコンポーネント群に含まれています。

[スタートメニュー]にある[OpenHRI]>[voice]>[juliusrtc]をクリックしコンポーネントを起動します。 起動後、音声認識の文法ファイルを選択するウィンドウが表示されますので、 [flaggame.grxml] を選択します。

SEATコンポーネント

SEATコンポーネントは文法ファイルを元にパラフレーズマッチングする対話制御コンポーネントで、OpenHRIコンポーネント群に含まれています。

[スタートメニュー]にある[OpenHRI]>[voice]>[juliusrtc]をクリックしコンポーネントを起動します。 起動後、状態遷移モデルを選択するウィンドウが表示されますので、 [flaggame.seatml] を選択します。

G-ROBOT用制御コンポーネント

Choreonoid を用いる場合:RobotMotionRTCコンポーネント

RobotoMotionRTCコンポーネントは、Choreonoidに表示されたG-BOTOS GR-001のモデルを操作するためのコンポーネントであり、Choreonoidのプラグインとして実装しています。このプラグインを利用するには、Sample-FlagGame.zipを展開後、その中に含まれるChoreonid 1.1 以下のファイルすべてをChorenoid-1.1をインストールしているフォルダ以下にコピーする必要があります。

上記の準備が整ったらChoreonoidを起動し、GR001のサンプルプロジェクト(GR001.cnoid)を読み込んで下さい。

[ファイル]メニューの[プロジェクトの読み込み]を選択し、ダイアログを表示します。インストール先フォルダの[Choreonoid1.1]>[share]>[projects]にある[GR001.cnoid]を選択して読み込みます。 [アイテム]ビューに[world]アイテムが表示され、3DビューにGR-001のモデルが表示されたら読み込み完了です。

この時、メッセージビューで、RobotMotionRtcPluginが正常に読み込まれていることを確認して下さい。

次にRobotMotionRTCコンポーネントを生成します。 アイテムビューの[GR001]アイテムを選択してから、[ファイル]メニューの[新規]>[RobotMotionRtc]をクリックします。

表示されたダイアログの[生成]ボタンをクリックすると[GR001]アイテムの下に[RobotMotionRtc]が生成されます。

GR-001の実機を用いる場合:GRobotRTCコンポーネント

GRobotRTCは、G-ROBOTS GR-001でChoreonoidで作成作成した動作パターンを実行させるためのコンポーネントです。

上述のRobotMotionRTCとほぼ同じポートを持っていますので、このコンポーネントを使う場合には、コンポーネント接続図のRobotMotionRTCと読みかえて下さい。

また、動作パターンファイルのあるディレクトリは、GRobotRTCのコンフィグレーションのmotionDirで設定することができますので、GRobotRTCをActivateする前に設定して下さい。

コンポーネントが起動したら コンポーネントの接続 の画像を参考にRTSystemEditorでリンク接続し、すべてのコンポーネントをActivateに変更します。

以上で、腕上げロボットシステムは完成です。

動作例

次に、パソコンにマイクを接続し、音声認識文法モデルで定義した文(「左(右)をあげて」、「左(右)をさげて」など)を発話して下さい。

ロボットは、「右(左)あげて」、「右(左)さげて」という発話に対して、現在の状態にあわせた動作すると思います。

その他の情報

このシステムでは、ロボットとして市販されているホビーロボットG-ROBOTSを使いました。 G-ROBOTSの制御用のRTCとその作成方法に関しては、 G-ROBOTS GR-0001用RTCの開発サイト を参照して下さい。