ヒューマノイドロボット
 ヒューマノイドロボットは未来型の人形です。



スクリプトエディタ

 ロボットの対話機能は、QiChatという特殊なスクリプト言語で記述します。このスクリプトは、対話に伴う、類似ないしはだいたい可能な内容をまとめる「概念(concept)」、人からの言葉の提出に対してロボットの応答の仕方を決める「ルール」、ロボット側からの人への語りかけを記述した「プロポーザル」などから構成されると同時に、その言葉に対応したロボットの動きも制御できるプログラミング言語となっています。
 iBotのスクリプトエディタは、できるだけ簡便にこの記述を可能にするように工夫されています。

1. スクリプトの新規作成と編集の開始

 新規にスクリプトを作成する前に、ユーザーとしてログインしていなければなりません。というのも、ユーザーとして登録することによって、iBotサーバー上に領域を確保することができ、スクリプトを保存したり、自分のロボットに転送したりすることができるようになるからです。
 一つのスクリプト(ファイル)は、一つのトピック(topic: 話題)を表わすことになります。一つの対話で、同時に複数のトピックを扱うことができます。ロボットは、それらに記載されたルールを頭に入れながら、適合性を判定し問いかけに反応します。
スクリプトの新規作成 メインメニューのロボットから「スクリプト管理」のメニューを選択して表示させます。新規作成の入力エリアに、ファイル名を入力します。ただし、ファイルは常に、"top"という拡張子を持ちますが、ここでは拡張子".top"を入力しないでください。このファイル名の".top"を除いたものは、トピック名になります。一回の対話で、同一のトピック名を利用することはできません。ファイル名は常にユニークであるようにしてください。
 また、ファイル名は基本的に半角英数字にする必要があります。記号では、ハイフン"-"なども使えなくはないですが、アンダースコア"_"が入っていると、そのファイルをシステムは正常に使用することができなくなります。問題を回避するために、原則、名前は半角英数字にしてください。
編集対象スクリプトの選択 作成ボタンを押すと、問題がなければスクリプトは正常に作成され下辺にある編集対象スクリプトに加わります。 リストの左側にあるチェックボックスは、そのファイルを実際にロボットに転送し使用する(有効化する)場合にチェックを入れます。新たに作成したスクリプトは有効化されています。このチェックボックスを変更した場合には、「組み込み更新」ボタンをクリックして変更をシステムに伝えなければなりません。
 次に「編集」と「削除」のリンクがあります。編集リンクをクリックするとそのスクリプトの編集が開始されます。削除リンクをクリックすると、スクリプトはシステムから完全に削除されます。

2. 編集フォーム(目次へ)

 編集対象のスクリプトが選択されると、編集フォームがあらわれます。
編集フォーム

 編集フォームの最上段には、編集専用のメニューバーがあらわれます。
 また、新規作成された状態で、スクリプトの冒頭には、
topic: ~greeting01 ()
language: jpj
という2行はすでに書かれています。ここでの「greeting01」の部分は、あなたの与えたトピック名になっています。この2行は必ず、ファイルの冒頭に記載されていなければなりません。また、すでに述べたように、同じトピック名があると、そのトピックはロボットにロードされません。
 基本的に、このフォーム上に、QiChatの文法に従って記述していけば良いわけです。文法上の基本として次のようなことがあります。
(1)##で始まる行はコメントで、(3)に記述するiBotシステム用のタグを除いて、スクリプトの実行上は無視されます。
(2)空行も無視されます。
(3)##<ibot ....>または##</ibot ....>と書かれたタグは、iBotのシステム用のタグですので、変更しては行けません。##<ibot ....>と##</ibot ....> 挟まれた部分にある、概念、ルール、プロポーザルの内容は変更しないでください。ただし、コメントを書き込んだりすることは問題ありません。また、それ以外の場所には、iBotが使用している名前や変数、タグと同じものを使わない限り自由に概念、ルール、プロポーザルを記入してかまいません。
(4)変数は、$で始まるアルファベットの文字/数字です。
(5)関数は、^で始まるアルファベットの文字/数字です。
(6)変数や関数の前後に、半角空白がないと機能しないのでご注意ください。

3. ファイル操作(目次へ)

 作成したファイルは、編集メニューの「ファイル」にある「保存」をクリックします。ファイルは、パソコンに保存されるのではなく、iBotのサーバー上に保存されます。保存すると、フォームの上部に保存した時間が表示されます。パソコンには保存されることがないので、ブラウザを閉じたりすると消える可能性があります。こまめに保存するようにしてください。
 また、削除や有効化のメニューとか、別のファイルの編集をするときなどは、「ファイル」メニューの「管理」メニューをクリックして、スクリプトの管理ページに戻ってください。

4. 対話入力(目次へ)

 スクリプトを入力する補助機能を説明します。まず、対話関係の入力で、「概念」「ルール」「プロポーザル」の三つを説明します。
4.1 概念
 まず、概念(concept)の入力について説明します。概念とは、ある意味ある言葉のまとまりを意味します。たとえば、「果物」というのは一つの概念です。果物という概念には、ミカンもリンゴもバナナも含まれます。では、ミカンとリンゴとバナナに含まれる共通の性質は何かと考えることができますが、ここでは、そうした詮索は不要です。これらが果物という概念に含まれることをロボットに教えておくことは対話を勧める上で役に立つことがあります。コンセプト入力
 たとえば、次のような対話を考えましょう。
 (人間)私は果物が好きです。
 (ロボット)私もバナナが好きです。
 こうした会話が成立するためには、果物がバナナという概念に含まれることをロボットが知っている必要があります。
 この概念を入力する支援システムは次のように使います。まず、編集メニューの 「対話」から、「コンセプト」メニューを選びます。

 コンセプト名は、先の果物のような、コンセプトそのものを記入します。コンセプト名は半角英数字でも日本語でもかまいません。内容の部分には、対話に必要な内容を空白あるいはカンマで区切って入力し、OKボタンをクリックします。それの結果が、フォームの中に自動的に記載されます。
4.2 ルール
 次に、ルールです。ルールとは、人の言葉の聞き取りに対するロボットの反応の規則を示したものです。対話メニューから、ルールを選択します。図のようなダイアログウィンドウが開かれます。
ルールの入力
人の入力側をトリガーと呼びましょう。トリガーを入力します。トリガーに一致した言葉が入力されたときに、ロボットの出力に記載された内容がロボットの言葉として発せられます。トリガーは漢字まじりの日本語で入力して問題ありません。トリガーにコンセプトを指定することができます。コンセプトの内容の一つに一致すれば、ロボットの出力が行われます。コンセプトと、通常の言葉を混合させてトリガーを指定することもできます。コンセプトは、右上のドロップダウンリストから選択することもできます。
 トリガー側の選択コンセプトリストには、聞き取れなかった場合をイベントにすることもできるようになっています。1回聞き取れなかったとき、2回目、さらには3回聞き取れなかったときをトリガーとすることができます。たとえば「あなたの言うことが聞き取れませんでした、〇〇のようにいっていただけますか」などと、ロボットにしゃべらせると良いでしょう。
 出力の一部にコンセプトを使用することもできます。
 「詳細」ボタンをクリックすると、入力した内容を、副ルールとすることができます。メインルール、ないしはサブルールとして選択することができます。
4.3 プロポーザル
プロポーザルの入力 プロポーザルの機能は少し複雑だ。基本的に、ルールに依存せずにロボットに言わせるべき言葉を用意するためのものです。ある時点で、活性化対象(activated)のプロポーザルは与えられています。対話が始められる時点では、そのトピックで最初にあるプロポーザルが活性化されているプロポーザルです。活性化対象になっているプロポーザルをロボットにしゃべらせるために使われる関数は、
^nextProposal
です。関数は、頭に^をつけて区別します。ロボットの出力のあとに、この関数がついていると、その言葉が終わると活性化対象のプロポーザルが呼び出され、ロボットはそれをしゃべります。大切なことは、一旦しゃべると、そのプロポーザルは非活性化され(deactivate)そのままでは、二度と使われなくなります。^nextProposalであるプロポーザルが呼び出され、非活性化されると、そのトピックで次ぎにあるプロポーザル(非活性化されていない)があれば、それが自動的に活性化されます。プロポーザルに関わる関数として他に次のようなものがあります。(基本的に同じトピック内のプロポーザルにしか移ることはできません)
^goto(タグ) 指定されたタグ(%で始まる変数)を含むプロポーザルをしゃべる。そのプロポーザルは非活性化されているものであってはなりません。
^gotoReacctivate(タグ) 指定されたタグ(%で始まる変数)を含むプロポーザルをしゃべる。そのプロポーザルが非活性化されていても、活性化してしゃべらせる。
^previousProposal 直前にしゃべったプロポーザルを繰り返します。^sameProposalも基本的に同じです。

5. 動作(目次へ)

 対話を通してロボットにさまざまな動作をさせます。
5.1 対話と動作
対話と動作 対話の過程から動作を起動させ、さらに対話に戻ってくるプロセスについて、基本的な説明をしておきます。QiChatスクリプトには、変数を持たせることができます。変数は、たとえば$varのように、$から始まる文字列です。こうした変数は、ALMemoryというモジュールによってイベントが発生させられます。この変数変化のイベントをiBotのモジュールがとらえて、さまざまな動作(後に説明する認識機能も含めて)をさせることになります。
 さらに動作を終了するとその結果を下にロボットに何かを語らせるという作業が必要になりますが、これは、iBotが動作を完了させると同時に、変数を変化させ、そのイベントを下にしたルールを発動させロボットが発声するというメカニズムになります。
 このイベントをとらえるための変数の変化は、その値が問題になることはこのプロセスではないと言うことになります。
5.2 歩行
 歩行はロボットの基本動作です。歩行するための機械的な動きについては、モジュールとして整備されているので、必要なパラメータを与えて起動させればよいわけです。 歩行動作
 動作メニューから歩行を選択するとダイアログウィンドウが開かれます。
 すでに述べたように、動作は、対話の過程における変数の変化の指示によって起動します。たとえば、人が「少し前へ出なさい」という語りかけによって、ロボットが「わかりました、前に出ます。」と答えるようなルールがあったとします。ロボット出力を「わかりました、前に出ます。$start_walk=1」というように、ルール出力を記載しておくと。$start_walkという変数の値が1に変化するわけです。これをモジュールでとらえるようにしておくと、ロボットは歩き始めることができます。
 そこで、まず、こうした変数変化を与えるべきルールを先に与えておく必要があります。そして、その変化をダイアログウィンドウ上に選択しておきます。変数は、iBotシステムが機械的に与えます。そして、その変数がiBotシステムモジュールに伝わるように、設定ファイルが書き換えられます。設定ファイルは、ibot.confというファイルとして、サーバー上の領域に保存されるようになっています。この設定ファイルの中身はxmlファイルで、ユーザーが見ることができるようになっています。iBotシステムモジュールは、この設定ファイルを読み込んで、殿変数の変化をとらえればよいかを確認します。
 歩行ダイアログの書き方は次のようになります。まず、きっかけとなるべきルールまたはプロポーザルを、リストから選択します。なければ、ルールないしはプロポーザルを先に示した方法に基づいて作成しておきます。歩行する距離を入力します。負の値を入れると逆方向になります。前と左を両方入れると斜め方向になります。例えば、前0.5m、左0.3にすると斜めに歩き出します。回転とは、円弧の形を描きながら歩くことです。その場合は、円弧の角度を入力します。
 最後に、歩き終わったときに発する言葉を書き込みます。なければ書かなくても良いですが、対話の流れは動作だけで止まってしまいます。
 なお、歩行させるときはその移動方向に十分なスペースがないと、障害物があると判断して止まってしまいます。
5.3 ポーズ
 ロボットに、座る、立つ、かがむ、寝る、の4つのポーズをとらせることができます。
ロボットのポーズ選択
 ロボットは通常、生きていることを示すために体を揺らしたり手を少し動かしたりするなど、自動動作状態にあります。また、そのベースに自動生命状態にもあり、自分を維持するための機能を持っています。不当に体を持ち上げたりすると「なにするの!!!」と怒ったりします。あるいは、人の顔や声に反応してそちらに頭を向けたり、体を回転させたりもします。こうしたロボットの自動的な動きとロボットの動作がバッティングすることがありますので、歩行やポーズのときは、特に、自動操作に関しては無効にしています。動作が終了すると有効化します。  歩行と同様に、同期となるべきルールないしはプロポーザルが選択される必要があります。パラメータはありません。一つのポーズを選択し、動作終了後のロボット出力を書き込んで、OKボタンを押せば必要な記述が編集エリアの中に書き込まれます。

6. 認識(目次へ)

 ロボットの機能としては、外界を認識する機能があります。iBotでは、人の顔を認識する機能を対話に織り交ぜることができるようにしています。他に、画像、人の声、音を認識するなどの機能も持っていますが、これからこれらも組み込めるようにしたいと考えています。
6.1 顔認識
 顔認識の設定も基本的には歩行やポーズと同じです。
顔認識
 まず、トリガーとなるべきルールまたはプロポーザルを選択します。そして、最後に、認識機能終了後のロボット出力を記入します。
 顔認識では、三つの違った機能があり、それを選択しなければなりません。
(1)顔の学習
(2)顔の認識
(3)顔の忘却
です。
 顔認識では、まず、顔を覚えることから始めます。顔の学習です。ロボットは、人の顔を目の間の距離や鼻の位置などの特徴を記録し覚えます。覚えた特徴に名前をつなげることをしなければなりません。名前は変数として与えます。顔の学習にチェックを入れると自動的に変数がセットされます。この顔の学習に部分にくる前に、ここで与えられた変数に名前が入力されていなければなりません。  また、顔の学習のためには、少なくとも5秒程度の時間がかかります。それくらいの時間をロボットの前に人が顔を見せるように事前にロボットに語らせる必要があるでしょう。顔の学習が終了すると事後的な言葉が発せられるので、そこで「覚えました」などと言わせるようにしたら良いです。
 次に顔の識別です。顔の識別にチェックすると学習と同様に、変数が自動的にセットされます。ロボットが人の顔をとらえ、事前に学習した顔と一致すると、この変数に学習したときに与えた名前がセットされます。それを語らせると良いでしょう。たとえば、変数が$ibot_facerecog_001だったとすると、認識後に「あなたは、$ibot_facerecog_001さんですね。」と語らせれば良いわけです。
 最後に顔の忘却です。顔の忘却にチェックを入れて機能させると、覚えた全ての顔を忘れるようにします。個別の顔を忘れることは現時点で組み込んでいませんが、近々に対応する予定です。

7. 設定ファイル ibot.conf(目次へ)

 有効化されたトピックの状況、動作や顔認識に関わる変数の受け渡しなどに、ユーザーごとの設定ファイルibot.confが用いられます。ibot.confは、ロボットをスタートさせるたびに、サーバーから、ロボット上に転送され、ユーザーの設定が機能するようにしています。
 ibot.confを表示することで、有効化や変数、パラメータの設定状況を直接確認することができます。ただし、編集はできませんし、保存されません。
 ibot.confはxmlフォーマットで書かれ、例えば次のようになっています。
<?xml version="1.0" encoding="UTF-8"?>
<config>
  <uploadTopics>
    <topic>greeting01.top</topic>
    <topic>greeting02.top</topic>
  </uploadTopics>
  <property topic="greeting01.top">
    <variable name="greeting01_facelearn_001" type="facelearn">
      <varname>greeting01_name_001</varname>
    </variable>
    <variable name="greeting01_standup_001" type="standup"/>
    <variable name="greeting01_walk_001" type="walk">
      <x_distance>0.1</x_distance>
      <y_distance>0.2</y_distance>
      <z_radian>0.3</z_radian>
    </variable>
  </property>
</config>
 ibot.confはスクリプトの管理画面の最下段にある「設定ファルの表示」のボタンをクリックすることによってみることができます。