図1を参照して、この実施例の皮膚センサネットワーク10は、ホストコンピュータ12と複数のノード14を含む。ホストコンピュータ12および複数のノード14は相互接続型のネットワークを形成している。各ノード14は他の少なくとも1つのノード14と相互に接続されている。この実施例では各ノード14は4つの通信ポートを備えており、最大で4つのノードと接続され得る。各ノード14はこの相互に接続された経路を介して通信を行う。ホストコンピュータ12は、ネットワークを形成する複数のノード14のうちの少なくとも1つのノード14と接続されている。
この皮膚センサネットワーク10は、たとえば人の腕や手(図1で破線で示される)等の物に触れられたときの触覚情報を検出するためのシステムである。
各ノード14にはこの実施例では複数の触覚センサ16が接続されている。各ノード14は、接続されている複数の触覚センサ16のそれぞれの出力を検出し、センサ出力データとして取得する。なお、ノード14は少なくとも1つの触覚センサ16を備えていればよい。
ホストコンピュータ12は、PCのようなコンピュータであり、図示しないCPU、ROM、HDDおよびRAM等を備える。ROMまたはHDDにはホストコンピュータ12の動作を制御するためのプログラムおよびデータが予め記憶される。RAMはCPUのワーキングメモリやバッファメモリとして使用される。CPUはプログラムに従ってデータをRAMに生成しまたは取得しつつ処理を実行する。ホストコンピュータ12は、この実施例では、そのシリアルポートに接続されたケーブルを介してノード14に接続されており、当該接続されたノード14との間でデータを送受信する。
なお、この皮膚センサネットワーク10が日常生活環境で人間と共存しコミュニケートするコミュニケーションロボットに設けられる場合には、ホストコンピュータ12のプロセサ(CPU)は当該コミュニケーションロボットの全体的な制御を行うプロセサであってよい。
図2にはノード14の電気的構成の一例が示される。ノード14は基板18(破線表示)を含み、基板18にはこのノード14の制御を行うCPU20が設けられる。一例として、基板18の大きさは70×60mm程度であり、CPU20にはたとえばルネサス製H8S2633が使用され得る。このプロセサはCISC構成の命令を69種類実行可能であり、センサデータの処理をノード上で行える。CPU20はメモリ22と接続され、メモリ22はセンサデータバッファ24および転送データバッファ28と接続される。メモリ22はROMおよびRAM等を含み、ROMにはノード14の動作を制御するためのプログラムおよびデータが予め記憶されている。CPU20はメモリ22のROMのプログラムに従ってデータをRAMに生成しまたは取得しつつ処理を実行する。たとえば、メモリ22は、内蔵ROM256kByte、RAM16kByteを含み、クロック12.288MHzをもとに動作する。
センサデータバッファ24にはA/D変換器26が接続される。A/D変換器26としては、たとえば15チャネル10ビットのものが使用され得る。つまり、この実施例では、1つのA/D変換器26には最大15個の触覚センサ16が接続され得る。A/D変換器26は、触覚センサ16から出力された信号をディジタルデータに変換する。A/D変換器26は、センサ出力データを、この実施例では0を基準点として−512から512までの値で出力する。そのセンサ出力データはセンサデータバッファ24に与えられ、センサ16ごとに設けられた領域に格納される。CPU20はセンサデータバッファ24からセンサ出力データを取得して、センサ出力データを、当該データを出力した触覚センサ16の識別情報に関連付けてメモリ22に格納する。センサ出力データはたとえばCPU20の内部タイマに基づく検出時刻を付与されて記憶されてよい。センサ出力のサンプリングレートはたとえば100Hzなど適宜に設定される。
転送データバッファ28には複数のシリアル通信のためのポート30が接続される。この実施例では4つのポートが設けられる。各ポート30で独立全二重通信が可能であり、通信速度はたとえば38400bpsとした。各ノード14はポート30およびケーブルを介して他のノード14(もしくはホストコンピュータ12)と接続される。CPU20は、送信すべきデータをメモリ22から転送データバッファ28の所定の領域に与えて、対応するポート30から当該データを送信する。また、他のノード14(もしくはホストコンピュータ12)から送信されたデータは、ポート30を介して転送データバッファ28の所定の領域に格納される。CPU20は転送データバッファ28から受信データを取得して、受信データを、たとえば当該データを受信したポート30の識別情報に関連付けてメモリ22に格納する。
触覚センサ16としては、たとえばピエゾフィルム(圧電センサ)が用いられる。ピエゾフィルムはたとえば米国MSI社製、株式会社東京センサ販売のものを使用してよい(http://www.t-sensor.co.jp/PIEZO/TOP/index.html)。このピエゾフィルムは、圧電フィルム(たとえばPVDF(ポリビニリデンフルオロイド))の両面に金属薄膜が形成された構造、つまり、圧電体が導体で挟まれた構造を有する圧電センサである。ピエゾフィルムは、圧力等で変形されると、そのひずみ速度に応じた電圧を発生する。
この触覚センサ16すなわちピエゾフィルムが、図3に示すように、柔軟な素材からなる皮膚32に埋め込まれることによって、触覚センサデバイスが構成される。この実施例では、皮膚32は、下層のウレタンスポンジ34と、その上に積層されるシリコンゴムシート36とを含む。これらウレタンスポンジ層34とシリコンゴムシート層36との間にピエゾフィルム16が設けられる。一例として、ウレタンスポンジ層34の厚みは1mm程度であり、シリコンゴムシート層36の厚みも1mm程度である。また、ピエゾフィルム16は、たとえば、30×30mm程度の大きさにカットされ、約5mmの間隔で皮膚32中に配置される。
なお、皮膚32の構成は上述のものに限定されるものではなく適宜変更され得る。たとえば本件出願人による特開2004−283975号に開示したように、シリコンゴムシート層を2層で形成し、ピエゾフィルムをシリコンゴムシートの比較的薄い上層と比較的厚い下層との間に配置するようにしてもよい。
この皮膚センサネットワーク10のような相互接続型のネットワークでは、ホストコンピュータ12までの経路を確保する必要がある。ホストコンピュータ12が各ノード14に経路をマクロキャリブレーションによって明示的に示す場合には、ホストコンピュータ12に負担がかかる。そのため、この実施例では、各ノード14が協調して経路確保を行う。このようにホストコンピュータ12からの明示的な指定なしに各ノード14がデータ送信経路を確保できるとき、そのセンサネットワークは自己組織化可能であると表現する。この皮膚センサネットワーク10は、相互接続型の自己組織化可能なセンサネットワークに基づく分布型高密度皮膚センサを構成する。
自己組織化可能なセンサネットワークは、ホストコンピュータからは1つのデバイスのように使うことができ、ホストコンピュータはネットワークを意識しなくてもよい。発明者等は、アドホックネットワークのDSR(Dynamic Source Routing Protocol)と類似した手法を用いて、この自己組織化ネットワークのためのプロトコルを作成した。この作成したプロトコルによってホストコンピュータ12まで転送する経路を明示的指示なしに確保できることを、発明者等はシミュレータで確認している。
概略を言えば、図4(A)に示すように、まず、ホストコンピュータ12が経路確保の命令(経路要求コマンドRREQ)をブロードキャスト送信する。各ノード14は、経路確保命令を受信すると、他のポート30にそのコマンドのコピーを送信する。したがって、ホストコンピュータ12からの経路確保命令は全てのノード14に送信されることとなる。
各ノード14は、ブロードキャストの信号(経路要求コマンド)が流れてきた方向に経路確保を行う。たとえば、各ノード14のCPU20は、最初に経路確保命令を受信したポート30をホスト側経路として確保し、つまり、そのポート30の識別情報(ポート番号)を、ホスト側の経路を示す経路確保データとしてメモリ22に記憶する。ノード14のCPU20は、ホストコンピュータ12宛にデータを転送する際には、メモリ22に記憶した経路確保データを参照して、ホスト側のポート30に向けてデータを送信する。このようにして、たとえば図4(B)に示すように、皮膚センサネットワーク10では、ホストコンピュータ12からの明示的な経路の指定なしに、通信の経路を確保することができる。このように、皮膚センサネットワーク10は、相互接続型の自己組織化センサネットワークを構築する。
また、ネットワーク中でたとえば断線があった場合でも、上述のようにホストコンピュータ12から経路確保の命令を送信することによって各ノード14が経路確保を行うので、図4(C)に示すように、通信経路を簡単に再構築することができる。
この手法により、ホストコンピュータ12はネットワークの構造を意識することなく、キャリブレーションの信号(経路確保要求)を送ってデータを受信するという2つのステップでセンサネットワークを使うことができる。
具体的には、各ノード14は、上述のように、独立に通信できる複数の通信ポート30を有し、受信データについて識別可能である。経路確保とデータ転送のために、次の(1)から(8)に示すようなコマンドを設ける。各ノード14は、コマンド受信時には当該コマンドを解釈し、決められたルールに従って動作する。
(1)経路要求コマンドRREQは、経路確保を要求するためのコマンドである。経路要求コマンドは初めにホストコンピュータ12から送信される。また、各ノード14は、ホスト側のノード14と双方向通信が確認されたことに応じて、この経路要求コマンドをホスト側以外のポート30に向けて送信する。経路要求コマンドは、引数として世代番号Gnおよびホップ番号Hnを含む。世代番号Gnおよびホップ番号Hnはメモリに記憶されている。
なお、世代番号Gnはネットワーク世代番号であり、ルーティングのためのネットワーク管理番号であり、初期値は0である。ホストコンピュータ12から経路確保要求するたびにその値が変更される。各コマンドは引数としてこの世代番号Gnを必ず含んで送信され、各ノード14ではこの世代番号Gnが常にチェックされる。経路要求コマンドの場合には、この世代番号Gnが異なるとき経路が再確保されることとなり、他のコマンドの場合にはこの世代番号Gnはネットワークの識別に用いられる。
また、ホップ番号Hnは、ホストコンピュータ12からのホップ数を示し、初期値は0である。ホップ番号Hnは、今の経路がこの番号分のノード14を介してホストに経路を確保していることを示す。ホストコンピュータ12のポートと直接接続されているノード14のホップ番号Hnは1になる。ホップ番号Hnはたとえば経路データの結合時に使用される。
この経路要求コマンドを受信したとき、ノード14は世代番号Gnを確認する。その世代番号Gnの含まれるコマンドをまだ受信していない場合には、ノード14は当該経路要求コマンド受け取ったポート30に向けて経路応答コマンドRREP_local(承諾)を送信する。これによって、経路要求を承諾し、経路応答確認コマンドを待つ。一方、その世代番号Gnの含まれるコマンドを既に受信している場合には、ノード14は当該経路要求コマンドを受け取ったポート30に向けて経路応答コマンドRREP_local(拒否)を送信して、経路要求を拒否する。
(2)経路応答コマンドRREP_localは、ルート要求に対する承諾または拒否の応答をするためのコマンドである。経路応答コマンドは引数として世代番号Gnおよびホップ番号Hnを含む。経路応答コマンド(承諾)を受信したとき、ノード14(またはホストコンピュータ12)は、経路確保確認コマンドを受信ポート30に向けて送信する。そして、ネットワーク経路応答コマンドを待つ。一方、経路応答コマンド(拒否)を受信したとき、ノード14は当該ポート30に向けた経路要求に対する拒否を記憶する。
(3)経路応答確認コマンドCONFIRM_RREPは、ルート確立の確認をするためのコマンドである。経路応答確認コマンドは引数として世代番号Gnおよびホップ番号Hnを含む。経路応答確認コマンドを受信したとき、ノード14は経路要求コマンドを受信したポート30以外の全てのポート30に向けて経路要求コマンドを送信する。そして、経路応答コマンドを待つ。
なお、経路応答コマンド待ち処理で、タイムアウトになったとき、または全てのポート30から経路応答コマンド(拒否)を受信したときには、当該ノード14がネットワークの末端になる。したがって、当該末端のノード14は、自分の経路データを生成して、ホスト側のポート30に向けてネットワーク経路応答コマンドを送信する。
(4)ネットワーク経路応答コマンドRREP_entireは、ルート情報をホストに知らせるためのコマンドである。ネットワーク経路応答コマンドは引数としてデータ長Dlen、世代番号GnおよびデータDataを含む。ネットワーク経路応答コマンドを受信したとき、ノード14は自分の経路情報を付加した経路データを生成する。末端側(葉側)の全てのポート30からネットワーク経路応答コマンドを受信した場合には、ノードは生成した経路データを含むネットワーク経路応答コマンドをホスト側のポート30へ向けて送信する。
(5)ホスト中継コマンドRELAY_to_Hostは、センサデータをホストコンピュータ12に送るためのコマンドである。ホスト中継コマンドは引数としてデータ長Dlen、世代番号GnおよびデータDataを含む。ホスト中継コマンドを受信したとき、ノード14は、確保した経路(ホスト側経路)のポート30に向けて、当該受信したデータのコピーを送信する。
なお、この実施例のように、ホスト中継コマンドを受信したときには、データの優先順位を判定し、優先順位の高いデータを先に送信するようにしてもよい。この場合には、たとえば緊急に送信したいデータを先にホストコンピュータ12に送信することができる。
(6)ノード中継コマンドRELAY_to_Nodeは、任意のノードにコマンドまたはデータを送信するためのコマンドである。ノード中継コマンドは引数としてデータ長Dlen、世代番号Gn、指定ポート番号PnおよびデータDataを含む。このノード中継コマンドを受信したときには、受信したデータがコマンドであれば、ノード14は、指定された番号のポートに向けて当該コマンドを送信する。一方、受信したデータがコマンドでなければ、当該データを指定番号のポート30に向けてノード中継コマンドで送信する。また、指定ポート番号Pnがlocalhostのストリームへのポート番号である場合には、ノード14は自分自身に対して送信されたデータであると判断して、当該データを受信して記憶する。
このノード中継コマンドは、ホストと任意ノード間通信のため、および、任意ノード間(隣接ノードを含む)通信のために設けられている。ポート番号Pnをたとえば1,2,…,nで割り振り、localhostのストリームへのポート番号をたとえば0とする。たとえばノード1(ポート_2)→ノード2という経路(ノード1はポート_2を介してノード2と接続されている)の場合において、ノード1がRELAY_to_Node(Dlen,Gn,Pn=0,Data=(センサ出力データ))をポート_2へ送信したとき、ノード2は、指定ポート番号Pnが0なので、受信した「Data(センサ出力データ)」が自分自身へ送られたものであると判断できる。したがって、隣接ノード14に対してセンサ出力データを送信することができる。また、たとえばノード1(ポート_2)→ノード2(ポート_1)→ノード3という経路の場合において、ノード1がRELAY_to_Node(Dlen,Gn,Pn=1,Data=(“Pn=0”+(センサ出力データ)))をポート_2に向けて送信すれば、ノード1は自身のセンサ出力データをノード3に対して送信することができる。
なお、上述では、ノード14が自己に所属する触覚センサ16のセンサ出力データを検出したとき、隣接センサ位置情報に基づいて相手のノード14(隣接センサの所属するノード14)にセンサ出力データを送信する場合を説明した。しかし、相手のノード14からのリクエストに応じてセンサ出力データを送信するようにしてもよい。このように隣接ノードを超えて物理的に近い位置に存在するセンサ16のセンサデータを交換するためには、ネットワークの経路情報は必要ではないが、当該センサの位置情報を記憶しておく必要がある。また、このコマンドを使って任意のノード間でデータを与える場合には、ホストが経路を指示する必要がある。
(7)識別番号割当コマンドGIVE_ID_NUMBERは、識別番号を各ノード14に割り振るためのコマンドである。識別番号割当コマンドは引数として世代番号Gn、ホップ番号HnおよびデータDataを含む。この識別番号割当コマンドを受信したとき、ノード14はデータに含まれる識別番号を記憶する。識別番号割当コマンドは、ホストコンピュータ12から各ノード14に向けて送信される。ホストコンピュータ12は経路データを受信したとき、経路データに基づいて経路上の各ノード14の識別番号を特定する。ホストコンピュータ12のメモリには、たとえばノード配置情報が予め記憶されていて、各ノード14の識別番号と各ノード14が他のノード14との接続に使用しているポート番号等が記憶されている。ホストコンピュータ12はこのノード配置情報と取得した経路情報に基づいて、取得された経路上における各ノード14の識別番号を特定することができる。そして、ホストコンピュータ12は、自己に直接接続されたノード14にはこの識別番号割当コマンドを用いて当該ノード14の識別番号を送信し、他のノード14には、ノード中継コマンドを用いてかつそのデータにこの識別番号割当コマンドを含めることによって、各ノード14に当該ノード14の識別番号を送信する。
たとえば、ノード1のポート2に接続されているノード2に対して識別番号を与える際には、ホストコンピュータ12は、RELAY_to_Node(Dlen,Gn,Pn=2,Data=(GIVE_ID_NUMBER(Hn,Gn,Data=(識別番号))))をノード1の接続されているポートに向けて送信する。これに応じてノード1は、Dataがコマンドなので、指定された番号Pn(=2)のポートへ向けて、当該識別番号割当コマンドを送信する。したがって、ノード2は識別番号割当コマンドを受信して、識別番号を記憶することができる。
また、この識別番号割当コマンドを受信したことに応じて、ノード14はセンサデータ(触覚情報)をホストへ送信するための処理を開始する。すなわち、この識別番号割当コマンドはホストコンピュータ12からのセンサデータ送信要求に相当する。
(8)エラーコマンドErrorは、エラーをホストに知らせるためのコマンドである。エラーコマンドは引数として世代番号Gnおよびエラー番号Enを含み、場合によってはデータDataを含んでよい。エラーコマンドを受信したとき、ノード14はエラー番号を記憶し、当該エラー番号を既に送信したことがあるか否かを判定する。当該エラー番号をまだ受信したことがなかった場合には、ノード14は他のポート30に向けてエラーコマンドを送信し、一方、当該エラー番号を既に受信していた場合には当該エラーコマンドの送信は行わない。
また、この実施例では、触覚センサ16を各ノード14が管理しているため、センサ出力情報を取得できる範囲が限定され、触覚センサ16間に境界が形成されることとなる。しかし、隣接する触覚センサ16の接続されたノード14と相互通信して情報を取得することによって、各ノード14がその境界を越えてセンサ出力情報を取得することが可能になる。相互接続によるセンサネットワークはお互いのノード14間の通信に有利であるため、高い時間分解能で隣接するノード14から情報を取得することができ、しかも、このノード14間相互通信がネットワーク全体の通信を妨げるようなことはない。したがって、各ノード14は、1つの触覚センサ16の情報を時間方向で圧縮するだけでなく、複数のセンサ16の反応値に基づいて空間方向で情報を圧縮して、触覚情報を抽出することができる。
触覚情報の特徴を視覚情報と比較した場合、視覚は、全体的な状況を検出するものであり、また非接触である。これに対して、触覚は物理的な接触を局所的に検出するという特徴がある。つまり、触覚は局所的な情報の集合であり、したがって、この実施例では、この局所性を利用することで触覚情報を効率的に圧縮するようにしている。
図5には、空間における局所性を利用して、触覚情報の圧縮を行う方法の概要が示される。この方法では、たとえば、圧縮処理しようとするi番目のセンサに対して、空間でのデータの内挿が可能かどうかに注目し、データをマスクする(すなわちデータをホストコンピュータ12に転送しない)値の範囲を適宜に設定する。この実施例では、マスクする値の範囲は、隣接するセンサ16の反応値に基づいて設定される。マスク範囲ないし領域は、一例として、隣接センサ16のセンサ値の平均値と差によって算出される。具体的には、平均値Simを中心として、かつ、隣接センサ値の差ΔSiに係数kを掛けることによって算出された値kΔSiを幅とした範囲を、データのマスク領域として設定する。
図5の例では、i−1番目のセンサエレメントとi+1番目のセンサエレメントの2つがi番目のセンサエレメントの隣接センサである場合が示されている。i−1番目のセンサ値をSi−1とし、i+1番目のセンサ値をSi+1とすると、差はΔSi={(Si+1)−(Si−1)}/2に従って算出され、平均値はSim={(Si+1)+(Si−1)}/2に従って算出される。そして、処理しようとするi番目のセンサ値が上記マスク範囲に含まれる場合には、当該i番目のセンサを管理するノード14は、そのi番目のセンサのデータをホストコンピュータ12宛に転送しない、すなわちマスクする。
なお、マスク領域パラメータkの値は適宜に設定される。平均値付近にあるデータは他のデータから予測可能な冗長性を含むと考えられるので、たとえば係数kが大きいということはそのセンサの情報の冗長性を大きく見積もるということを意味する。
また、センサの隣接は1次元に限られるものではなく、2次元、および3次元の隣接であってもよい。さらにまた、マスク領域の値は、上述の隣接センサ値の差分やパラメータkを使用する算出方法によって設定することに限られるものではなく、触られ方などの触覚情報の把握に支障のない適切なものであれば他の方法で設定されてよい。
また、上述のような空間方向の圧縮だけでなく、場合によっては、図6に示すように、1つのセンサエレメントのデータを時間軸方向で圧縮するようにしてよい。この圧縮は、これまでに取得したセンサ値の時間外挿に基づいて行われる。つまり、前回時刻tでのセンサ値Stと前々回の検出時刻t−1でのセンサ値St−1に基づいて、たとえば1次線形外挿によって現時刻t+1での値が予測可能か否かに注目し、データをマスクする範囲を設定する。マスク範囲の算出の一例として、まず、センサ値Stとセンサ値St−1との差ΔStに係数ktを掛けることによって幅ktΔStを算出する。なお、差はΔSt={(St)−(St−1)}/2に従って算出される。次に、時刻tにおけるセンサ値Stを中心としてktΔStを幅とした範囲を設定する。そして、時刻t−1でのセンサ値St−1と設定範囲の下限値(St−ktΔSt)とに基づく外挿によって時刻t+1における下限予測値を算出する。また、時刻t−1でのセンサ値St−1と設定範囲の上限値(St+ktΔSt)とに基づく外挿によって時刻t+1における上限予測値を算出する。そして、算出された時刻t+1における下限予測値から上限予測値までの範囲を、時刻t+1におけるマスク領域として設定する。
したがって、今回の時刻t+1で検出したセンサ値St+1が、設定されたマスク領域に含まれる場合には、そのセンサエレメントを管理するノード14は、当該センサ値St+1をホストコンピュータ12宛に転送しない。この時間軸方向の圧縮によっても転送データ量を減少させることができるが、ノイズの低減に効果的である。
また、アナログのセンサデバイスを読み取りデジタル化する際には、量子化誤差だけでなく様々な要因によってA/D変換の結果にノイズなどの影響が誤差として出てくる。そのため、S/N比の小さいノイズレベルの変化を観測したときには、実際の触覚デバイスからのものであるのかあるいはノイズであるのかの判断は困難で、含まれる情報量も少ない。たとえば、図7に示すように、マスク領域と隣接センサエレメントの差ΔSiとの関係は、傾きkの直線となる。そこにノイズレベルNを設定する。すなわち、空間で隣接するセンサ16に対して、変化量が閾値N以下の値となった場合には、ノイズとみなして、当該センサデータを無条件にマスクする。また、時間方向で過去の履歴から変化量がノイズレベル(閾値)Nt以下のセンサデータも、ノイズとみなしてマスクする。これによって、ノイズによって生じる無駄な情報転送を低減できる。
このようにして圧縮されてホストコンピュータ12に転送されるセンサデータは、全体としては触覚出力の変化領域の輪郭を示している。つまり、ホストコンピュータ12は、センサデータとして圧力値が転送される場合には、圧力の変化している部分の輪郭を把握することができる。
上述のような圧縮方法では、圧縮率とマスクされる(ホストコンピュータ12に転送されない)情報量とは、マスク領域パラメータk(kt)の値と想定するノイズレベルN(Nt)の値で調整することができる。情報量をコントロールするにはこの2つのパラメータを適宜変更すればよい。たとえば、この皮膚センサネットワーク10をコミュニケーションロボットに設ける場合には、ロボットで敏感にしたい部分では情報量が多くなるように各パラメータを設定し、鈍感でよい部分では情報量が少なくなるように各パラメータを設定する。このようなパラメータの設定によって、たとえばロボットの触行動認識におけるアテンションコントロールを比較的容易に行うことができる。
図8には、各ノード14のメモリ22のデータ記憶領域のメモリマップの一例が示される。ただし、図8に示されるデータは一部であり、メモリ22のデータ記憶領域には、処理に必要な各種のデータが記憶されている。
世代番号記憶領域42には世代番号Gnが記憶される。初期値として0が記憶される。この記憶領域42の世代番号Gnは、ホスト側から経路要求コマンドRREQを受信したときに参照される。経路要求コマンドで受信した世代番号と異なる番号が記憶されているときには、世代番号記憶領域42には受信した世代番号Gnが記憶される。
ホップ番号記憶領域44にはホップ番号Hnが記憶される。初期値として0が記憶される。ホップ番号Hnは経路確保確認コマンドの受信に応じて更新される。また、ホップ番号記憶領域44は経路データを生成するときに参照される。
経路確保情報記憶領域46には、ホスト側のポート番号が記憶される。各ノード14がホスト側ポート番号のみを記憶することによって、ネットワーク全体で情報伝達経路が記憶されることとなる。
識別番号記憶領域48にはホストコンピュータ12から送られてきた識別番号が記憶される。エラー番号履歴記憶領域50には、受信した(送信した)エラー番号Enが記憶される。エラー番号Enとしてはエラーの種類や発生状況等に応じて異なる番号が設定されている。
隣接センサ位置情報記憶領域52には、当該ノード14に所属する触覚センサ16と隣接する触覚センサ16の位置を示す情報が記憶される。隣接センサ位置情報は予め記憶されている。たとえば、図9に示すように、センサID(識別情報)に対応付けて、隣接センサの所属するノードに関する情報、および隣接センサの所属ノードにおけるセンサIDが記憶される。隣接センサの所属するノードに関する情報は、たとえば当該隣接センサの所属するノード14の接続されるポート番号が記憶される。隣接センサが自己のノード14に所属している場合には、所属ノードに関する情報としては、所属ノードが同じであることを示すデータが記憶される。なお、隣接センサは基本的に物理的に近い位置に存在するので、自ノードまたは隣接するノードに所属する。しかし、隣接センサが隣接ノードに所属していない場合には、当該隣接センサの所属するノードまでに、隣接ノードもしくは介在ノードのどのポートを介して接続されているかが分かるように、当該隣接センサの所属するノードまでに介在するノードおよびポート番号に関する情報を、隣接センサの所属ノードに関する情報として予め記憶しておく。また、複数の隣接センサが存在する場合には、複数の隣接センサのそれぞれの位置情報が記憶される。
センサ出力履歴記憶領域54には、自ノード14に所属する触覚センサ16の出力データの履歴が記憶される。センサIDに対応付けられて所定の検出回数分のセンサ出力データが記憶される。なお、センサ出力データにはさらにその検出時刻を付与して記憶するようにしてよい。
隣接センサ出力記憶領域56には、他のノード14から受信した隣接センサのセンサ出力データが記憶される。たとえば、隣接センサのセンサ位置情報(所属およびセンサID)に対応付けて、受信したセンサ出力データが記憶される。
優先度情報記憶領域58には、データ転送の優先順位に関する情報が記憶される。優先度情報は予め記憶される。具体的には、優先的に転送すべきセンサデータを示す情報が記憶される。たとえば、痛い感覚を示すデータ、危ないことを示すデータ等のように、緊急を要するセンサデータが優先的に送信すべきデータとして設定される。また、たとえば撫でられていることを示すデータのように、所定の触られ方を示すデータを高優先度データとして設定してもよい。このようなセンサデータに対するラベリングは、センサの圧力値や設置場所等に基づいてなされる。たとえば、痛い感覚を示すデータは、センサ出力データがコミュニケーションロボットの通常のコミュニケーションではあり得ないような高いまたは異常な圧力値を示すデータであった場合にラベリングされてよい。また、危ないことを示すデータは、コミュニケーションロボットの関節の近くに配置されたセンサからの出力データに対してラベリングされてよい。この場合、各ノード14は自己のセンサ16がたとえばコミュニケーションロボットにおける関節部の近くのような危ない場所に設置されていることを示すデータをセンサIDに対応付けて予め記憶する。
また、優先度情報は、状況に応じて変更されてもよい。この場合、ホストコンピュータ12が各ノード14に対して、状況に応じた優先度情報を、ノード中継コマンドRELAY_to_Nodeを用いて送信する。ホストコンピュータ12がコミュニケーションロボットのCPUである場合、ホストコンピュータ12は、たとえばコミュニケーションロボットが今実行している行動や各種センサで観測される状況等に応じて、危険な場所にあるノード14およびセンサIDをテーブルデータなどに基づいて特定し、該当するノード14に対して、該当するセンサIDが今危ない場所になっていることを示すデータを送信してもよい。また、ホストコンピュータ12は、コミュニケーションロボットが今実行している行動や観測される状況等に応じて、優先されるべき所定の触られ方を特定し、当該所定の触られ方を示すデータを優先度情報として各ノード14に送信するようにしてもよい。
ノイズレベル情報記憶領域60には、センサデータをマスクするためのノイズレベルに相当するセンサ出力値の変化量を示す情報が記憶される。具体的には、空間方向のマスクのためのノイズレベルNと、時間方向のマスクのためのノイズレベルNtとが記憶される。
図10には生成される経路データの内容の一例が示される。図10(A)には、ネットワークの末端のノード14がホスト側へネットワーク経路応答を送信するとき、または、各ノード14がネットワーク経路応答待ち処理を開始したときに生成される自分の経路データの内容が示されている。自分の経路データは、ホップ番号Hnおよび経路として確保したホスト側のポート番号Pn_hostside等を含む。ホップ番号Hnはメモリ22のホップ番号記憶領域44に記憶され、ホスト側ポート番号はメモリ22の経路確保情報記憶領域46に記憶されている。自分の経路データからは、当該ノード14が幾つのノード14を介してホストに経路を確保しているか、どのポート番号でホスト側経路につながっているかが把握される。なお、図10(A)でseparator2はデータの区切り目を示す文字列であり、separator1はデータの終わりを示す文字列である。また、anythingは任意のデータである。つまり、ネットワーク経路応答コマンドを用いて、経路データとともに任意のデータを送信することが可能になっている。
図10(B)には、ネットワーク経路応答コマンドを末端側(葉側)から受信したときに生成される経路データの内容の一例が示される。この経路データは、図10(A)に示した自分の経路データと受信した経路データとを結合することによって生成される。つまり、各ノード14は、ネットワーク経路応答コマンドを葉側から受信したとき、この自分の経路データに、ホップ数に関する情報TAB*Hn、および当該コマンドを受信したポート番号Pn_leafsideとともに、受信した経路データData_leafsideを追加することによって、経路データを生成する。葉側ポート番号が含まれるので、葉側の経路データをどのポートから受信したかを把握できる。この追加は、葉側のポートからのネットワーク経路応答コマンドの受信ごとに行われる。
このようにして生成される経路データは、当該データを生成するノードを根とするツリー構造となる。つまり、経路データは、当該ノード14を根とした葉側のネットワークの経路を示すネットワーク経路データともいえる。各ノード14は、全ての葉側ポート30からネットワーク経路応答コマンドを受信したとき、生成した経路データをホスト側のポート30へ向けて送信する。したがって、ホストコンピュータ12は、接続されているノード14を根とするツリー構造でネットワーク全体の経路が示されたネットワーク経路データを受信することとなり、受信したネットワーク経路データによってネットワーク全体の経路を把握することができる。
図11には、ホストコンピュータ12の動作の一例が示される。ホストコンピュータ12のCPUは、ステップS1で、センサデータを取得するか否かを判定する。たとえば、一定時間ごとにセンサデータを検出するような場合には検出時刻になったか否かをCPUの内部タイマに基づいて判断する。また、ホストコンピュータ12がコミュニケーションロボットのCPUであるような場合には、実行する行動や観測される状況等に応じたセンサデータの検出タイミングであるか否かを判断してもよい。
ステップS1で“YES”であれば、ステップS3で、世代番号Gnの値を設定する。世代番号Gnはネットワークの管理番号であり、その値は経路確保ごとに変えられ、異なる値に設定される。そして、ステップS5で、経路要求コマンドRREQを、ノード14の接続されているポートへ向けて送信する。なお、経路要求コマンドで引数として世代番号Gnとともに送信されるホップ番号Hnには初期値0が設定される。
続いて、ステップS7で、経路応答コマンドRREP_local(承諾)をノード14から受信したか否かを判断する。つまり、ステップS5で送信した経路要求コマンドに応じてノード14から送信される経路応答コマンドの受信を待機する。なお、図示は省略されるが、経路応答コマンド(承諾)を受信できずにタイムアウトになった場合には、接続されているノード14との間の通信リンクに問題があると考えられるので、たとえば当該タイムアウトをメモリに記憶してステップS1に戻る。
ステップS7で“YES”であれば、ステップS9で、経路確保確認コマンドCONFIRM_RREPをノード14の接続されているポートへ向けて送信する。そして、ステップS11で、ステップS9で送信したコマンドに応じてノード14から送信されるネットワーク経路応答コマンドRREP_entireを受信したか否かを判断する。ステップS11で“NO”であれば再びステップS11を繰り返す。つまり、ネットワーク経路応答コマンドの受信を待機する。なお、図示は省略されるが、ネットワーク経路応答コマンドを受信できずにタイムアウトになった場合には、当該タイムアウトをメモリに記憶してステップS1に戻る。
ステップS11で“YES”であれば、ステップS13で、ネットワーク経路応答コマンドに含めて送信された経路情報(ネットワーク経路情報)を抽出してメモリに記憶する。この経路情報は、ホストコンピュータ12に接続されるノード14のデータを根とするツリー構造となっている。そして、ステップS15で、取得した経路情報に基づいて、経路上の各ノード14の識別番号を特定する。ホストコンピュータ12のメモリには、たとえば、各ノード14の識別番号、および各ノード14が他のノード14との接続に使用しているポート番号等に関する情報を含むノード配置情報が予め記憶されている。ホストコンピュータ12はこのノード配置情報と取得した経路情報に基づいて、取得された経路上における各ノード14の識別番号を特定する。
そして、ステップS17で、各ノード14にそれぞれの識別番号を送信する。この識別番号の各ノード14への送信には、上述のように、ノード中継コマンドRELAY_to_Nodeおよび識別番号割当コマンドGIVE_ID_NUMBERを用いる。経路情報を取得したので、各ノード14にその識別番号を送信することができる。この識別番号の送信は、各ノード14に対する触覚情報送信要求に相当する。
続いて、ステップS19では、ホスト中継コマンドRELAY_to_Hostを受信したか否かを判断する。ステップS19で“NO”であれば再びステップS19を繰り返す。つまり、ステップS17の識別番号の送信に応じて各ノード14から送信されるホスト中継コマンドの受信を待機する。ステップS19で“YES”であれば、当該コマンドに含まれるセンサデータ(触覚情報)を抽出して、メモリに記憶する。センサデータは、たとえば当該コマンドで一緒に送信されてくるノード14の識別番号および検出時刻に対応付けて記憶する。なお、検出時刻はホストコンピュータ12で付与されてもよい。また、図示は省略されるが、このホスト中継コマンドの受信待ちおよびセンサデータの記憶は、たとえばステップS17の処理から所定時間が経過するまで継続される。この所定時間は、たとえば全てのノード14からセンサデータが送信された場合でも全センサデータを受信して記憶することが可能な値に設定されている。ステップS21を終了するとステップS1に戻る。
なお、図11では省略されるが、ホストコンピュータ12のCPUは、エラーコマンドErrorを受信したときは、当該コマンドに含まれるエラー番号Enをたとえば世代番号Gnとともにメモリに記憶してステップS1へ戻る。
図12には各ノード14の動作の一例が示される。ノード14のCPU20は、ステップS41で、センサ出力を取得する時刻であるか否かを判断する。たとえば所定時間間隔でセンサ出力を検出する場合には、CPU20の内部タイマに基づいて一定時間が経過したか否かが判断される。ステップS41で“YES”であれば、ステップS43で、センサデータバッファ24から各センサ16のセンサ出力データを取得して、センサIDおよび検出時刻等のデータに関連付けてメモリ22のセンサ出力履歴記憶領域54に記憶する。
続いて、ステップS45で、ノード中継コマンドRELAY_to_Nodeを用いて、取得したセンサ出力データを隣接センサの所属するノード14に送信する。隣接センサの所属するノード14までに経由するポート番号等の情報は、隣接センサ位置情報記憶領域52に記憶されているので、上述のようにしてノード中継コマンドでセンサ出力データを隣接センサのノード14まで送信できる。また、センサ出力データを受信したときも、ノード14は、隣接センサ位置情報とセンサ出力データに付与されたセンサIDに基づいて、隣接センサのセンサ出力データを特定できる。ステップS45を終了し、またはステップS41で“NO”であれば、ステップS47へ進む。
ステップS47では、転送データバッファ28の受信バッファをチェックし、ステップS49でコマンドが記憶されているか否かを判断する。ステップS49で“YES”であれば、ステップS51でコマンド処理を開始する。このコマンド処理の動作は後述する図13から図28に示される。ステップS51でコマンド処理を開始し、またはステップS49で“NO”であれば、ステップS53で全ポート30の受信バッファについて処理を済ませたか否かを判断する。ステップS53で“NO”であれば、ステップS47に戻って別のポート30に対する処理を実行する。ステップS53で“YES”であれば、ステップS41に戻る。このように、常時各ポート30の受信バッファがチェックされ、コマンドを受信しているときにはポート30ごとのコマンド処理が実行される。図12のステップS41からステップS45のセンサ出力の検出および隣接センサ出力データの送信、ならびに各コマンド処理は並列的に実行される。
図13にはコマンド処理の動作の一例が示される。ノード14のCPU20は、ステップS71で転送データバッファ28の受信バッファからコマンドをメモリ22のワークエリアに取得する。次に、ステップS73で、受信コマンドが経路要求コマンドRREQか否かを判断する。ステップS73で“YES”であれば、ステップS75で、コマンドから世代番号Gnおよびホップ番号Hnを取得ないし抽出する。
続いて、ステップS77で、取得した世代番号Gnは、メモリ22の世代番号記憶領域42に記憶された世代番号Gnと同じであるか否かを判断する。ステップS77で“NO”であれば、つまり、今回設定された世代番号Gnを有する経路要求コマンドを初めて受信した場合には、ステップS79で、経路確保情報記憶領域46に当該コマンドを受信したポート番号を記憶する。つまり、ホスト側の経路を示すポート番号が記憶される。また、ステップS81で世代番号記憶領域42に受信した世代番号Gnを記憶する。
さらに、ステップS83で、受信ポートへ向けて経路応答コマンドRREP_local(承諾)を送信する。そして、ステップS85で、経路確保確認コマンドCONFIRM_RREP待ち処理を開始する。この待ち処理は図14に示され、コマンド処理等と並列的に実行される。
経路確保確認コマンド待ち処理を開始すると、図14のステップS101で、経路確保確認コマンド待ちタイマのカウントをスタートする。次に、ステップS103で、タイムアウトになったか否か、たとえばタイマが所定値になったか否かを判断し、“YES”であれば、ステップS105で、ステータスを初期化する。具体的には世代番号記憶領域42および経路確保情報記憶領域46をクリアする。経路確保確認コマンドを受信できれば、隣接ノード14と送受信可能なリンクで繋がっているといえる。しかし、経路要求に応答したのに確認メッセージが来ないということは、送信ポートが使えず、片方向通信のみ可能なリンクであるので、他の経路を利用するべく、ステータスを初期化する。また、ステップS107で、全てのポート30に向けてエラーコマンドErrorを送信する。このエラーコマンドでは、たとえば経路確保確認に失敗したことを示すエラー番号Enが送信される。なお、図示は省略されるが、送信するエラー番号はエラー番号履歴記憶領域50に記憶する。ステップS107を終了すると、この経路確保確認待ち処理を終了する。
一方、ステップS103で“NO”であれば、ステップS109で、経路確保確認コマンドが受信されたか否かを判断する。たとえば、受信したコマンドが経路確保確認コマンドであったと判定されたとき、当該コマンドの当該ポートでの受信を示すフラグをオンに設定しておく。ステップS109では、この経路確保確認コマンド受信フラグに基づいて判定する。他の待ち処理でも同様に、各コマンドの各ポートにおける受信を示すフラグに基づいて判定が行われてよい。ステップS109で“NO”であれば、ステップS103へ戻り、この待ち処理を継続する。一方、ステップS109で“YES”であれば、この待ち処理を終了する。
図13に戻って、ステップS77で“YES”であれば、つまり、今回設定された世代番号Gnを有する経路要求コマンドを既に受信していた場合には、ステップS87で、当該コマンドを受信したポート30に向けて、経路応答コマンドRREP_local(拒否)を送信する。ステップS87を終了し、またはステップS85で待ち処理を開始すると、このコマンド処理を終了する。なお、ステップS73で“NO”であれば、処理は図15のステップS121へ進む。
図15のステップS121では、受信したコマンドが経路応答コマンドRREP_localであるか否かを判断し、“YES”であれば、さらにステップS123で承諾か拒否かを判断する。ステップS123で“YES”であれば、経路要求が承諾されたので、ステップS125で、受信したポート30に向けて、経路確保確認コマンドCONFIRM_RREPを送信する。そして、ステップS127で、ネットワーク経路応答コマンドRREP_entire待ち処理を開始する。また、ステップS129で、自分の経路データ(図10(A))をメモリ22に生成する。ステップS127で開始されるネットワーク経路応答待ち処理は図16に示され、コマンド処理等と並列的に実行される。なお、このネットワーク経路応答待ち処理でのタイムアウトは通常は起こらない。つまり、承諾を示す経路応答を受信して経路確保確認を送信した全てのポート30から、所定時間内にネットワーク経路応答コマンドを受信できる。
ネットワーク経路応答コマンド待ち処理を開始すると、図16のステップS141で、ネットワーク経路応答コマンド待ちタイマのカウントをスタートする。次に、ステップS143で、タイムアウトになったか否かを判断する。また、ステップS143で“NO”であれば、ステップS145で、全ての葉側ポート30から経路応答コマンドRREP_localが受信されたか否かを判断する。葉側ポート30は、経路応答コマンド(承諾)を受信したポート30であり、つまり、経路確保確認コマンドを送信したポート30である。
ステップS143で“YES”であれば、またはステップS145で“YES”であれば、ステップS147で、ホスト側のポート30に向けて、ネットワーク経路応答コマンドRREP_entireを送信する。この場合には、全ての葉側のポート30からネットワーク経路応答コマンドを受信できていない。そこで、経路データとして、葉側のポート30からネットワーク経路応答コマンドを1度も受信していない場合には自分の経路データのみを送信し、そうでない場合には、自分の経路データとそれまでに受信した葉側の経路データとで生成した経路データ(図10(B))を送信する。そして、ステップS149で、全てのポート30に向けて、ネットワーク経路応答待ちでのエラーを示すエラー番号Enを含むエラーコマンドErrorを送信する。
また、ステップS145で“NO”であれば、ステップS151で、全ての葉側のポート30からネットワーク経路応答コマンドRREP_entireが受信されたか否かを判断する。ステップS151で“NO”であれば、ステップS143に戻り、この待ち処理を継続する。一方、ステップS151で“YES”であれば、またはステップS149を終了すると、このネットワーク経路応答コマンド待ち処理を終了する。
図15に戻って、ステップS123で“NO”であれば、つまり、経路応答が拒否であった場合には、ステップS131で、当該ポート番号から経路応答の拒否があったことをメモリ22の所定領域に記憶する。ステップS131またはステップS129を終了すると、このコマンド処理を終了する。なお、ステップS121で“NO”であれば処理は図17のステップS161へ進む。
図17のステップS161では、受信コマンドが経路確保確認コマンドCONFIRM_RREPであったか否かを判断し、“YES”であれば、ステップS163で、既に経路を確保しているか否かを判断する。具体的には、当該コマンドを受信したポート番号と異なるポート番号が経路確保情報記憶領域46に既に記憶されているか否かを判断する。
ステップS163で“NO”であれば、ステップS165でホップ番号Hnに1を加算することによって、ホップ番号を更新してホップ番号記憶領域44に記憶する。続いて、ステップS167で、当該経路確保確認コマンドの受信ポート30を除く全てのポート30へ向けて、経路要求コマンドRREQを送信する。そして、ステップS169で、経路応答コマンド待ち処理を開始する。この待ち処理は図18に示され、コマンド処理等と並列的に実行される。
経路応答コマンド待ち処理を開始すると、図18のステップS181で、経路応答コマンド待ちタイマのカウントをスタートする。次に、ステップS183でタイムアウトになったか否かを判断する。また、ステップS183で“NO”であれば、ステップS185で、経路要求コマンドRREQを送信した全てのポート30から経路応答コマンドRREP_local(拒否)を受信したか否かを判断する。ステップS183で“YES”であれば、またはステップS185で“YES”であれば、ステップS187で、自分がネットワークの末端になることをメモリ22の所定領域に記憶する。続いて、ステップS189で、自分の経路データ(図10(A))をメモリ22の所定領域に生成する。そして、ステップS191で、経路確保したホスト側のポート30に向けて、ネットワーク経路応答コマンドRREP_entireを送信する。この場合、ステップS189で生成した自分の経路データを送信する。
一方、ステップS185で“NO”であれば、ステップS193で、経路応答コマンドRREP_local(承諾)が受信されたか否かを判断する。ステップS193で“NO”であれば、ステップS183に戻ってこの待ち処理を継続する。また、ステップS193で“YES”であれば、またはステップS191を終了すると、この待ち処理を終了する。
図17に戻って、ステップS163で“YES”であれば、つまり、既に別の経路が確保されている場合には、そのままコマンド処理を終了する。また、ステップS169で待ち処理を開始するとこのコマンド処理を終了する。なお、ステップS161で“NO”であれば、処理は図19のステップS201へ進む。
図19のステップS201では、受信コマンドがネットワーク経路応答コマンドRREP_entireであるか否かを判定する。ステップS201で“YES”であれば、ステップS203で、受信したコマンドに含まれる経路データに基づいて、経路データを生成する。つまり、図10(B)に示したように、それまでに生成した経路データ(最初は自分の経路データ)に、ホップ数に関する情報、受信した葉側のポート番号、および受信した葉側の経路データを追加する。これによって、自ノードを根とするツリー構造を示すネットワーク経路データが生成される。
続いて、ステップS205で、全ての葉側ポート30からネットワーク経路応答コマンドRREP_entireを受信したか否かを判断する。葉側ポート30は、経路応答コマンド(承諾)を受けたポート30である。ステップS205で“NO”であれば、そのままこのコマンド処理を終了する。この場合、ネットワーク経路応答待ち処理が継続される。一方、ステップS205で“YES”であれば、ステップS207で、経路確保情報記憶領域46に記憶されたホスト側のポート30へ、ネットワーク経路応答コマンドRREP_entireを送信する。このネットワーク経路応答コマンドによって、メモリ22に生成された経路データをホスト側のノード14に送信する。ステップS207を終了するとこのコマンド処理を終了する。なお、ステップS201で“NO”であれば、処理は図20のステップS221へ進む。
図20のステップS221では、受信したコマンドがエラーコマンドErrorであるか否かを判断し、“YES”であれば、ステップS223で、受信データからエラー番号Enを抽出してエラー番号履歴記憶領域50に記憶する。そして、ステップS225で、エラー番号履歴データに基づいて、送信したことのあるエラーメッセージ(エラー番号En)であるか否かを判断する。ステップS225で“YES”であれば、つまり、一度送信したことのあるエラーメッセージであれば、当該エラーコマンドを送信しない。これによってメッセージのループを防ぐ。一方、ステップS225で“NO”であれば、ステップS227で、残りのポート30に向けて当該エラーコマンドを送信する。ステップS227を終了するとこのコマンド処理を終了する。なお、ステップS221で“NO”であれば、処理は図21のステップS241へ進む。
図21のステップS241では、受信したコマンドが識別番号割当コマンドであるか否かを判断する。ステップS241で“YES”であれば、ステップS243で、その世代番号における識別番号を既に持っているか否かを判断する。ステップS243で“NO”であれば、ステップS245で、受信コマンドに含まれる識別番号をたとえば世代番号に関連付けて識別番号記憶領域48に記憶する。そして、ステップS247で、センサデータの送信処理を開始する。センサデータの送信処理は、後述する図24に示され、コマンド処理等と並列的に実行される。一方、ステップS243で“YES”であれば、ステップS249で全てのポート30に向けて、識別番号割当におけるエラーを示すエラー番号Enを含むエラーコマンドErrorを送信する。ステップS247でセンサデータ送信処理を開始し、またはステップS249を終了すると、このコマンド処理を終了する。なお、ステップS241で“NO”であれば、処理は図22のステップS261へ進む。
図22のステップS261では、受信コマンドがノード中継コマンドRELAY_to_Nodeであるか否かを判断する。ステップS261で“YES”であれば、ステップS263で、当該コマンドに含まれるデータDataがコマンドであるか否かを判断する。ステップS263で“YES”であれば、ステップS265で、指定されたポート番号のポート30へ向けて、当該コマンドを送信する。
一方、ステップS263で“NO”であれば、ステップS267で、指定ポート番号がローカルホストを示すか否かを判断し、“NO”であれば、ステップS269で、指定ポート番号のポート30に向けて、当該データをノード中継コマンドRELAY_to_Nodeで送信する。
また、ステップS267で“YES”であれば、当該データはこのノード14宛のデータであるので、ステップS271で、当該データをメモリ22の所定領域に記憶する。このデータが隣接センサ出力データである場合には、隣接センサ出力記憶領域54に記憶する。ステップS265、S269またはS271を終了すると、このコマンド処理を終了する。なお、ステップS261で“NO”であれば、処理は図23のステップS281へ進む。
図23のステップS281では、受信コマンドがホスト中継コマンドRELAY_to_Hostであるか否かを判断する。ステップS281で“YES”であれば、ステップS283で優先順位判定処理を実行する。この処理によって、優先度の高いセンサデータが受信された場合には、当該データを優先的に送信できるようにバッファの空きを調整する。この優先順位判定処理の動作は後述する図28に示される。そして、ステップS285では、ホスト側のポート30に向けて、ホスト中継コマンドRELAY_to_Hostを用いてデータを送信する。これによって、優先度の高いデータから優先的に送信される。ステップS285を終了するとこのコマンド処理を終了する。
また、ステップS281で“NO”であれば、つまり、受信したコマンドが未定義コマンドである場合には、ステップS287で、未定義コマンドの受信を示すエラー番号Enを含むエラーコマンドErrorを全てのポート30に向けて送信し、このコマンド処理を終了する。
図24には、図21のステップS247で開始されるセンサデータの送信処理の動作の一例が示される。センサデータ送信処理を開始すると、ステップS301で、識別番号記憶領域48のデータを参照して、識別番号を割り当てられているか否かを判断する。ステップS301で“YES”であれば、ステップS303で、センサ出力履歴記憶領域54を参照して、今回のセンサ出力データを取得済みであるか否かを判断する。ステップS303で“NO”であれば、センサ出力が取得されるのを待つ。
ステップS303で“YES”であれば、ステップS305でデータ圧縮処理を実行する。この実施例では、空間方向の圧縮、時間方向の圧縮、ノイズレベルの圧縮の3つの処理が実行される。空間方向のデータ圧縮処理は後述する図25に示される。時間方向のデータ圧縮処理は後述する図26に示される。また、ノイズレベルのデータ圧縮処理は後述する図27に示される。
続いて、ステップS307ではセンサデータの送信が必要であるか否かを判断する。具体的には、データ圧縮処理でマスクしない(つまり、送信が必要)と判断されたセンサデータが存在するか否かを判断する。ステップS307で“YES”であれば、ステップS309で、優先度情報に基づいて、送信データの優先度を設定する。たとえば、優先度情報として痛い感覚を示すデータや撫でられていることを示すデータ等のようにセンサ出力データの値によって決まるデータが設定される場合には、センサ出力データの値に基づいて、優先度が設定される。また、優先度情報として危ないことを示すデータ等のようなセンサ位置もしくはセンサIDによって決まるデータが設定される場合には、送信の必要なセンサ出力データのセンサ位置もしくはセンサIDに基づいて、優先度が設定される。送信するセンサデータには、センサIDだけでなくさらに優先度に関するラベルが付与される。たとえば、痛い感覚を示すラベル、撫でられていることを示すラベル、危ないことを示すラベル、あるいは高優先度を示すラベル等が付与される。
そして、ステップS311で、ホスト側のポート30に向けて、ホスト中継コマンドRELAY_to_Hostによってセンサデータ(触覚情報)を送信する。このホスト中継コマンドで送信するデータにはさらに当該ノード14の識別番号が付与される。ステップS311を終了するとこの送信処理を終了する。一方、ステップS307で“NO”であれば、つまり、このノード14に所属する全てのセンサ16のセンサデータをマスクする場合には、そのままこの送信処理を終了する。また、ステップS301で“NO”である場合もそのままこの送信処理を終了する。
図25には、図24のステップS305の処理のうち空間方向のデータ圧縮処理の動作の一例が示される。まず、データを圧縮しようとする1つのセンサIDを決めて、当該センサデータに対して処理を実行する。ステップS321では、隣接センサ出力データを取得済みであるか否かを判断する。具体的には、隣接センサ位置情報に記憶される他のノード14に所属する隣接センサのセンサ出力データが隣接センサ出力記憶領域56に記憶されているか否かを判断する。ステップS321で“NO”であれば、隣接センサ出力データの取得を待つ。
ステップS321で“YES”であれば、ステップS323で、隣接センサデータからマスク領域を算出する。マスク領域は、たとえば図5に示したように隣接センサデータの値と係数k等に基づいて算出される。そして、ステップS325で、処理対象のセンサのデータの値がマスク領域内であるか否かを判定する。ステップS325で“YES”であれば、ステップS327で当該処理対象のセンサIDのセンサデータを送信しないすなわちマスクすることをメモリ22に記憶する。一方、ステップS325で“NO”であれば、ステップS329で当該センサIDのセンサデータは送信が必要でありマスクしないことをメモリ22に記憶する。メモリ22にはセンサIDごとにマスクするかしなかを示すデータが記憶される。
続いてステップS331で全てのセンサIDについて処理を完了したか否かを判断し、“NO”であれば、ステップS321へ戻って、次のセンサIDのセンサデータに対して処理を実行する。ステップS331で“YES”であれば、この空間方向のデータ圧縮処理を終了する。
図26には、図24のステップS305の処理のうち時間方向のデータ圧縮処理の動作の一例が示される。空間方向の場合と同様に、まず、圧縮処理対象のセンサIDを決定し、当該センサデータに対して処理を実行する。ステップS341では、センサ出力履歴データからマスク領域を算出する。マスク領域は、たとえば図6に示したようにセンサ出力データの履歴と係数ktとに基づいて算出される。そして、ステップS343で、処理対象のデータの値がマスク領域内であるか否かを判定する。ステップS343で“YES”であれば、ステップS345で当該処理対象のセンサIDのセンサデータを送信しないすなわちマスクすることをメモリ22に記憶する。一方、ステップS343で“NO”であれば、ステップS347で当該センサIDのセンサデータは送信が必要でありマスクしないことをメモリ22に記憶する。
続いて、ステップS349で全てのセンサIDについて処理を実行したか否かを判断し、“NO”であれば、ステップS341に戻って、次のセンサIDのセンサデータに対して処理を実行する。ステップS349で“YES”であれば、この時間方向のデータ圧縮処理を終了する。
図27には、図24のステップS305の処理のうちノイズレベルのデータ圧縮処理の動作の一例が示される。まず、ステップS361で、ノイズレベルN(Nt)が設定されているか否かをノイズレベル情報記憶領域60に基づいて判断する。ステップS361で“NO”であれば、そのままこの圧縮処理を終了する。
一方、ステップS361で“YES”であれば、圧縮処理対象のセンサIDを決定し、当該センサデータに対して処理を実行する。具体的には、ステップS363でセンサデータの変化量を算出する。たとえば、図7に示したように、隣接センサi+1と隣接センサi−1の隣接センサ出力データに基づいて、隣接センサに対する当該センサの空間方向の変化量を算出する。また、センサ出力データの履歴から当該センサの時間方向の変化量を算出する。
そして、ステップS365で、それぞれの変化量がそれぞれのノイズレベル以下であるか否かを判定する。ステップS365で“YES”であれば、つまり、空間および時間のいずれか一方で変化量がノイズレベル以下であれば、ステップS367で、当該センサIDのセンサデータを送信しない(マスクする)ことをメモリ22に記憶する。一方、ステップS365で“NO”であれば、当該センサIDのセンサデータは送信が必要である(マスクされない)ことをメモリ22に記憶する。
続いて、ステップS371で、全てのセンサIDについて処理を実行したか否かを判断し、“NO”であれば、ステップS363に戻って、次のセンサIDのセンサデータに対して処理を実行する。ステップS371で“YES”であれば、このノイズレベルのデータ圧縮処理を終了する。
図28には、図23のステップS283の優先順位判定処理の動作の一例が示される。ステップS381で、ホスト中継コマンドで受信したデータは、次に送るデータよりも優先度の高いデータであるか否かを判断する。具体的には、センサデータに高優先度のラベル(たとえば、痛い感覚、危ない等)が付与されているか否かを判断するとともに、次に送ろうとしているデータ、すなわち、ホスト側ポートの送信バッファのデータの優先度に高優先度のラベルが設定されていないかどうかを判断する。あるいは、センサデータを受信するたびに、当該受信したセンサデータの優先度を優先度情報に基づいて判定するようにしてもよい。ステップS381で“NO”であれば、そのままこの優先順位判定処理を終了し、図23のステップS285へ進む。
一方、ステップS381で“YES”であれば、ステップS383で、ホスト側ポート30の転送データバッファ28の送信バッファに、当該ホスト中継コマンドを送信する余裕(記憶領域)が存在するか否かを判断する。ステップS383で“NO”であれば、ステップS385で、既に書き込まれている低優先度のデータを送信バッファからメモリ22へ戻す。また、ステップS383で“YES”であれば、そのままステップS387へ進む。そして、ステップS387で、ホスト側ポートの送信バッファを、当該高優先度のホスト中継コマンドの送信に必要なデータ分だけ空ける。ステップS387を終了すると、処理は図23のステップS285へ進む。こうして、当該高優先度のセンサデータが先に送信されることとなる。したがって、ホストコンピュータ12は、高優先度の触覚情報を先に受信することができ、たとえば緊急を要する触覚情報を逸早く認識して素早く対応することが可能になる。
経路確保する際のノード14間通信の処理の流れを図29および図30に示す。図29には、たとえばノード1がノード2との経路確保に成功する場合のタイムチャートが示される。
ノード1は、ステップS167で経路要求コマンドRREQをノード2に送信し、ステップS169で経路応答待ち処理を開始する。
ノード2は、ノード1からのコマンドを受信して、ステップS73で経路要求コマンドRREQを受信したと判断し、ステップS75で世代番号Gnおよびホップ番号Hnを取得する。続くステップS77で、ノード2は世代番号Gnが同じでないことを確認し、ステップS79でホスト側の経路確保を行い、ステップS81で受信した世代番号Gnを記憶する。つまり、ノード2は当該世代番号Gnを含む経路要求コマンドRREQを初めて受信したので、その送信元であるノード1にホスト側経路を確保する。そして、ステップS83で、ノード2は経路応答コマンドRREP_local(承諾)をノード1に送信し、ステップS85で経路確保確認コマンドCONFIRM_RREP待ち処理を開始する。
ノード1は、ノード2からのコマンドを受信して、ステップS121で経路応答コマンドRREP_localを受信したと判断し、さらにステップS123で承諾を確認する。そして、ステップS125で経路確保確認コマンドCONFIRM_RREPをノード2に送信し、ステップS127でネットワーク経路応答待ち処理を開始する。
ノード2は、ノード1からのコマンドを受信して、ステップS161で経路確保確認コマンドCONFIRM_RREPを受信したと判断し、ステップS163で未だ経路が確保されていないことを確認する。そして、ステップS165でホップ番号Hnを更新し、ステップS167で経路要求コマンドRREQをノード1の接続されたポートを除く全てのポート(図29の例ではノード3に接続されるポートのみ)に送信し、ステップS169で経路応答待ち処理を開始する。以降のノード2とノード3との間の通信は、経路確保に成功する場合には、図29のノード1とノード2との間の通信と同様に進むこととなる。
一方、図30には、たとえばノード1がノード2との経路確保に失敗する場合のタイムチャートが示される。ノード1は、ステップS167で経路要求コマンドRREQをノード2に送信し、ステップS169で経路応答待ち処理を開始する。
ノード2は、ノード1からのコマンドを受信して、ステップS73で経路要求コマンドRREQを受信したと判断し、ステップS75で世代番号Gnおよびホップ番号Hnを取得する。続くステップS77で、ノード2は世代番号Gnが同じであることを確認する。つまり、ノード2は当該世代番号Gnを含む経路要求コマンドRREQを既に他のノードから受信しているので、ノード1の経路要求を拒否する。したがって、ノード2は、ステップS87で、経路応答コマンドRREP_local(拒否)をノード1に送信する。
ノード1は、ノード2からのコマンドを受信して、ステップS121で経路応答コマンドRREP_localを受信したと判断する。さらにステップS123で拒否を確認して、ステップS131でノード2の接続されたポートから経路応答コマンド(拒否)を受信したことを記憶する。
この後、ノード1が、経路応答コマンド(承諾)を受信することなくタイムアウトになった場合、あるいは経路要求を送信した全てのポート30から経路応答コマンド(拒否)を受信した場合には、図18に示したように、ノード1は、自分がネットワークの端末になると判定し、自分の経路データを生成して、ネットワーク経路応答コマンドをホスト側経路であるホスト側のポート30に向けて送信する。したがって、このノード1の経路上のホスト側に位置するノードは、図19に示したように、ネットワーク経路応答コマンドを受信して、受信した経路データと自分の経路データとを結合してネットワーク経路データを生成する。そして、当該ノードは、経路応答の承諾を受けた全てのポート30からネットワーク経路応答コマンドを受け取ったと判定される場合には、生成したネットワーク経路データをホスト側のポート30に向けて送信する。このようにして、ホストコンピュータ12にネットワーク全体の経路を示す経路データが送信されることとなる。
この実施例によれば、ノード14間の相互接続による通信によって、自己組織化可能で頑丈かつ簡単な情報伝達経路を構築することができる。そして、ノード14の境界で隣接する触覚センサ16の出力をノード14間で相互に通信し、各ノード14において触覚センサ出力データの空間方向圧縮、時間方向圧縮、あるいはノイズレベル圧縮などを行うことができるので、ホストコンピュータ12に転送するセンサデータ量を減少させることができる。したがって、転送のボトルネックが発生するのを回避することができるとともに、ホストコンピュータ12での情報処理の負荷を軽減することができる。
発明者等は上述の実施例のセンサネットワーク10におけるデータ圧縮方法の有効性を検証した。その実験では、複数の触覚センサ16は図31に示すように配置された。各触覚センサエレメント(PVDF)16は、30mm×30mmの大きさを有し、約5mm間隔程度で1mmのウレタンスポンジ上に並べられ、厚さ1mmのシリコンシートで覆われている。センサデータはノードからPCに読み込まれた。サンプリングは100Hzで行い、測定レンジは−512から512であり0は基準点である。
センサデバイスの中央を「手の平で1から2秒間隔で軽く押さえた」場合と、「腕で1から2秒間隔で軽く押さえた」場合の2つの触り方で得られたセンサデータについて、上述の空間方向の圧縮方法を適用した結果が図32および図33にそれぞれ示される。図31のセンサ_7のセンサデータについての結果を示していて、各図の(A)は圧縮前の反応(生データ)であり、(B)は圧縮法の適応結果である。横軸は時間、縦軸はセンサ反応値である。マスク範囲を決めるパラメータkの値は1に設定され、ノイズレベルNの値は4に設定された。約10秒間のデータで圧縮率(元のデータに対するマスクされたデータの割合)は、図32に示す手の平の場合で91.5%となり、図33に示す腕の場合で83.4%となった。このように、センサ出力の8〜9割が圧縮されるのは、周囲のセンサ16が同等のセンサ値を出力しているからである。全体としてホストコンピュータ12に送信される情報は、触覚出力の変化領域の輪郭ということになる。
また、図示は省略するが、上述の時間方向の外挿による圧縮方法を同じデータに適応したところ、圧縮率は10〜40%となった。この1次線形外挿による圧縮はノイズ低減に効果的である。
なお、上述の実施例では、ホストコンピュータ12が各ノード14に識別番号を送信したことに応じて各ノード14は触覚情報をホスト中継コマンドを用いてホスト宛に送信するようにしていた。しかし、他の実施例では、ネットワーク経路応答コマンドを用いて、経路データとともにセンサデータを送信するようにしてもよい。つまり、図10(A)に示したように、自分の経路データは、任意のデータを登録できるanything領域を含むので、各ノード14は、このanything領域に、マスクしない触覚情報を書き込んだ経路データを生成して、当該データをネットワーク経路応答コマンドで送信するようにしてよい。
この他の実施例では、ホストコンピュータ12の送信する経路確保確認コマンドが触覚情報送信要求を兼ねることとなり、ホストコンピュータ12は、図11のステップS11でネットワーク経路応答コマンドを受信することによって、ステップS13で経路データとともに触覚情報を取得することができる。
また、各ノード14は、たとえば図15のステップS129または図18のステップS189で自分の経路データを生成する際に、図24のステップS303の判定、ステップS305のデータ圧縮処理およびステップS307の判定を実行して、マスクしない触覚情報を自分の経路データのanything領域に登録する。そして、図18のステップS191または図19のステップS207で、ネットワーク経路応答コマンドを用いて、触覚情報を含む経路データを送信する。
また、上述の各実施例では、ホスト宛に送信される触覚情報はセンサ出力値であったが、センサ出力値に基づくラベルデータのみを触覚情報として送信してもよい。たとえば、各ノード14は、上述の優先度の設定(ステップS309)と同様にして、メモリ22に記憶されたセンサ出力値(またはセンサ出力値の経時変化)とラベルとを関連付けたテーブルデータに基づいて、センサ出力データに対して、痛い感覚を示すデータ、撫でられていることを示すデータ、あるいは叩かれていることを示すデータといったラベリングを行う。そして、ノード14は触覚情報としてそのラベルデータのみを送信する。ホストコンピュータ12は触覚情報をラベルデータで記憶する。