以下、図面を参照しながら本明細書で開示する技術の実施形態について詳細に説明する。
図1には、制御プログラムの開発環境の一例を模式的に示している。開発環境下には、制御プログラムによる制御対象となる自律動作装置(実機)100と、この自律動作装置100における制御プログラムを作成する開発装置200が配置されている。
ここで、自律動作装置100は、自律的若しくは適応制御により自らの行動を制御する装置であり、ロボット、無人航空機、自律運転する自動車などさまざまな形態を含むものとする。
自律動作装置100は、当該システム100全体の動作を統括的にコントロールする本体部110と、複数のモジュール部120-1、120-2などで構成される。図1では簡素化のため、3つのモジュール部しか描いていないが、4以上のモジュール部で構成される自律動作装置や、2以下のモジュール部しか備えていない自律動作装置も想定される。
1つのモジュール部120は、アクチュエータ121と、プロセッサ122と、メモリ123と、センサ124と、通信モデム125を含んでいる。なお、簡素化のため図示を省略しているが、モジュール部120内の各部121~125は、内部バスにより相互接続されているものとする。
アクチュエータ121は、例えば、関節を回転駆動するためのモータや、スピーカ用のドライバなどである。センサ124は、関節回転角度や角速度、スピーカの音量などのアクチュエータの出力状態を検出するセンサや、外力やその他の外部環境を検出するセンサなどである。
プロセッサ122は、アクチュエータ121の駆動制御(モータ・コントローラ)やセンサ124からの検出信号の認識処理を始めとするモジュール部122内の動作を制御する。メモリ123は、アクチュエータの制御情報やセンサの検出値などを格納するためにプロセッサ122が使用する。
通信モデム125は、当該モジュール部120と本体部110、又は当該モジュール部120と他のモジュール部の間で相互通信を行なうためのハードウェアであり、無線モデム又は有線モデムのいずれでもよい。例えばプロセッサ122は、通信モデム125を介して、本体部110からアクチュエータ121の駆動などの命令信号を受信したり、センサ124による検出データを本体部110に送信したりする。また、モジュール部120は、通信モデム125を介して、開発装置200などの外部装置とも通信を行なうことができる。
本体部110は、プロセッサ111と、メモリ112と、通信モデム113と、バッテリー114と、USB(Universal Serial Bus)ポート115と、GPS(Global Positioning System)116を含んでいる。なお、簡素化のため図示を省略しているが、本体部110内の各部111~116は、内部バスにより相互接続されているものとする。
プロセッサ111は、メモリ112に格納されているプログラムに従って、自律動作装置100全体の動作を統括的にコントロールする。また、バッテリー114は、自律動作装置100の駆動電源であり、本体部110並びに各モジュール部120に電源を供給する。
通信モデム113は、本体部120と各モジュール部120の間で相互通信を行なうためのハードウェアであり、無線モデム又は有線モデムのいずれでもよい。例えばプロセッサ111は、通信モデム113を介して、各モジュール部120に対してアクチュエータ121の駆動などの命令信号を送信したり、各モジュール部120内でのセンサ122の検出値に基づく認識結果を受信したりする。また、本体部110は、通信モデム113を介して、開発装置200などの外部装置とも通信を行なうことができる。
USBポート115は、USBバス(ケーブル)を使って本体部110に外部機器を接続するために使用される。本実施形態では、USBポート115を使って本体部110に開発装置200を接続することを想定している。例えば、開発装置200上で作成した制御プログラムを、USBポート115を介して自律動作装置100にインストールすることができる。なお、USBは自律動作装置100に外部装置を接続するインターフェース規格の一例であり、他のインターフェース規格に則って外部装置を接続するように構成することもできる。
なお、図示を省略したが、本体部110と各モジュール部120などのハードウェア間を結合するデータ・バス並びに制御バスが存在する。
開発装置200は、例えばパーソナル・コンピュータで構成され、コンピュータ本体部210と、液晶パネルなどのディスプレイ220と、マウスやキーボードなどからなるユーザ・インターフェース(UI)部230を備えている。また、コンピュータ本体部210は、プロセッサ211、GPU(Graphic Processing Unit)212と、メモリ213と、USBポート214と、通信モデム215を備えている。但し、GPU212の機能がプロセッサ211内に含まれている構成例も考え得る。また、コンピュータ本体部210は、図示した以外のハードウェア構成要素を備えており、各部はバスにより相互接続されている。
開発装置200上では、OSが動作している。プロセッサ211は、所望のアプリケーション・プログラムをメモリ212にロードして、OSによって提供される実行環境下でアプリケーション・プログラムを実行することができる。
本実施形態では、アプリケーション・プログラムの1つとして、自律動作装置100の制御用プログラムを作成するための開発ツール・プログラムを想定している。この開発ツール・プログラムは、当該プログラムの実行に必要なデータとともに開発装置200のメモリ213上に展開されている。
開発ツール・プログラムは、ディスプレイ220の画面にプログラム開発用のGUI(Graphical User Interface)を提示する。プログラムの開発者は、このGUI画面の内容を確認しながら、ユーザ・インターフェース230を介してデータやプログラムの入力を行なうことができる。また、開発ツール・プログラムは、作成した制御プログラムに関するコンパイラ、デバッガ、シミュレーション、3Dグラフィックス・アニメーションを用いた制御プログラムの動作確認のための機能などを備えているが、開発者はGUI画面上でこれらの機能の実行指示を行なうことができる。
開発ツール・プログラムを用いて作成される制御プログラムは、自律動作装置100の実機上の本体部110のプロセッサ111上で実行されるコントロール・プログラム並びにコントロール・プログラムが使用するパラメータなどのデータと、各モジュール部120のプロセッサ122においてアクチュエータ121の駆動を制御するためのコントロール・プログラム並びにコントロール・プログラムが使用するパラメータなどのデータで構成される。本明細書ではプログラム部分とデータを併せて「制御(コントロール)プログラム」と呼ぶこともある。
開発ツール・プログラムを使って作成された制御プログラムは、メモリ213に格納される。また、メモリ213上の制御プログラムを、USBポート214を介して自律動作装置100側に転送することができる。あるいは、メモリ213上の制御プログラムを、通信モデム215を介して自律動作装置100内のモジュール部120に転送することができる。
また、開発装置200上で開発ツール・プログラムを使って作成された制御プログラムを、3Dグラフィックス・アニメーションを用いた開発ツール・プログラムやデータ(以下、開発ツール用のプログラムとデータを併せて「開発ツール・プログラム」とも呼ぶ)を利用して、動作の検証や、制御用のデータやプログラムの修正を行なうことができる。一般に、この種の開発ツール・プログラムは、制御プログラムに従って自律動作装置100の実機動作の3Dグラフィックス・アニメーションを生成する機能を備えており、開発者はディスプレイ220に表示される3Dグラフィックス・アニメーションを利用して、自身が開発した制御プログラムの動作の検証や、データやプログラムの修正を並行して行なうことができる。
本実施形態では、開発ツール・プログラムが物理エンジンと呼ばれる機能を備えていることを想定している。物理エンジンは、現実の自律動作装置100の動作を物理法則に基づいて物理現象を演算する機能を持つコンピュータ・プログラムであり、自律動作装置100が持つ物理的な特性やさらには現実的な外部環境を考慮することによって、現実と同様の動作を生成して、その結果をディスプレイ220上に表示する。自律動作装置100の実機に対し、実機のモータなどの代わりに物理エンジンを使って3Dグラフィックス・アニメーション空間中で動作する仮想的な自律動作装置100のことを仮想機械(3Dグラフィックス・アニメーション用のデータを含むコンピュータ・プログラム及びデータ)とも呼ぶ。
例えば、自律動作装置100がロボットであれば、物理エンジンは、ロボットのアームの各リンクや関節の重量やモーメント、関節駆動用のアクチュエータの特性を考慮しつつ、ロボットを模して造られた仮想機械の制御プログラムの動作において、開発ツール・プログラム上で表現された仮想的な物理環境と仮想機械との物理作用(地面との接地や障害物との衝突など)を物理法則に基づいて計算することによって、あたかもロボットのアクチュエータが実際に駆動しているかのように、仮想機械全体の動作を計算し、ロボットの現実的な動作を仮想機械によって再現した3Dグラフィックス・アニメーションをディスプレイ220上に表示する。
仮想機械は、物理エンジンと3Dグラフィックス・アニメーションを含む開発ツール・プログラム上で動作するようにされた制御プログラム及びデータであり、メモリ213に格納されている。望ましくは、実機100の各モジュール部120のプロセッサ122で動作する単位で、制御プログラム及びデータがモジュール化されている。仮想機械をあたかも実機のように3Dグラフィックス空間上で動作させるために、仮想機械の制御プログラムは、実機100のプロセッサ(例えば、モータ・コントローラ)122の動作に相当する機能を、プログラムの一部として実現する。また、この仮想機械の制御プログラムは、実機100のモジュール部120毎のアクチュエータ121(例えば、モータ)に相当する動作を3Dグラフィックス・アニメーションで再現する物理エンジン機能を、API(Application Programming Interface)あるいは関数を使って呼び出すようにプログラムされている。さらに物理エンジンにおいて物理計算の際に使用されるデータ(アクチュエータに設定される制御パラメータや、リンクの重量、イナーシャなど)は、制御プログラムとともにメモリ213中に格納されており、制御プログラムの実行に伴って、メモリ213から読み出され、制御プログラム中で利用される。
また、物理エンジン機能を実現するためのプログラム・モジュールに対して指示を出すためのAPIあるいは関数を、実機すなわち自律動作装置100側で動作している基本OSが提供するものと同じものとすることにより、開発ツール・プログラムで作成したプログラムを、そのまま実機上のOSで動作させることができる。さらに、物理エンジン機能によって実際の物理現象を再現することができるので、開発ツール・プログラムを用いて開発したプログラムを、そのままUSBポート214などを介して自律動作装置100にアップロードして実行させることにより、開発ツール・プログラムで確認した動作を実機上でも実現することができる。
また、開発ツール・プログラムを使って、モジュール部単位に分割して自律動作装置100の制御プログラムを開発することもできる。この場合も同様に、モジュール部120単位で制御プログラムを自律動作装置100にアップロードすることができる。例えば、モジュール部120-1のみハードウェア及び制御プログラムの開発を担当している開発者は、自分の開発装置200を通信モデム215経由で自律動作装置100の対応するモジュール部120-1に接続して、作成したプログラムやデータをモジュール部120-1内のメモリ123にアップロードすることもできる。
モジュール部120単位でハードウェア及びプログラムの開発を複数の開発者又は複数の開発ベンダーで分担することで、分散開発環境下で自律動作装置100全体の開発を進めることができる。
図2には、ネットワークを介した制御プログラムの分散開発環境を例示している。図2に示す分散開発環境下では、モジュール毎に個別の開発者又は開発ベンダーに開発が委ねられている。但し、図2で言うモジュールは、図1に示した自律動作装置100のハードウェア構成要素であるモジュール部120の他に、自律動作装置100の制御ソフトウェアのモジュールを指す場合もある。
自律動作装置100の本体部又はモジュール部単位で制御プログラムの開発を任された各プログラム開発者は、それぞれモジュール開発用コンピュータを用いて、自分が担当する本体部110又はモジュール部120の制御プログラムを作成する。モジュール開発用コンピュータ上では、例えば上述した開発ツール・プログラムが動作している。各モジュール開発用コンピュータは、ネットワークに接続されている。そして、各プログラム開発者は、それぞれクラウド・サーバ上の共有ストレージ、自分専用のストレージ(すなわち、本体部開発者ストレージ、モジュール部開発者ストレージ)、あるいは専用サーバが備えるストレージにおいて、自己が開発した制御プログラムなどを提供してもよい。また、サーバなどのストレージにアカウントを有する管理者、開発者、顧客、あるいはユーザによって制御プログラムなどが共有されるようにしてもよい。
自律動作装置100の実機全体の制御プログラム開発を担当若しくは統括する開発者は、ネットワーク経由で本体部110及び各モジュール部120の制御プログラムの提供を受ける。具体的には、実機全体の開発者が使用する実機プログラム開発用コンピュータは、クラウド・サーバ上の共有ストレージ又は開発者ストレージ、専用サーバ、あるいは各開発者のモジュール開発用コンピュータとの直接通信によって、各々の制御プログラムを受信する。但し、制御プログラムの提供を受けるネットワークは、有線又は無線のいずれで構成されていてもよい。
実機全体の開発者が使用する実機プログラム開発用コンピュータは、図1に示した開発装置200に相当し、開発ツール・プログラム上で物理エンジンを用いた演算を行ない、且つ、3Dグラフィックス・アニメーションにより実機に相当する仮想機械の動作を表示できる機能を備えている。したがって、実機プログラム開発用コンピュータは、本体部110及びすべてのモジュール部120の制御プログラムを、開発ツール・プログラムが備える物理エンジン機能を利用して、仮想機械の3Dグラフィックス・アニメーションの表示などを通じて動作の確認・検証を行なうことができる。
さらに、実機プログラム開発用コンピュータ上では、開発された制御プログラムの実行と並行して、各々の制御プログラムの修正を行なうことができる。したがって、実機100全体の開発者と各モジュール部120を担当する開発者とで、実機100体の制御プログラムを効率的に共同開発することにもなる。また、実機プログラム開発用コンピュータ上で修正した制御プログラムを、そのモジュール部を担当する開発者に再度提供して、最終的なプログラム製品を完成してもらうことが可能である。例えばクラウド・サーバ上に本体部110並びに各モジュール部120専用のストレージを配置するなどモジュール部120単位で制御プログラムを管理するようにすることで、共同開発を円滑に進めることができる。
実機100全体の開発者が使用する実機プログラム開発用コンピュータ上で動作が確認・検証された(すなわち、完成した)制御プログラムは、USBポート214を介して開発装置200から実機の自律動作装置100に直接アップロードすることができる。あるいは、有線又は無線で構成されるネットワーク経由で、実機100全体又はモジュール部120毎の制御プログラムを実機100にアップロードすることもできる。
また、制御プログラムを専用サーバから実機100へアップロードするという形態も想定される。例えば、ある実機100のユーザが自分のユーザ端末のユーザ・インターフェース(キーボード、マウス、タッチパネルなど)を介して自分が持つアカウントを用いて専用サーバにログインして、さらに実機100にダウンロード又はアップロードする制御プログラムを選択して、ダウンロード又はアップロードを実施するようにしてもよい。
図3には、自律動作装置100の具体例として脚式のロボットを開発対象とする場合の制御プログラムの開発環境を例示している。図3では、単一の開発装置200を用いてプログラム開発が行なわれるが、勿論、図2に示したようなネットワークを介した分散開発環境を利用することも可能である。
脚式ロボット100は、本体部110と、頭部や左右の脚部に相当するモジュール部120を有している。図示を省略するが、本体部110と、頭部や左右の脚部などの各モジュール部120などのハードウェア間を結合するデータ・バス並びに制御バスが存在する。
なお、脚式ロボット100は、上肢など図示しないモジュール部をさらに有していてもよい。また、少なくとも一部のモジュール部内のプロセッサやメモリなど機能が本体部と一体となって、本体部のプロセッサによってコントロールされるという実機構成の変形例も考えられる。
本体部は、プロセッサと、メモリと、無線又は有線の通信モデムと、バッテリーと、USBポートと、GPSを備えている。
左右の脚のモジュール部120-2及び120-3は、アクチュエータとして、股関節や膝関節、足首などの関節駆動用(若しくは、歩行用)のモータ121を備え、プロセッサとしてモータの駆動を制御するモータ・コントローラ122を備えている。また、センサ124として、モータの出力側に発生する外力を検知するトルク・センサや、モータの出力側の回転角度を検出するエンコーダー、足裏部の接地センサなどを備えている。また、頭部のモジュール部120-1は、アクチュエータとしての頭部回転用のモータ121と、センサとしての周囲を撮像するイメージ・センサ124を備えている。
図1と同様に、開発装置200上で動作する開発ツール・プログラムを用いて、上記の脚式ロボット100の本体部110並びに各モジュール部120の制御プログラムを作成し、さらに開発ツール・プログラム上で動作する物理エンジンの演算を利用し、仮想機械の3Dグラフィックス・アニメーションの表示などを通じて動作の確認・検証を行なうことができる。
また、開発装置200を用いて作成された制御プログラム、あるいは図2に示したような開発環境(あるいはその他の開発環境)において開発された実機100全体の制御プログラムやモジュール部120毎の制御プログラムは、本体部110のUSBポート115や各モジュール部120の通信モデム125を介した有線又は無線の通信によって、本体部110のメモリ112又は各モジュール部120のメモリ123にアップロードされる。そして、アップロードされたプログラムは、脚式ロボット100の起動時などに適宜動作するようになっている。
図4には、自律動作装置100の他の具体例として自動走行車を開発対象とする場合の制御プログラムの開発環境を例示している。自動走行車100は、自動運転技術が導入された自動車(あるいは、作業用又は輸送用などの無人運転車両)のことであるが、完全自動運転車の他、自動運転モードと手動運転モードを切り替え可能な自動車における自動運転モードで走行中の自動車も含むものとする。図4では、単一の開発装置200を用いてプログラム開発が行なわれるが、勿論、図2に示したようなネットワークを介した分散開発環境を利用することも可能である。
図4に示す自動走行車100は、主制御部110と、モジュール部としてのトランスミッション制御モジュール部120-2並びに室内空調制御モジュール部120-1を有している。図示を省略するが、主制御部110と各モジュール部120などのハードウェア間を結合するデータ・バス並びに制御バス(CANバスなど)が存在する。また、自動走行車100は、通常、トランスミッション制御モジュール部120-2、室内空調制御モジュール部120-1以外にも図示しない多くのモジュール部を備えているが、説明の簡素化のため省略する。
主制御部110は、プロセッサとしてのECU(Electronic Control Unit:電子制御装置)111と、メモリ112と、通信モデム113と、ECUインターフェース115と、GPS116と、バッテリー114を備えている。通信モデム113は、Wi-Fi(Wireless Fidelity)、LTE(Long Term Evolution)、近距離無線通信などを想定している。また、ECUインターフェース115は、CAN(Controller Area Network)バス(図示しない)へのインターフェースを想定しており、開発装置200側とはイーサネット(登録商標)などの通信規格を利用して接続される。
室内空調モジュール部120-1は、アクチュエータとしての空調121と、プロセッサとしての空調制御ECU122と、メモリ123と、センサとしての室内温度センサ124と、Bluetooth(登録商標)通信などの通信モデム125を備えている。例えば搭乗者が携帯するスマートフォンなどの情報端末(図示しない)とBluetooth(登録商標)通信により接続して、空調を制御することを想定している。
トランスミッション制御モジュール部120-2は、アクチュエータとしての駆動輪用モータ121と、プロセッサとしてのトランスミッション制御ECU122と、メモリ123と、センサとして速度・加速度センサ124や操舵角センサなどを備えている。
なお、図4に示した構成例では、主制御部110並びに各モジュール部120にECUが配置されているが、主制御部110内のECU111ですべてのモジュール部120を集中管理するように構成することも可能である。
図1と同様に、開発装置200上で動作する開発ツール・プログラムを用いて、上記の自動走行車100の主制御部110、室内空調制御モジュール部120-1、並びにトランスミッション制御モジュール部120-2の制御プログラムを作成し、さらに開発ツール・プログラム上で動作する物理エンジン機能を利用し、仮想機械の3Dグラフィックス・アニメーションの表示などを通じて動作の確認・検証を行なうことができる。
また、開発装置200を用いて作成された制御プログラム、あるいは図2に示したような開発環境(あるいはその他の開発環境)において開発された実機100全体の制御プログラムやモジュール部120毎の制御プログラムは、主制御部110のECUインターフェース115や各モジュール部120の通信モデムを介した有線又は無線の通信によって、主制御部110のメモリ112又は各モジュール部120のメモリ123にアップロードされる。そして、アップロードされたプログラムは、自動走行車100の起動時などに適宜動作するようになっている。
図5には、自律動作装置100の他の具体例として無人航空機(ドローン)を開発対象とする場合の制御プログラムの開発環境を例示している。図5では、単一の開発装置を用いてプログラム開発が行なわれるが、勿論、図2に示したようなネットワークを介した分散開発環境を利用することも可能である。
図5に示す無人航空機100は、主制御部110と、モジュール部としてのカメラ制御モジュール部120-1並びにプロペラ制御モジュール部120-2を有している。図示を省略するが、主制御部110と各モジュール部120などのハードウェア間を結合するデータ・バス並びに制御バスが存在する。また、無線航空機100には、カメラ制御モジュール部120-1並びにプロペラ制御モジュール部120-2以外のモジュール部が組み込まれていてもよい。
主制御部110は、プロセッサ111と、メモリ112と、通信モデム113と、USBポート115と、GPS116と、バッテリー114を備えている。通信モデム113は、Wi-Fi、LTE、近距離無線通信などの無線モデムを想定しており、操縦者が操作するリモート・コントローラ(図示しない)と通信を行なうようになっている。また、開発装置200側とはUSBポート115を利用して接続され、開発された制御プログラムのアップロードが行なわれる。
カメラ制御モジュール部120-1は、センサとしてのカメラ部(イメージ・センサを含む)124と、アクチュエータとしてのカメラ部回転用モータ121と、プロセッサとしてのモータ・コントローラ122と、メモリ123と、通信モデム125を備えている。カメラ部回転用モータ121は、例えば水平方向に360度の範囲で回転が可能であり、さらにチルト回転が可能であってもよい。また、通信モデム125は、Wi-Fi、LTE、近距離無線通信などの無線モデムを想定しており、操縦者が操作するリモート・コントローラやスマートフォン(図示しない)からのコマンドに従ってカメラ部124の回転や撮影を行なう。
プロペラ制御モジュール部120-2は、アクチュエータとして例えば3つのプロペラ(回転用モータを含む)121と、プロペラ121の回転用モータの制御などを行なうプロセッサ122と、メモリ123と、センサとしてのプロペラ回転検出センサ124を備えている。
図1と同様に、開発装置200上で動作する開発ツール・プログラムを用いて、上記の無人航空機100の主制御部110、カメラ制御モジュール部120-1、並びにプロペラ制御モジュール部120-2の制御プログラムを作成し、さらに開発ツール・プログラム上で動作する物理エンジン機能を利用し、仮想機械の3Dグラフィックス・アニメーションの表示などを通じて動作の確認・検証を行なうことができる。
また、開発装置200を用いて作成された制御プログラム、あるいは図2に示したような開発環境(あるいはその他の開発環境)において開発された実機100全体の制御プログラムやモジュール部120毎の制御プログラムは、主制御部110や各モジュール部120の通信モデムを介した有線又は無線の通信によって、主制御部110のメモリ112又は各モジュール部120のメモリ123にアップロードされる。そして、アップロードされたプログラムは、無人航空機100の起動時などに適宜動作するようになっている。
図6には、自律動作装置100の実機に搭載されるハードウェア並びにソフトウェアのアーキテクチャーの構成例を示している。
最下層のハードウェアは、実機100の筐体内に組み込まれている、本体部(若しくは主制御部110と複数のモジュール部120などの複数のハードウェア・モジュールからなる。また、各ハードウェア・モジュールを2以上の筐体に分散して配置して構成される実機も存在し得る。
OSは、各ハードウェア・モジュールを直接的に制御する。なお、OSではなく、モジュール部120内のメモリ123にアップロードされた制御プログラムがハードウェア・モジュールを直接的に制御する場合もある(具体的には、プロセッサ122が制御プログラムを実行して、アクチュエータ121の駆動を制御する)。
図1などに示したように、本体部110と複数のモジュール部120でハードウェア・アーキテクチャーが構成される自律動作装置100においては、本体部110(のプロセッサ111)において当該システム100全体を制御するメインのOSが動作して、各モジュール部120内で実行中の制御プログラムを直接的又は間接的に制御するように構成される。
アプリケーション・プログラムの開発者は、システム(例えば、ミドルウェア)が提供するAPIを用いてアプリケーション・プログラムを開発することができる。また、アプリケーション・プログラムの開発者は、システム・コールを利用してOSに対して指示を行なうようなプログラムを含めてアプリケーション・プログラムを開発することができる。ここで言うシステム・コールは、システム制御に関わる機能を利用するためのインターフェースである。システム・コールの例として、モジュール部内のプロセッサ(例えば、モータ・コントローラ)のパラメータを変更する、通信モデムにおけるネットワーク・アドレスの設定を行なう、といったものを挙げることができる。
ロボットや自動走行車、無人航空機といった自律動作装置100上では「認識」、「状況理解」、「行動計画」、「行動制御」に分類される多数のアプリケーション・プログラムが動作することが想定される。
「認識」アプリケーション・プログラムは、ハードウェア層に含まれるカメラやその他のセンサで取得されるセンサ情報を認識処理するアプリケーション・プログラムである。「状況理解」アプリケーション・プログラムは、「認識」アプリケーション・プログラムによる認識結果に基づいて実機が現在置かれている状況を理解するアプリケーション・プログラムである。例えば、カメラで撮像した画像を分析する画像分析アプリケーション・プログラムは、「状況理解」アプリケーション・プログラムの一例である。なお、OSが提供する実行環境下で動作するアプリケーション・プログラムは「プロセス」(あるいは「スレッド」)としてメモリ上で管理され、プロセッサ(CPUなど)において実行される。
「行動計画」アプリケーション・プログラムは、「状況理解」アプリケーション・プログラムによって理解される、実機が現在置かれている状況に応じて、実機の行動を計画するアプリケーション・プログラムである。例えば、上記の画像分析アプリケーション・プログラムにより実機の周囲画像を分析した結果に応じて実機の移動経路を選択する経路選択アプリケーション・プログラムは、「行動計画」アプリケーション・プログラムの一例である。
また、「行動制御」アプリケーション・プログラムは、「行動計画」アプリケーション・プログラムによって立案された行動計画を実現するための、ハードウェアの行動若しくは動作をコントロールするアプリケーション・プログラムである。例えば、経路選択アプリケーション・プログラムによって逐次選択される経路に従って、実機の進行方向や進行速度をコントロールするアプリケーション・プログラムや、進行方向や進行速度に応じて、ロボットの脚部や自動走行車の駆動輪、ドローンのプロペラの駆動をコントロールするアプリケーション・プログラムなどが「行動制御」アプリケーション・プログラムに相当する。
ロボットや自動走行車、無人航空機といった自律動作装置100上で行動又は動作を実現する際には、「認識」、「状況理解」、「行動計画」、「行動制御」に分類されるアプリケーション・プログラム間、若しくはプロセス間でデータ通信を行なう必要がある。
他方、自律動作装置100上で動作する多数のアプリケーション・プログラムを、装置の開発者、又はその開発者から委託を受けた単一のソフトウェア・ベンダーがすべて開発するのは困難であり、少なくとも一部のアプリケーション・プログラムは第三者からの提供を受けるというのが現実的である。また、図2に示したような分散開発環境下で、これら多数のアプリケーション・プログラムが開発されることが想定される。例えば、自動走行車において開発されるアプリケーション・プログラムを、駆動系制御(DSUなど)のように高い信頼性が要求されるアプリケーション・プログラムと、ユーザに対するサービスに関わるインフォテインメント(オーディオ機器、インターネット接続サービスなど)や車内環境制御(空調制御など)のようにユーザの利便性のために提供される汎用性の高いアプリケーション・プログラムの2種類に大別すると、前者のアプリケーション・プログラムを自社開発する一方、後者のアプリケーション・プログラムは第三者から提供を受けるようにすることができる。
ところが、「認識」、「状況理解」、「行動計画」、「行動制御」という一連のフローの中で、第三者から提供されたアプリケーション・プログラムが、第三者の故意又は過失により誤ったデータを出力すると、システム全体で障害を発生することが懸念される。
そこで、本明細書では、パブリッシャ/サブスクライバ型の非同期通信モデルを用いたシステムにおいて、コンテナと称されるグルーピング方法を導入して、コンテナに所属する構成ユニット(アプリケーション・プログラムなど)又は構成ユニットに含まれるソフトウェアの所属するコンテナ内に通信を制限する技術について、以下で提案する。この技術によれば、構成ユニット開発における独立性を維持しつつ、構成ユニット又は構成ユニットに含まれるソフトウェアの任意のグルーピングが可能である。
また、本明細書では、同一のソースからの情報に対し、構成ユニット毎に割り当てる特性に応じた加工(例えば、構成ユニットのセキュリティ・レベルに合わせて情報を劣化する)を施した上で送信する技術についても、以下で併せて提案する。
また、本明細書では、更新・追加された構成ユニットに含まれるソフトウェアがシステム動作中に誤作動を起こした場合には、その誤作動を検出し、システム動作を継続させながら、誤作動を起こしたソフトウェアを更新・追加する前に動作が保証されていたソフトウェアの動作に切り替える技術についても、以下で併せて提案する。
また、本明細書では、更新中の構成ユニットに関連する送受信データを一時保存し、更新後に一時保存した送受信データから接続を再開することで、構成ユニットや構成ユニットに含まれるソフトウェアを安全に更新・追加する技術についても、以下で併せて提案する。
また、本明細書では、構成ユニットが送受信するデータ量の制限を、物理レベル(パケット量)及び論理レベル(パブリッシャ/サブスクライバ通信で使用するトピック数)で実現し、マルチテナント(構成ユニットを複数の業者に提供する場合)においても、各々に均等なネットワーク・リソースを配分する技術についても、以下で併せて提案する。
本実施形態において適用される、パブリッシャ/サブスクライバ型の通信モデルでは、メッセージを作成して送信する送信側のクライアント(プロデューサー)をパブリッシャと呼び、メッセージを受信する側のクライアント(コンシューマー)をサブスクライバと呼ぶ。パブリッシャは、誰に対して送るかは考えず、取り敢えずサーバに対してメッセージを発行する(パブリッシュする)。一方、サブスクライバは、サーバに対してメッセージ購読を申し込む(サブスクライブする)。そして、パブリッシャから送信されたメッセージの種類や属性を参照して、そのメッセージを欲しがっているサブスクライバに対して配信される。パブリッシャとサブスクライバはお互いを意識する必要がなく、また、サブスクライバは自分が必要とするメッセージのみを受け取ることができる。
また、「トピック」と呼ばれる名前付きの論理チャネルを指定する非同期通信を行なう形態を、トピック・ベースのパブリッシャ/サブスクライバ型通信と呼ぶこともできる。パブリッシャから送信されたメッセージは、サーバ(マスタ)内で、トピックという送信先に登録される。そして、サーバは、パブリッシャが送信したメッセージに付与されているトピックと、サブスクライバによって受信登録されているトピックとのマッチングを行ない、そのトピックに対して配信を申し込んだ(すなわち、サブスクライブした)サブスクライバに配信する。なお、1又は複数のパブリッシャからのメッセージを、1つのトピックに登録することができる。また、1又は複数のサブスクライバが同じトピックに登録することができる。サブスクライバは、登録したトピックから、複数のパブリッシャのメッセージを受信することができる。同じトピックに登録した複数のサブスクライバが、そのトピックから同じメッセージを受信することができる。
ここで、本明細書で使用する各用語「コンテナ」、「ノード」、「プロキシ」、「マスタ」、及び「トピック」について説明しておく。
コンテナ:
コンテナは、仮想NIC(ネットワーク・インターフェース・カード)によって論理的に分離されるアドレス又は名前空間、あるいは、それぞれのNICなどによって物理的に分離される名前空間である。コンテナは、ネットワーク・セグメントとして分離されるシステムの管理領域と捉えることもできる。コンテナには、「コンテナ・ホスト」と「コンテナ・ゲスト」の2種類がある。コンテナ・ホストは、信頼性のあるホスト・ノードのみが動作する空間である。一方、コンテナ・ゲストは、ホスト・ノードと分離しておく必要のあるゲスト・ノードのみが動作する空間である。例えば、第三者から提供されるアプリケーション・プログラムやライブラリ・プログラムをホスト・ノードから分離する必要があり、コンテナ・ゲストで動作させる(以下では、「アプリケーション・プログラム」及び「ライブラリ・・プログラム」をそれぞれ単に「アプリケーション」、「ライブラリ」と表記する)。また、動作保証や認証などにおいて信頼性が確保されていないアプリケーションやライブラリをホスト・ノードから分離する必要があり、コンテナ・ゲストで動作させる。なお、本明細書中では、2つのものが各々から独立して存在するという意味で「分離」という用語を主に使うが、「隔離」という用語を使うこともあり、「分離」の意味は「隔離」を含むものとする。
ノード:
ノードは、アプリケーション、若しくは、コンテナ内でアプリケーションが動作するプロセスに相当する(以下、プログラム・コードとしては「アプリケーション」と呼び、システムのプロセッサによって実行されるプロセスとしては「ノード」と呼ぶことにする)。ノードは、自分が帰属するコンテナのマスタに対して、「トピック」と呼ばれる名前付き論理チャネルを指定してサブスクライブ要求又はパブリッシュ要求を送信する。そして、接続可能な相手が見つかる場合(具体的には、マスタにおいて、接続希望相手とのマッチングがとれる場合)には、通信相手のID情報(プロセスIDなど)を取得することにより、パブリッシャ/サブスクライバ型のメッセージング、及び、RPC(Remote Procedure Call)による一方向通信を行なうことができる。ノード(アプリケーション)は、新たなアプリケーションの開発者向けに、アプリケーション名と、アプリケーションが提供するトピック名、あるいはアプリケーションがデータをサブスクライブ又はパブリッシュのいずれを行なうのか、という情報をAPIとして公開する。
ノードは、「ホスト・ノード」と「ゲスト・ノード」に分類することができる。ホスト・ノードは、信頼性があるアプリケーション又はライブラリが、コンテナ・ホスト内で動作するプロセスである。一方、ゲスト・ノードは、第三者から提供されるアプリケーションやライブラリ、あるいは信頼性が確保されていないアプリケーションやライブラリなどが、コンテナ・ゲスト内で動作するプロセスである。以下では、処理フローの説明などにおいて「ホスト・ノード」と言う代わりに「コンテナ・ホスト」を使用し、「ゲスト・ノード」と言う代わりに「コンテナ・ゲスト」と記載することもある。この場合には、処理フローにおいて、「ホスト・ノード」と「ゲスト・ノード」が、それぞれの属する「コンテナ・ホスト」又は「コンテナ・ゲスト」の一部として通信処理などを行っていることに留意されたい。
プロキシ:
プロキシ(プロキシ・ノード)は、以下の項目(a)~(d)のマッピング・テーブルを管理する。プロキシの基本機能はノードに順ずるが、コンテナ・ゲストのマスタと通信する場合には、コンテナ・ゲストのアドレスを指定してネットワーク越しの通信を行なう。
(a)コンテナ・ホスト内のノード(サブスクライブ・ノード、パブリッシュ(アドバタイズ)・ノード)が指定できるトピック識別子
(b)コンテナ・ゲスト内のノード(サブスクライブ・ノード、パブリッシュ(アドバタイズ)・ノード)が指定できるトピック識別子
(c)コンテナ・ゲストのアドレス(例えば、IPアドレス(一般的には、URI(URL)でもよい))
(d)コンテナ・ゲストの認証状態(verification)やセキュリティ・レベル、サブスクライバのプログラム更新処理を行なう間に送受信されるデータ
マスタ:
マスタは、コンテナ内のノードからのサブスクライブ要求並びにパブリッシュ要求を受信し、トピック毎にノードの対応関係(すなわち、サブスクライブ・ノードとパブリッシュ(アドバタイズ)・ノードとの対応関係)を管理する。そして、マスタは、同じトピックに関してサブスクライブ・ノードとパブリッシュ(アドバタイズ)・ノードが揃った場合は、それぞれのノード(少なくとも、送信側であるパブリッシュ(アドバタイズ)・ノード)に対して、相手(受信側であるサブスクライブ・ノード)のID(プロセスID、プログラム名、通信先(IPアドレス、ポートなど)など)を伝え、ノード間(ノードとプロキシ間を含む)のパブリッシャ/サブスクライバ型のメッセージング及びRPCを開始させる。
マスタは、「ホスト・マスタ」と「ゲスト・マスタ」に分類することができる。ホスト・マスタはコンテナ・ホスト内で動作するマスタであり、ゲスト・マスタはコンテナ・ゲスト内で動作するマスタである。
トピック:
トピックは、メッセージをサブスクライブあるいはパブリッシュ(アドバタイズ)するノードで共通の名前付き論理チャネルを持ったデータ用の通信経路を作るために使われる、以下のような名前若しくは識別子(ID)である。ここで、コンテナ・ゲスト名は、ゲスト・アプリケーションの登録時に作成される。
トピック名(ID)=“/”+名前付き論理チャネル名
コンテナ・ゲスト用のトピック名=“/”+コンテナ・ゲスト名+“/”+名前付き論理チャネル名
アプリケーション動作環境としてのコンテナの利用
次に、アプリケーションの動作環境としてコンテナを利用する場合について説明する。
ある自律動作装置100(例えば、ロボットや自動走行車、無人航空機(ドローン)など)向けに、自律動作装置100上で動作する他のアプリケーションとともに動作する新たなアプリケーションを開発した開発者は、開発したアプリケーションをサーバに登録する。そして、開発したアプリケーションをコンテナと呼ばれる外部から論理的に分離されるアドレス又は名前空間からなる隔離された空間にインストールして、自律動作装置100上で動作させることができる。
コンテナにインストールされたアプリケーションは、ノードと呼ばれるプロセスとして動作する。上述したように、コンテナは、コンテナ・ホストとコンテナ・ゲストに分類される。
コンテナ・ホストは、信頼性のあるホスト・ノードのみが動作するように設けられた空間である。例えば、以下に示すような所定の条件を満たすアプリケーションがコンテナ・ホストにインストールされ、ホスト・ノードとして動作する。
・自律動作装置100本体の開発者によって開発されたアプリケーション
・一定以上のセキュリティ・レベルを持つアプリケーション
・動作検証済みのアプリケーション
また、コンテナ・ゲストは、ホスト・ノードと分離しておく必要があるゲスト・ノードが動作するように設けられた空間である。例えば、上記のホスト・ノードとしての所定の条件を満たさないが、例えば以下に示すような所定の単位でグループ化されたアプリケーションが、コンテナ・ゲストにインストールされ、ホスト・ノードと分離して(コンテナ・ホストから独立して)、ゲスト・ノードとして動作する。コンテナによるグルーピング方法によって、アプリケーション開発における独立性を維持することができる。
・製造委託をしているソフトウェア会社単位のグループ
・第三者が製造したアプリケーション単位のグループ
・セキュリティ・レベルが一定以下のアプリケーションのグループ
・動作未検証のアプリケーションのグループ
上記の所定の条件を満たすアプリケーションをコンテナ・ホストにインストールし、各々がホスト・ノードとして動作することで、まとまりのあるノード間のグループ通信が実現する。すなわち、コンテナ・ホスト内のノード間では、パブリッシャ/サブスクライバ型通信の仕組みを利用してデータの送受信が行なわれる。上述したように、パブリッシャ/サブスクライバ型通信では、ノードは、マスタと呼ばれるプロセスを介して、他のノードと通信することができる。この際、ノード間で通信するための通信経路として、所定のトピック名を指定することができる。トピック名を指定した通信は、名前の付いた通信路を用いた通信に相当する。
パブリッシャ/サブスクライバ型通信の仕組みを利用したデータの送受信方法について、図7を参照しながら説明する。同図において、コンテナ・ホスト700内に、パブリッシャ701及びサブスクライバ702となる各ノードと、マスタ703が動作している。
まず、送信側であるパブリッシャ701は、アドバタイズとして、トピック名“bar”と、自分のIDとしてホスト名(foo)とポート番号(1234)の組み合わせからなる情報“foo:1234”を、マスタ703に登録する(S710)。
また、受信側であるサブスクライバ702は、サブスクライブとして、マスタ703に対して、トピック“bar”の配信元の情報(XML/RPC URI)を要求する(S711)。
マスタ703は、トピック“bar”に関してサブスクライブ・ノードとパブリッシュ・ノードが揃ったので、サブスクライバ702に対して、配信元であるパブリッシャ701の情報として、“foo:1234”を通知する(S712)。
サブスクライバ702は、マスタ703からの通知を受けると、パブリッシャ701に対して、TCPソケット通信によるトピック名“bar”の購読要求(connect(“bar”,TCP))を送信する(S713)。
これに対し、パブリッシャ701は、購読用のTCPサーバのURI(foo:2345)を通知する(S714)。
そして、サブスクライバ702は、購読用のTCPサーバに対して、トピック名“bar”の購読のための接続を要求(connect(foo:2345))する(S715)。
これに応答して、購読用のTCPサーバ(foo:2345)からサブスクライバ702へ、トピック名“bar”のトピックのTCP/IPによる配信が行なわれる(S716)。
トピック配信には、トピックの名前空間を共有するためのマスタ703への通信と、実際のデータ送受信のためのノード(すなわち、パブリッシャ701とサブスクライバ702)間のP2P通信を通す必要がある、という点に留意されたい。
例えば、コンテナ・ホスト内に、データを提供する機能を持つ第1のノードと、データを利用して処理を行なう第2のノードが動作しているとする。具体的には、第1のノードはカメラの撮像画像を提供するアプリケーションであり、第2のノードは3次元マップを生成するアプリケーションである。
第1のノードは、マスタに対して、「画像」というトピック名を指定して、データ送信(パブリッシュ又はアドバタイズ)の要求を送信する。一方、第2のノードは、マスタに対して、「画像」というトピック名を指定して、データ受信(サブスクライブ)の要求を送信する。ここで、パブリッシュ(又は、アドバタイズ)の要求とサブスクライブの要求は、どちらが先でもよく、また同時でも構わない。
マスタは、同じトピック名「画像」に関してサブスクライブ・ノードとパブリッシュ(アドバタイズ)・ノードが揃ったので、パブリッシュ・ノードである第1のノードに対してはサブスクライブ・ノードである第2のノードのID(又は、名前あるいは送信先情報)を通知し、サブスクライブ・ノードである第2のノードに対してはパブリッシュ・ノードである第1のノードのID(又は、名前あるいは送信先情報)を通知する。これによって、第1のノードと第2のノードの間では、トピック名「画像」のデータの送受信を行なうことができるようになる。
「画像」のようなトピック名は、システムにインストールされる各アプリケーション(若しくは、コンテナ・ホスト内で動作するホスト・ノード)にとっては、通信用インターフェースの役割を果たす。以下の表1に示すように、アプリケーション毎に関連するトピック名を定義して、言わばインターフェース情報として開発者向けに開示するようにすれば、新たなアプリケーションの開発者は、他のアプリケーションにデータを提供することを前提としたアプリケーションや、他のアプリケーションが提供するデータを受信することで処理を行なうようなアプリケーションの開発が容易になる。
上記の表1のような情報は、例えば、開発者向けの開発ツール・プログラムに関連付けられたデータベースにおいて管理するようにすることができる。このようなデータベースは、開発ツール・プログラムが動作するコンピュータ(例えば、図1中の開発装置200)の管理下にあるストレージに格納して管理するようにしてもよいし、図2に示したようなネットワーク上に存在するサーバに関連付けられたコンピュータあるいはストレージに格納して管理するようにしてもよい。開発ツール・プログラムは、アプリケーションの開発中のユーザに対して、アプリケーション名を選択することで、関連するトピック名を表示するようにすることができる。
開発ツール・プログラムに関連付けられたデータベースにおいて、アプリケーションで使われるトピック名を管理することにより、アプリケーション用のプログラム開発を効率化することができる。
一例として、プログラムの開発者がプログラム開発環境で、プログラム編集画面上において、キーボードから、以下の文字列を入力しているとする(プログラムの入力途中であるため、「閉じ括弧“)”」が意図的に記載されていないことに留意されたい)。
Register_Image (“カメラ画像アプリケーション”
開発ツール・プログラムには、表1に示したような情報がデータベース化して管理されている。ここで、「カメラ画像アプリケーション」というアプリケーション名がプログラム編集画面上で入力されているときに、開発ツール・プログラムがデータベースの登録アプリケーション名を認識し、「カメラ画像アプリケーション」という文字列を、例えば下線や色付け、反転するなどの方法によってハイライト表示するようにすることができる。
ここで、ユーザがハイライト表示された「カメラ画像アプリケーション」という文字列を、例えばマウスのようなポインティング・デバイスを用いてクリック(選択)操作したことに応答して、そのアプリケーション名に対して関連付けられた「パブリッシャ(データ送信)用トピック名:画像」などの情報を、文字列「カメラ画像アプリケーション」から至近の位置に表示する。さらに、ユーザがトピック名「画像」が表示された場所を、再度マウスのようなポインティング・デバイスで選択すると、オート・コンプリーションの機能によって、下記のように入力することができ、開発効率を向上させることができる。
Register_Image (“カメラ画像アプリケーション”、“画像”
開発者によるアプリケーションの登録
次に、コンテナ・ゲストを例として、新規アプリケーション開発者によるアプリケーションの事前登録申請について説明する。
アプリケーションの事前登録申請に際して、まず、所定の事項を記載した登録申請用フォームを、登録申請処理用サーバに送信することにより、登録を完了する必要がある。登録申請用フォームには、少なくとも、新規アプリケーション名とホスト・アプリケーション名を記載する必要がある。他に申請により登録することができる情報としては、例えば、アプリケーションの開発者名(製造者名)、第三者機関が発行する認証情報、セキュリティ・レベル、開発されたアプリケーションの機能説明などが挙げられるが、これらに限定されるものではない。
次に、アプリケーション申請用サーバに対して、開発したアプリケーションの登録申請を行なう。本実施形態では、サーバ上で動作する「プロキシ・マネージャ」というプロセスが、このアプリケーション申請の受信処理を行なうものとして説明する。プロキシ・マネージャへの申請が受理されると、新しいアプリケーションに対して、新規コンテナ名(新規のコンテナ・ゲストの名前)と、公開されたトピック名が割り当てられ、他の登録情報とともにプロキシ・マネージャに関連付けられたデータベースに登録される。申請受理時に割り当てられるトピック名は、コンテナ・ホスト中のアプリケーションとコンテナ・ゲストで動作するアプリケーションに対応するノードが他のアプリケーションに対応したノードとの間でデータ送受信を行なうために、利用することができる。以下の表2には、新しいアプリケーションに対して割り当てられ、データベースに登録される情報を例示している。
コンテナ名は、アプリケーションの申請時にプロキシ・マネージャによって割り当てられるという実施例の他に、コンテナ名を事前に割り当てるようにしてもよい。例えば、開発者が、アプリケーションの開発に先立ち、事前に開発者(製造者)登録を行なうことで、登録された開発者名(製造者名)に対してあらかじめコンテナ名を割り当てるようにしてもよい。コンテナ名が事前に割り当てられている場合には、上記のアプリケーション申請時に、事前に割り当てられたコンテナ名を申請用フォームに記載し、新規登録したアプリケーションとともに関連付けてプロキシ・マネージャに関連付けられたデータベースで管理するようにすることができる。
アプリケーションの開発者は、開発済みのアプリケーション・プログラムを、登録された情報(表2を参照のこと)とともに構築することによって、アプリケーションのソースコード中にある“[登録トピック名]”を、“[コンテナ名]/[登録トピック名]”で置き換えることによって、システム上の所定のコンテナ・ゲストで動作するアプリケーション・プログラムのコードを生成することができる。なお、プログラム開発環境におけるプログラム編集画面上において、キーボードから文字列を入力している際に、開発支援のために、アプリケーション名に対して関連付けられた情報を、入力文字列から至近の位置に表示する例を示したが、このような開発支援も、表2のような登録申請情報が登録されたデータベースの情報を、プログラム開発環境に提供可能にすることによって実現できる。
例えば、図8に示す、登録申請するアプリケーション・プログラムのソースコード中の8行目には、以下のようなコードがある。
ここで、advertiseは、このコードが、データ送信を行なうノードとして、“[登録トピック名]”のトピックを指定して、他のノードに対してデータ送信を要求するプログラム上の手続(procedure)である。図8に示すアプリケーションが、表2に示す情報が登録されたアプリケーションに対応するプロセスであり、コンテナ・ゲストでゲスト・ノードとして動作する場合、8行目の命令は、このノードがパブリッシュ(データ送信)を行なうことを示している。
この場合の他のノードはサブスクライバ(データ受信)である。よって、表2に示した登録情報のうち、「サブスクライバ(データ受信)用トピック名の項目に対応する、「認識結果」が、"[登録トピック名]"としてプログラムされていることになる。したがって、表2に示した登録情報を用いてプログラムのソースコードを編集し、構築することにより、8行目のコードは以下のように変更されて("[登録トピック名]"が"/プロキシA/認識結果"に書き換えられて)、プログラム・コードを生成する。
このようにして、プロキシ・マネージャに登録したトピックを、新規登録するアプリケーション・プログラムのソースコード中に容易に挿入することができる。すなわち、ユーザ(アプリケーションの開発者)が、登録申請情報の一覧を意識することなく、登録申請情報に基づいて、コンテナ・ゲスト上で動作するアプリケーション・プログラムを構築することができる。
パブリッシャ/サブスクライバ型の非同期通信モデルを用いたシステムにおいて、コンテナと称されるグルーピング方法を導入して、所定の条件を満たさないアプリケーションを、コンテナ・ホスト上で動作するホスト・ノードとは分離して動作させる。これによって、第三者から提供されたような(所定の条件を満たさない)アプリケーション・プログラムから、第三者の故意又は過失により誤ったデータが出力されても、システム全体で障害が発生しないように隔離することができる。
コンテナ・ゲストとプロキシの起動処理
システム(若しくは、OS)のブート処理では、システム上にはメモリから読み込まれたコンテナ・ホストが設定され、コンテナ・ホスト上には、所定の条件(前述)を満たすアプリケーションがインストールされ、ホスト・ノードとして動作する。言い換えれば、システムの初期状態では、信頼性のあるホスト・ノードが動作するコンテナ・ホストのみが設定されている。
所定の条件を満たさないアプリケーションを、コンテナ・ホスト上で動作するホスト・ノードとは分離して動作させるためには、このようなアプリケーションをインストールするためのコンテナ・ゲストを起動する必要がある。
コンテナ・ゲストの起動は、アプリケーション・ランチャ(Application Launcher)という役割を持った管理プロセスが実行する。アプリケーション・ランチャは、起動したコンテナ・ゲストへのIPアドレスの割り当てなど、コンテナ用の仮想ネットワーク管理も行なう。実際にコンテナの仮想NICにIPアドレスの値を設定するのはプロキシ・マネージャであるが、各コンテナ・ゲストに割り当てるIPアドレスの管理(DHCPサーバに類似する処理)はアプリケーション・ランチャが行なう。
図9には、コンテナ・ゲストを起動させるための処理手順をフローチャートの形式で示している。ここでは、システム上には、既にコンテナ・ホストの設定が完了し、コンテナ・ホスト上で1以上のホスト・ノードが起動しており、さらにプロキシ・マネージャが起動していることを想定している。
ユーザ(アプリケーションの開発者など)からコンテナ・ゲストの起動が要求されると、まず、アプリケーション・ランチャは、コンテナ・ゲスト用の仮想ネットワークが作成されているかどうかをチェックする(ステップS901)。
まだコンテナ・ゲストが読み込まれておらず、コンテナ・ゲスト用のネットワークが作成されていない場合には(ステップS901のNo)、以下の処理S902-1~S902-2により、コンテナ・ゲスト用の仮想ネットワークを作成する(ステップS902)。
S902-1)仮想ブリッジを作成する(brctl addrコマンド)。
S902-2)仮想ブリッジにIPアドレスなどのネットワーク設定をする(ip addrコマンド)。
続いて、仮想ブリッジに対して、仮想ブリッジのIPアドレスへのアクセス以外の全通信を拒否するファイアウォールを設定する(iptablesコマンド)(ステップS903)。ステップS902及びS903の処理により、コンテナ・ゲストは、他のコンテナ(例えば、コンテナ・ホストや、他のコンテナ・ゲスト)との間で、直接的な通信を行なうことを不可能にさせられる。
コンテナ・ゲスト用の仮想ネットワークが既に作成されている場合(ステップS901のYes)、あるいは、コンテナ・ゲスト用の仮想ネットワークが作成されていない場合であって(ステップS901のNo)、上記ステップS902及びS903の処理を経てコンテナ・ゲスト用の仮想ネットワークが作成された後に、コンテナ・ゲスト用の仮想NICを作成するとともに、コンテナ・ホスト側でもコンテナ・ゲスト用の仮想NICと対向する仮想NICを作成する(ステップS904)。例えば、コンテナ・ゲスト用の仮想NICのIPアドレスは、192.168.91.0/24であり、コンテナ・ホスト側でこれに対向する仮想NICのIPアドレスは172.16.10.0/16であるとする。
次いで、以下の処理S905-1~S905-6により、コンテナ・ゲスト用仮想NICのネットワーク設定(ステップS905)を行なう。
S905-1)コンテナ・ゲスト用の仮想NICと、コンテナ・ホスト側の対向する仮想NICを作成する(ip linkコマンド)。
S905-2)コンテナ・ホスト側の対向する仮想NICを起動する(ip linkコマンド)
S905-3)コンテナ・ホスト側の対向する仮想NICを仮想ブリッジに割り当てる(ip linkコマンド)。
S905-4)コンテナ・ゲストのネットワーク名前管理ファイルを直接操作するために、コンテナ・ゲストの初期プロセスのネットワーク名前管理ファイルに対して、ip netnsコマンドの操作用ディレクトリにシンボリック・リンクを貼る(ln -s/proc/[コンテナ・ゲスト初期プロセスID]/ns/net /var/run/netns/[コンテナ・ゲスト初期プロセスID])。なお、この処理で、コンテナ・ゲストへの仮想NICの割り当てが完了する。
S905-5)上記S905-4で作成したシンボリック・リンクに対して、仮想ブリッジを割り当てる(ip linkコマンド)。
S905-6)上記S905-4で作成したシンボリック・リンクに対して、ネットワークを設定する(ip netnsコマンド)。
そして、コンテナ・ゲスト用仮想NICのコンテナ・ゲストへの割り当てを行ない(ステップS906)、コンテナ・ホストがコンテナ・ゲストと共有するトピック名を指定して、プロキシ・ノードを起動して(ステップS907)、本処理を終了する。
プロキシ・マネージャは、プロキシ・ノードのプログラムに引数を指定して、プロキシ・ノードを起動する。引数には、プロキシ・ノードを他のプロキシ・ノードから一意に識別するID、コンテナ・ホストのIPアドレス、コンテナ・ホスト側のホスト・マスタのIPアドレス、コンテナ・ホスト側のトピック名、コンテナ・ゲストのIPアドレス、コンテナ・ゲスト側のゲスト・マスタのIPアドレス、コンテナ・ゲスト側のトピック名、プロキシ・ノードが送受信するデータのキューのサイズ、データ送信を行なうノードを指定する。
プロキシ・マネージャは、事前にデータベースに登録された情報(開発者によるアプリケーションの登録を参照)を使って、プロキシ・ノードを起動する。ネットワーク・セグメントに関する情報と開発者によるアプリケーションの登録時の情報をいずれかのデータベースで紐付けして管理してもよいが、データベース管理しなくても実現できる。但し、この紐付けしたデータベースを管理するのは、各プロキシ・ノードのプロセスではなく、プロキシ・マネージャ又はアプリケーション・ランチャ(アプリケーションを起動するソフトウェア)などである。
図10には、コンテナ・ホスト1000内にコンテナ・ゲスト1010が起動している様子を示している。コンテナ・ホスト1000には少なくとも1つのアプリケーションがインストールされたことにより、ホスト・ノード1004が起動している。
所定の条件を満たさないアプリケーションをシステムにインストールする際、コンテナ・ホスト1000側で動作するホスト・ノード1004とは分離して動作させるために、コンテナ・ゲスト1010を起動する。そして、アプリケーションはコンテナ・ゲスト1010にインストールされ、ゲスト・ノード1012として動作する。
アプリケーション・ランチャ1001は、図9に示した処理手順に従って、コンテナ・ゲスト1010の起動と、コンテナ・ゲスト1010へのIPアドレスの割り当てなどコンテナ用の仮想ネットワーク管理を行なう。また、アプリケーション・ランチャ1001は、コンテナ・ゲスト1010を起動時に、プロキシ・マネージャ1002を呼び出す。
プロキシ・マネージャ1002は、コンテナ・ゲスト1010の起動時に、プロキシ・ノード1005を作成する。プロキシ・ノード1005の起動時に、コンテナ・ホスト1000側のホスト・マスタ1003並びにコンテナ・ゲスト1010側のゲスト・マスタ1011の各々に、コンテナ・ホスト1000とコンテナ・ゲスト1010間で共有するトピック名を指定する。
プロキシ・マネージャ1002は、例えばプロキシ・ノード1005の管理ツールである。ユーザは、所定の条件を満たさないアプリケーションをシステムにインストールしたいときに、管理ツールのコンソール画面などを通じて、プロキシ・マネージャ1002に対して、そのアプリケーションが使用するアプリケーション(ホスト・ノード)と必要なトピックを事前申請する。事前申請によるデータベースの登録情報の一例を、以下の表3に示しておく。これに対し、プロキシ・マネージャ1002は、事前申請の登録情報に基づいて、コンテナ・ゲスト1012が利用するトピック名をデータベース情報から特定する。但し、コンテナ・ゲストが利用するトピック名を、ユーザ自身が事前申請時に指定できるようにしてもよい。
プロキシ・ノード1005は、以下の項目(a)~(d)のマッピング・テーブルをメモリ(キャッシュを含む)あるいは2次記録装置内のデータベースにおいて管理する(前述)。
(a)ホスト・ノード1004が指定できるトピック識別子
(b)ゲスト・ノード1012が指定できるトピック識別子
(c)コンテナ・ゲスト1010のアドレス
(d)コンテナ・ゲスト1010の認証状態(verification)やセキュリティ・レベル、サブスクライバのプログラム更新処理を行なう間に送受信されるデータ
図7を参照しながら説明したように、パブリッシャ/サブスクライバ型の通信モデルでは、パブリッシャがマスタにトピックを登録するとともに、サブスクライバがマスタに対してトピックを要求し、マスタにおいてパブリッシャとサブスクライバの対応関係がとれると(すなわち、名前が解決すると)、パブリッシャとサブスクライバ間でのトピック配信が実施される。
図10に示す仮想ネットワーク空間において、コンテナ・ホスト1000側では、プロキシ・ノード1005は、ホスト・ノードとして動作する。したがって、ホスト・ノード1004とプロキシ・ノード1005の一方がパブリッシャとなり他方がサブスクライバとなり、ホスト・マスタ1003においてトピックの対応関係がとれると、ホスト・ノード1004からプロキシ・ノード1005へのトピック配信、又は、プロキシ・ノード1005からホスト・ノード1004へのトピック配信が実施される。
一方、コンテナ・ゲスト1010側では、プロキシ・ノード1005は、ゲスト・ノードとして動作する。したがって、ゲスト・ノード1012とプロキシ・ノード1005の一方がパブリッシャとなり他方がサブスクライバとなり、ゲスト・マスタ1011においてトピックの対応関係がとれると、ゲスト・ノード1012からプロキシ・ノード1005へのトピック配信、又は、プロキシ・ノード1005からゲスト・ノード1012へのトピック配信が実施される。
コンテナ・ホスト1000とコンテナ・ゲスト1010は、仮想NICによって論理的に分離したアドレス又は名前空間であり、ホスト・ノード1004とゲスト・ノード1012間で直接的なトピック配信を行なうことはできない。但し、コンテナ・ゲスト1010と共有するトピック名を指定してプロキシ・ノード1005を起動することにより、ホスト・ノード1004とゲスト・ノード1012間で間接的にデータを送信することができる。
ホスト・ノード1004からゲスト・ノード1012へデータを送信する場合、プロキシ・ノード1005は、コンテナ・ホスト1000側では、ゲスト・ノード1012に対して配信すべきトピック名を、ホスト・マスタ1003に対して要求する。そして、コンテナ・ホスト1000側で、ホスト・ノード1004が、ゲスト・ノード1012が要求するトピック名で、ホスト・マスタ1003にパブリッシャとして登録すると、ホスト・マスタ1003においてパブリッシャとサブスクライバの対応関係がとれ(名前が解決され)、ホスト・ノード1004からプロキシ・ノード1005へトピック配信が実施される。
続いて、プロキシ・ノード1005は、ホスト・ノード1004からトピックを受信したことに応答して、コンテナ・ゲスト1010側では、パブリッシャとしてゲスト・マスタ1011にトピックを登録すると、ゲスト・マスタ1011においてパブリッシャとサブスクライバの対応関係がとれ(名前が解決され)、プロキシ・ノード1005からゲスト・ノード1012へトピック配信が実施される。
一方、ゲスト・ノード1012からホスト・ノード1004へデータを送信する場合には、プロキシ・ノード1005は、コンテナ・ゲスト1010側では、ゲスト・ノード1012がゲスト・マスタ1011にパブリッシャとして登録したトピック名を、ゲスト・マスタ1011に対して要求する。そして、ゲスト・マスタ1011においてパブリッシャとサブスクライバの対応関係がとれると(名前が解決されると)、ゲスト・ノード1012からプロキシ・ノード1005へトピック配信が実施される。
また、プロキシ・ノード1005は、コンテナ・ホスト1000側では、ゲスト・マスタ1011に対して要求したものと同じトピック名で、ホスト・マスタ1003に対してパブリッシャとしてトピックを登録する。そして、ホスト・ノード1004が同じトピック名でサブスクライバとして登録しているとすると、ホスト・マスタ1003においてパブリッシャとサブスクライバの対応関係がとれるので(名前が解決されるので)、プロキシ・ノード1005からホスト・ノード1003へトピック配信が実施される。
なお、コンテナ・ホスト1000とコンテナ・ゲスト1010の名前空間は分離されているので、ホスト・マスタ1003とゲスト・マスタ1011は同じトピック名を使用することができる。但し、例えばコンテナ・ゲスト1010内で、コンテナ・ホスト1000と同じトピックのトピック名に対して、コンテナ・ホスト1000側の通信相手を識別できるようなプレフィックス(例えば、“/host1”など)などの識別情報を付けることで、トピックの通信相手をコンテナ・ゲスト1010側からも識別できるようにすることができる(コンテナ・ホスト1000側でも同様である)。
プロキシ・マネージャ1002は、プロキシ・ノード1005の管理ツールとして、ユーザからの事前申請の登録情報に基づいて、コンテナ・ゲスト1012が利用するトピック名をデータベースから特定する。例えば、事前申請するユーザの希望に応じて、コンテナ・ゲスト1012側で使用するトピック名にプレフィックスを付けるようにしてもよい。
図11には、コンテナ・ゲストを起動する際の処理シーケンス例を示している。図示の処理シーケンスは、基本的には、図9に示したフローチャートに従って実行される。
ユーザは、所定の条件を満たさないアプリケーションをシステムにインストールしようとする際、プロキシ・ノードの管理ツールであるプロキシ・マネージャに対して、そのアプリケーションが使用するアプリケーション(ホスト・ノード)と必要なトピックを事前申請する(前述)。
そして、ユーザは、アプリケーション・ランチャに対して、トピック名を指定して、コンテナ・ゲストの起動を要求する(S1101)。ここで言うユーザは、例えば、所定の条件を満たすアプリケーションのインストールを要求するユーザである。
アプリケーション・ランチャは、コンテナ・ゲストを起動する前に、コンテナ・ゲストに割り当てる仮想ネットワークの情報を準備して、プロキシ・マネージャに通知する(S1102)。
プロキシ・マネージャは、システムに対し、コンテナ・ゲスト用の仮想ネットワークの設定を依頼する(S1103)。これに対し、システムは、コンテナ・ゲスト用の仮想ネットワークの設定を完了すると、プロキシ・マネージャに通知する(S1104)。
次いで、プロキシ・マネージャは、ユーザが事前申請してデータベースに情報登録されたトピック名でコンテナ・ホスト側と通信可能となるように、プロキシ・ノードを指定された個数分だけ作成する(S1105)。図11では、簡素化のため、プロキシ・ノードを1個だけ描いている。そして、プロキシ・ノードは、起動すると、プロキシ・マネージャに通知する(S1106)。プロキシ・ノードを起動する際、コンテナ・ゲストと共有するトピック名を、コンテナ・ホスト側でも指定する。
プロキシ・マネージャは、アプリケーション・ランチャに、コンテナ・ゲストの仮想ネットワークの設定が完了したこと、及び、プロキシ・ノードの起動が完了したことを、アプリケーション・ランチャに通知する(S1107)。
アプリケーション・ランチャは、プロキシ・マネージャから通知を受け取ると、コンテナ・ゲストを起動する。そして、所定の条件を満たさないアプリケーションがコンテナ・ゲストにインストールされ、ゲスト・ノードとして動作する(S1108)。
コンテナ・ホスト側では、プロキシ・ノードは、ホスト・ノードとして動作する。ホスト・ノードとプロキシ・ノードの一方がパブリッシャとなり他方がサブスクライバとなり、ホスト・ノードからプロキシ・ノードへのトピック配信、又は、プロキシ・ノードからホスト・ノードへのトピック配信が実施される。
一方、コンテナ・ゲスト側では、プロキシ・ノードは、ゲスト・ノードとして動作する。ゲスト・ノードとプロキシ・ノードの一方がパブリッシャとなり他方がサブスクライバとなり、ゲスト・ノードからプロキシ・ノードへのトピック配信、又は、プロキシ・ノードからゲスト・ノードへのトピック配信が実施される。
コンテナ・ホストとコンテナ・ゲストは、仮想NICによって論理的に分離したアドレス又は名前空間であり、ホスト・ノードとゲスト・ノード間で直接的なトピック配信を行なうことはできない。但し、コンテナ・ゲストと共有するトピック名を指定してプロキシ・ノードを起動することにより、ホスト・ノードとゲスト・ノード間で間接的にデータを送信することができる。
例えば、コンテナ・ホスト側で動作する「カメラ画像アプリケーション」に対応するホスト・ノードから、コンテナ・ゲスト側で動作する「画像認識アプリケーション」に対応するゲスト・ノードに対して、画像データを送りたい場合がある。プロキシ・ノードは、コンテナ・ホスト側では、ゲスト・ノードに対して配信すべきトピック名「画像」を、ホスト・マスタに対して要求する。そして、「カメラ画像アプリケーション」に対応するホスト・ノードが、ホスト・マスタに対し、トピック名「画像」でパブリッシャとして登録すると、ホスト・マスタにおいてパブリッシャとサブスクライバの対応関係がとれ(名前が解決され)、ホスト・ノードからプロキシ・ノードへトピック配信が実施される。
コンテナ・ゲスト側では、「画像認識アプリケーション」に対応するゲスト・ノードが、ゲスト・マスタに対し、トピック名「画像」を要求するサブスクライバとして登録している。プロキシ・ノードは、ホスト・ノードからトピック「画像」を受信したことに応答して、コンテナ・ゲスト側では、パブリッシャとしてゲスト・マスタにトピック「画像」を登録すると、ゲスト・マスタにおいてパブリッシャとサブスクライバの対応関係がとれ(名前が解決され)、プロキシ・ノードからゲスト・ノードへトピック「画像」の配信が実施される。
なお、上記では、便宜上、コンテナ・ホスト側でのトピック配信、コンテナ・ゲスト側でのトピック配信の順で説明したが、コンテナ・ホストとコンテナ・ゲストは並列して動作しているので、ホスト・ノードとゲスト・ノード間のデータ通信がどこから始まるかは任意である。
また、コンテナ・ホストとコンテナ・ゲストの名前空間は分離されているので、ホスト・マスタとゲスト・マスタは同じトピック名を使用することができる。但し、例えばコンテナ・ゲスト内で、コンテナ・ホストと同じトピックのトピック名に対して、コンテナ・ホスト側の通信相手を識別できるようなプレフィックス(例えば、“/host1”など)を付けることで、トピックの通信相手をコンテナ・ゲスト側からも識別できるようにすることができる(コンテナ・ホスト側でも同様である)。
図12には、コンテナ・ホストのホスト・ノードからコンテナ・ゲストのゲスト・ノードへデータ送信を行なうための処理手順をフローチャートの形式で示している。
コンテナ・ホストのホスト・ノードは、プロキシ・ノードが提供するコンテナ・ホスト側の「トピック」に接続する(すなわち、ホスト・マスタに対してパブリッシャとして登録し、登録したトピックのサブスクライバに対して、トピックに対するデータを送信できるようにする)(ステップS1201)。
そして、ホスト・ノードは、プロキシ・ノードが提供するコンテナ・ホスト側のトピックにデータを送信(パブリッシュ)する(ステップS1202)。
これに対し、プロキシ・ノードは、自分が提供するコンテナ・ホスト側(ホスト・マスタ)のトピックのデータを受信(サブスクライブ)する(ステップS1203)。
プロキシ・ノードは、コンテナ・ホストに紐付けられた仮想ネットワーク、すなわちコンテナ・ゲスト側(ゲスト・マスタ)でも、対応するトピックを作成する(すなわち、ゲスト・マスタに対してトピックのパブリッシャとして登録し、登録したトピックのサブスクライバに対して、トピックに対するデータを送信できるようにする)(ステップS1204)。
そして、プロキシ・ノードは、作成したトピックに、コンテナ・ホスト側でホスト・ノードから受信したデータを送信(パブリッシュ)する(ステップS1205)。
これに対し、ゲスト・ノードは、コンテナ・ゲスト側(ゲスト・マスタ)でプロキシ・ノードが作成したトピックからデータを受信(サブスクライブ)して(ステップS1206)、ホスト・ノードからの送信データを受け取ることができる。
また、図13には、コンテナ・ゲストのゲスト・ノードからコンテナ・ホストのホスト・ノードへデータ送信を行なうための処理手順をフローチャートの形式で示している。
コンテナ・ゲストのゲスト・ノードは、プロキシ・ノードが提供するコンテナ・ゲスト側の「トピック」に接続する(すなわち、ゲスト・マスタに対してパブリッシャとして登録し、登録したトピックのサブスクライバに対して、トピックに対するデータを送信できるようにする)(ステップS1301)。
そして、ゲスト・ノードは、プロキシ・ノードが提供するコンテナ・ゲスト側のトピックにデータを送信(パブリッシュ)する(ステップS1302)。
これに対し、プロキシ・ノードは、自分が提供するコンテナ・ゲスト側(ゲスト・マスタ)のトピックのデータを受信(サブスクライブ)する(ステップS1303)。
プロキシ・ノードは、コンテナ・ゲストに紐付けられた仮想ネットワーク、すなわちコンテナ・ホスト側(ホスト・マスタ)でも、対応するトピックを作成する(すなわち、ホスト・マスタに対してトピックのパブリッシャとして登録し、登録したトピックのサブスクライバに対して、トピックに対するデータを送信できるようにする)(ステップS1304)。
そして、プロキシ・ノードは、作成したトピックに、コンテナ・ゲスト側でゲスト・ノードから受信したデータを送信(パブリッシュ)する(ステップS1305)。
これに対し、ホスト・ノードは、コンテナ・ホスト側(ホスト・マスタ)でプロキシ・ノードが作成したトピックからデータを受信(サブスクライブ)して(ステップS1306)、ゲスト・ノードからの送信データを受け取ることができる。
図14には、コンテナ・ホスト側(図示しないホスト・ノード)からコンテナ・ゲスト側(図示しないゲスト・ノード)へデータ送信を行なうための処理シーケンス例を示している。
プロキシ・ノードは、プロキシ・マネージャに事前登録されたコンテナ・ゲスト側のトピック名で、自分の仮想ネットワーク情報をゲスト・マスタに登録する(S1401)。
また、パブリッシャであるコンテナ・ホスト(アプリケーションのプロセスとしてデータの送受信を行なうのは、図示しないホスト・ノード)は、プロキシ・マネージャに事前登録されたコンテナ・ホスト側のトピック名で、自分の仮想ネットワーク情報をホスト・マスタに登録する(S1402)。
一方、サブスクライバであるコンテナ・ゲスト(アプリケーションのプロセスとしてデータの送受信を行なうのは、図示しないゲスト・ノード)は、プロキシ・マネージャに事前登録されたコンテナ・ゲスト側のトピック名がゲスト・マスタに登録されるまで、待機する。そして、コンテナ・ゲストは、ゲスト・マスタに所望のトピック名が登録されたことを確認できると、プロキシ・ノードの仮想ネットワーク情報を、ゲスト・マスタから取得する(S1403)。
また、プロキシ・ノードは、プロキシ・マネージャに事前登録されたコンテナ・ホスト側のトピック名がホスト・マスタに登録されるまで、待機する。そして、プロキシ・ノードは、ホスト・マスタに所望のトピック名が登録されたことを確認できると、パブリッシャとなるコンテナ・ホストの仮想ネットワーク情報を、ホスト・マスタから取得する(S1404)。
そして、サブスクライバであるコンテナ・ゲストは、ゲスト・マスタから取得したプロキシ・ノードの仮想ネットワーク情報に基づいて、プロキシ・ノードへ接続する(S1405)。この結果、プロキシ・ノードと、サブスクライバであるコンテナ・ゲストとの通信路が完成する。
続いて、プロキシ・ノードは、ホスト・マスタから取得したホスト・ノードの仮想ネットワーク情報に基づいて、コンテナ・ホストへ接続する(S1406)。この結果、パブリッシャであるコンテナ・ホストとプロキシ・ノードとの通信路が完成する。
コンテナ・ホスト側では、パブリッシャであるコンテナ・ホストが、プロキシ・ノードへ、トピックのデータを送信する(S1407)。
また、コンテナ・ゲスト側では、プロキシ・ノードから、サブスクライバであるコンテナ・ゲストへ、トピックのデータを送信する(S1408)。
なお、コンテナ・ゲスト側(ゲスト・ノード)からコンテナ・ホスト側(ホスト・ノード)へデータ送信を行なう処理シーケンスについては図示を省略するが、同様の手順により実施できることを理解されたい。
ここまで説明してきたように、各アプリケーションを、種別に応じて(例えば、所定の条件を満たすか否かに応じて、あるいは、条件を適合するレベルに応じて)、仮想NICによって論理的に分離されるコンテナを用いてグルーピングすることができる。コンテナ毎に仮想ネットワークが作成され、各コンテナ(コンテナ・ゲスト)は外部(コンテナ・ホスト)から遮断される。また、各コンテナには仮想NICが割り当てられ、コンテナ・ホスト側には対向する仮想NICが作成される。
図15には、仮想NICを用いたコンテナ・ネットワーク1500の構成例を示している。図示のコンテナ・ネットワーク1500には、複数のコンテナ・グループ1510、1520などが形成され、各コンテナ・グループ1510、1520などの内には1以上のコンテナ(コンテナ・ゲスト)が起動している。例えば、コンテナ・グループ1510内ではコンテナ1511及びコンテナ1512が起動し、コンテナ・グループ1520内ではコンテナ1521が起動している。コンテナは、例えば図9に示した処理手順に従って起動されるものとする。
各コンテナには仮想NICが割り当てられ、コンテナ・ホスト側の対向する仮想NICと通信することができる。図15に示す例では、コンテナ・グループ1510内では、コンテナ1511には仮想NIC1511´が割り当てられるとともに、コンテナ1511には仮想NIC1512´が割り当てられる。また、コンテナ・グループ1520内では、コンテナ1521に仮想NIC1521´替わりらてられる。また、コンテナ・ホスト側には、各コンテナの仮想NICと対向する仮想NIC1501が作成されている。コンテナ・ホスト側の仮想NIC1501と各コンテナ・グループ内のコンテナ毎の仮想NIC1511´、1512´、1521´、…とは、コンテナ・グループ毎に作成された仮想ブリッジ1501-a、1501-bなどを介して通信することができる。
コンテナ・グループ1510、1520、…は、例えばアプリケーションの開発者(ソフトウェア・ベンダ)毎に割り当てられる。したがって、1つのコンテナ・グループは、(同一の開発者により開発されるなど)条件が揃ったアプリケーションをインストールして、ノードとして動作させるためのコンテナの集合からなる。
図15中、通信許可範囲を点線で囲って示している。コンテナ・グループ内では、各コンテナで動作するノード間は、互いのコンテナに割り当てられた仮想NICによって通信することができる。例えば、コンテナ1511で動作するノードとコンテナ1512で動作するノードは、各々に割り当てられた仮想NIC1511´及び1512´によって通信可能である。他方、別のコンテナ・グループに属するコンテナで動作するノード間は、サブネットが分かれているため、通信することができない。例えば、コンテナ1512で動作するノードと、コンテナ1521で動作するノード間は、各々に割り当てられた仮想NIC1512´及び1521´で通信することは不可能である。
例えば、パケット・フィルタリング及びネットワーク・アドレス変換 (NAT) 機能の設定を操作するiptablesコマンドなどを利用して、上記のような通信許可範囲の制限を実現することができる。
各アプリケーションを仮想NICによって論理的に分離されるコンテナを用いてグルーピングするシステムでは、同一のソースからの情報に対し、アプリケーション毎に割り当てる特性に応じた加工を施した上で送信することができる。例えば、送信先となるアプリケーション毎のセキュリティ・レベルに併せて情報を劣化させる。具体的には、コンテナ間で共有するトピックをコンテナ毎に変更することにより、実現することができる。コンテナ毎に共有トピックを変更する例について、図16を参照しながら説明する。
図16では、カメラ画像アプリケーションから画像認識アプリケーションへ画像を配信することを想定しており、共有するトピック名を「画像」とする。
コンテナ・ホスト1600側には、所定の条件を満たすカメラ画像アプリケーション(APP1)及び画像認識アプリケーション(APP2)がインストールされて、それぞれノード1601及びノード1602として動作している。
また、第三者から提供された、認証済みの画像認識アプリケーション(APP3)が、コンテナ・ゲスト(認証済みコンテナ)1610にインストールされて、ゲスト・ノード(認証済みノード)1611として動作している。認証済みコンテナ1610は、プロキシ・ノード1612を介して、ノード1601とトピック「画像」を共有している。
さらに、他の第三者から提供された、未認証の画像認識アプリケーション(APP4)が、コンテナ・ゲスト(未認証コンテナ)1620にインストールされて、ゲスト・ノード(未認証ノード)1621として動作している。なお、各コンテナ・ゲスト1610、1620は、例えば図9に示した処理手順に従って起動されているものとする。未認証コンテナ1621は、プロキシ・ノード1622を介して、ノード1601とトピック「画像」を共有している。
コンテナ・ホスト1600で動作するノード1602は、セキュリティ・レベルが高いことが想定される。そこで、カメラ画像アプリケーションが動作するノード1601と、画像認識アプリケーションが動作する1602とはトピック「/高解像度画像」を共有し、ノード1601は、カメラ画像アプリケーションが取得した高解像度の画像をそのままノード1602に送信する。
一方、認証済みコンテナ1610で動作する認証済みノード1611は、中程度のセキュリティ・レベルである。そこで、セキュリティ・レベルに合わせて、ノード1601と認証済みノード1611で共有するトピックを「/高解像度画像」から「/中解像度画像」に変更する。例えば、プロキシ・マネージャ(図16では図示しない)がプロキシ・ノード1612を起動するときに、コンテナ・ホスト1600と認証済みコンテナ1610間で共有するトピック名を「/中解像度画像」に指定する。その結果、ノード1601は、元の高解像度画像の解像度を低下する加工を施して、プロキシ・ノード1612からのトピックの要求に対して中解像度画像を送信し、認証済みノード1611には中解像度画像が届くことになる。
また、未認証コンテナ1620で動作する認証済みノード1621は、セキュリティ・レベルが低い。そこで、セキュリティ・レベルに合わせて、ノード1601と未認証ノード1621で共有するトピックを「/高解像度画像」から「/低解像度画像」に変更する。例えば、プロキシ・マネージャ(図16では図示しない)がプロキシ・ノード1622を起動するときに、コンテナ・ホスト1600と未認証コンテナ1620間で共有するトピック名を「/低解像度画像」に指定する。その結果、ノード1601は、元の高解像度画像の解像度を劣化する加工を施して、プロキシ・ノード1622からのトピックの要求に対して低解像度画像を送信し、未認証ノード1621には低解像度画像が届くことになる。
図16に示した、コンテナのセキュリティ・レベルに応じた共有トピックの変形例を、以下の表4にまとめておく。
各アプリケーションを仮想NICによって論理的に分離されるコンテナを用いてグルーピングするシステムでは、更新又は追加されたアプリケーションがシステム動作中に誤動作を起こした場合に、その誤動作を検出して、そのアプリケーションの停止と再起動を行なうことができる。
想定するシステムでは、コンテナ・ホスト側では、コンテナ・ゲストと共有するトピックに関して、ホスト・ノードとプロキシ・ノードでパブリッシャ/サブスクライバ型通信を実施し、コンテナ・ゲスト側では、ゲスト・ノードとプロキシ・ノードでパブリッシャ/サブスクライバ型通信を実施する。そして、プロキシ・ノードは、例えば更新又は追加されたアプリケーションをインストールして動作するゲスト・ノードから受信したデータに異常値を検出すると、コンテナ・ホスト側でホスト・ノードにはデータを送信せず、アプリケーションの停止を指示する。
図17には、コンテナを用いてアプリケーションをグルーピングする方法を利用して、仕様に適合しない出力をするアプリケーションの停止と再起動を行なう仕組みを図解している。
コンテナ・ホスト1710と、コンテナ・ゲスト1720がそれぞれの実行環境で起動している。また、各コンテナの動作を監視する監視フレームワーク(FW)1740が、その実行環境で動作している。
コンテナ・ホスト1710側では、所定の条件を満たすアプリケーションをインストールして、ホスト・ノード1711が動作している。一方、コンテナ・ゲスト1720側では、所定の条件を満たさないアプリケーションをインストールして、ゲスト・ノード1721が動作している。また、コンテナ・ホスト1710側では、コンテナ・ゲスト1720側と共有するトピック“Topic1”を指定するプロキシ・ノード1712が起動している。
コンテナ・ゲスト1720側で、ゲスト・ノード1721がTopic1のデータをパブリッシュするとともに、プロキシ・ノード1712がサブスクライブする。このとき、プロキシ・ノード1712は、ゲスト・ノード1721から受信したデータに異常値を検出すると、監視フレームワーク1740に異常を通知する。
監視フレームワーク1740は、コンテナ・ゲスト1720の異常、又は、コンテナ・ゲスト1720で動作するゲスト・ノード1721の異常を検知すると、ゲスト・ノード1721を停止させるとともに、他のコンテナ・ゲスト1730側で動作するゲスト・ノード1731に瞬時に切り替える。
コンテナ・ゲスト1730は、コンテナ・ゲスト1720とは実装が異なる実行環境で起動したコンテナであり、又は、ゲスト・ノード1731は、ゲスト・ノード1721よりも古い、安定したバージョンのアプリケーションをコンテナ・ゲスト1730にインストールして動作するノードである。
図18には、仕様に適合しない出力をするアプリケーションの停止と再起動を行なうための処理シーケンス例を示している。
まず、コンテナ・ゲスト(アプリケーションのプロセスとしてデータの送受信を行なうのは、図示しないゲスト・ノード)が、パブリッシャとして、プロキシ・ノードへデータ送信する(S1801)。
プロキシ・ノードは、コンテナ・ゲストから送信されたデータが、あらかじめ規定された出力値の仕様範囲内かどうかをチェックする。そして、出力値の仕様範囲外であることを検知すると、プロキシ・ノードは、監視フレームワークに対し、パブリッシャであるコンテナ・ゲスト(アプリケーションのプロセスとしてデータの送受信を行なうのは、図示しないゲスト・ノード)の異常を通知する(S1802)。
監視フレームワークは、プロキシ・ノードからの異常通知に応答して、異常を起こしたパブリッシャであるコンテナ・ゲスト(ゲスト・ノード)の停止を指示する(S1803)。
また、監視フレームワークは、異常を起こしたコンテナ・ゲストとは異なる実行環境でコンテナ・ゲストを起動し、そのコンテナ・ゲスト内に、異常を起こしたコンテナ・ゲストのアプリケーションとは同じであるが、古いバージョンで安定したアプリケーションをインストールして、コンテナ・ゲストを安定化パブリッシャとして動作させる(S1804)。
各アプリケーションを仮想NICによって論理的に分離されるコンテナを用いてグルーピングするシステムでは、更新中のアプリケーションに関連する送受信データを一時的に保存し、更新後に一時保存した送受信データから接続を再開することで、アプリケーションやアプリケーションに含まれるプログラムを安全に更新又は追加することができる。
想定するシステムでは、コンテナ・ホスト側では、コンテナ・ゲストと共有するトピックに関して、ホスト・ノードとプロキシ・ノードでパブリッシャ/サブスクライバ型通信を実施し、コンテナ・ゲスト側では、ゲスト・ノードとプロキシ・ノードでパブリッシャ/サブスクライバ型通信を実施する。プロキシ・ノードは、例えば、パブリッシャとしてデータを送信中のゲスト・ノードに関連するアプリケーションを更新する際には、パブリッシャからの送信データを一時的に保存し、更新完了後にゲスト・ノードはプロキシ・ノードに再接続して、データ送信を再開する。また、プロキシ・ノードは、例えばサブスクライバとして接続しているゲスト・ノードにデータを送信中にアプリケーションを更新する際には、受信データを一時的に保存し、更新完了後にプロキシ・ノードはゲスト・ノードへのデータ送信を再開する。
図19には、アプリケーションを更新中のゲスト・ノードに関連する送受信データを一時的に保存する仕組みを模式的に示している。同図では、コンテナ・ホスト1900側では、コンテナ・ゲスト1910と共有するトピック名を指定してプロキシ・ノード1902が起動され、パブリッシャとしてのホスト・ノード1901が送信したデータをプロキシ・ノード1902が受信し、コンテナ・ゲスト1910側ではプロキシ・ノード1902からサブスクライバとしてのゲスト・ノード1911に転送することを想定している。また、アプリケーションやアプリケーションに含まれるプログラムを更新又は追加することにより、更新前のゲスト・ノード1911は、ゲスト・ノード1912に更新されるものとする。
アプリケーション・アップデータ1903は、アプリケーションのアップデートを管理する役割を持つ管理プロセスである。アプリケーション・アップデータ1903は、サブスクライバであるゲスト・ノード1911に関連するプログラムを更新する前に、プロキシ・ノード1902が提供するキューに、パブリッシャであるホスト・ノード1901から送信されたデータを一時的に保存するように、プロキシ・ノード1902に指示を出す。これによって、サブスクライバが終了するなどの状態変化が発生しても、パブリッシャであるホスト・ノード1901から送信されたデータはプロキシ・ノード1902に保持される。
続いて、アプリケーション・アップデータ1903は、サブスクライバであるゲスト・ノード1911に関連するプログラムを更新する。そして、アプリケーション・アップデータ1903は、プログラムの更新が完了すると、プロキシ・ノード1902に対してプログラム更新完了を通知する。
プロキシ・ノード1902は、アプリケーション・アップデータ1903からプログラムの更新完了の通知を受け取ると、一時的に保存しておいたパブリッシャ(ホスト・ノード1901)からの送信データの最初から、サブスクライバ(更新後のゲスト・ノード1912)へのデータ送信を再開する。
図20には、アプリケーションを更新中のコンテナ・ゲスト(更新対象のゲスト・ノードを含む)に関連する送受信データの一時保存とアプリケーション更新後にデータ送信を再開する処理シーケンス例を示している。但し、同図は、更新中のコンテナ・ゲスト(更新対象のゲスト・ノード)がパブリッシャとして動作する場合の処理シーケンス例を示している。
ユーザが、パブリッシャとして動作中のコンテナ・ゲスト(更新前のゲスト・ノード)に関連するプログラムの更新を要求する(S2001)。
アプリケーション・アップデータは、ユーザからの更新要求に応答して、プロキシ・ノードに対し、更新前のパブリッシャであるコンテナ・ゲスト(更新対象のゲスト・ノード)への通信接続を一時的に保存するように指示する(S2002)。プロキシ・ノードは、アプリケーション・アップデータからの指示に応答して、コンテナ・ゲスト(更新対象のゲスト・ノード)から送信(パブリッシュ)されるデータを一時的に保存する。
その後、アプリケーション・アップデータは、パブリッシャであるコンテナ・ゲスト内の更新対象のゲスト・ノードに関連するプログラムの更新を実施する(S2003)。ここで、プログラムは、特定のディレクトリにバージョン毎に保存され、実際の更新処理は、新しいプログラムを起動するだけの処理を指すものとする。
そして、パブリッシャであるコンテナ・ゲストに関連するプログラム(更新されるゲスト・ノードに対応する)の更新処理が完了すると、アプリケーション・アップデータは、プロキシ・ノードに対して更新完了を通知する(S2004)。
パブリッシャ(コンテナ・ゲスト内の更新後のゲスト・ノード)は、プロキシ・ノードへ再接続し、データの転送(パブリッシュ)を再開する(S2005)。また、プロキシ・ノードは、一時的に保存しておいたデータから、コンテナ・ホスト内のホスト・ノード(図示しない)へのデータ送信を再開する。
また、図21には、アプリケーションを更新中のコンテナ・ゲスト(更新対象のゲスト・ノードを含む)に関連する送受信データの一時保存とアプリケーション更新後にデータ送信を再開する他の処理シーケンス例を示している。但し、同図は、更新中のコンテナ・ゲスト(更新対象のゲスト・ノード)がサブスクライバとして動作する場合の処理シーケンス例を示している。
ユーザが、サブスクライバとして動作中のコンテナ・ゲスト(更新前のゲスト・ノード)に関連するプログラムの更新を要求する(S2101)。
アプリケーション・アップデータは、ユーザからの更新要求に応答して、プロキシ・ノードに対し、更新前のサブスクライバであるコンテナ・ゲスト(更新前のゲスト・ノード)への通信接続及び更新中に受信したデータを一時的に保存するように指示する(S2102)。プロキシ・ノードは、アプリケーション・アップデータからの指示に応答して、コンテナ・ホスト内のホスト・ノード(図示しない)から送信(パブリッシュ)され、コンテナ・ゲスト(更新対象のゲスト・ノード)に転送すべきデータを一時的に保存する。
その後、アプリケーション・アップデータは、サブスクライバ(コンテナ・ゲスト内の更新対象のゲスト・ノード)に関連するプログラムの更新を実施する(S2103)。ここで、プログラムは、特定のディレクトリにバージョン毎に保存され、実際の更新処理は、新しいプログラムを起動するだけの処理を指すものとする。
そして、サブスクライバ(コンテナ・ゲスト(ゲスト・ノード))に関連するプログラムの更新処理が完了すると、アプリケーション・アップデータは、プロキシ・ノードに対して更新完了を通知する(S2104)。
プロキシ・ノードは、サブスクライバ(コンテナ・ゲストに含まれる更新対象となるゲスト・ノード)の更新中に一時的に保存したデータから、サブスクライバ(コンテナ・ゲスト内の更新後のゲスト・ノード)へのデータ送信を再開する(S2105)。また、プロキシ・ノードは、一時的に保存しておいたデータから、コンテナ・ゲスト(更新後のゲスト・ノード)へのデータ転送を再開する。
各アプリケーションを仮想NICによって論理的に分離されるコンテナを用いてグルーピングするシステムでは、コンテナ間で送受信するデータ量の制限を、物理レベル(パケット量)及び論理レベル(パブリッシャ/サブスクライバ通信で使用するトピック数)で実現することができる。
想定するシステムでは、コンテナ・ホスト側では、コンテナ・ゲストと共有するトピックに関して、ホスト・ノードとプロキシ・ノードでパブリッシャ/サブスクライバ型通信を実施し、コンテナ・ゲスト側では、ゲスト・ノードとプロキシ・ノードでパブリッシャ/サブスクライバ型通信を実施する。プロキシ・ノードが通信量を制御することによって、各コンテナに対して均等なネットワーク・リソースを割り当てることができる。
コンテナ環境の複数業者での利用時(マルチテナント)に、ネットワーク流量制限(ネットワーク層レベルの制限)に加えて、トピック数での論理レベルの流量制限(アプリケーション層レベルの制限)を実現することができる。
また、各コンテナのアプリケーション特性に合わせたトピック数での制限を実現することができる。例えば、プロキシ・マネージャは、プロキシ・ノードを起動する際に、アプリケーションのインストールを要求するユーザに応じて(若しくは、起動したコンテナ・ゲストにインストールするアプリケーションの特性や、アプリケーションの開発者の属性などに応じて)、ゲスト・ノードに対して課す通信量の制限(例えば、一定時間内で送信トピック数又は送信パケット量など)を、プロキシ・サーバに設定する。複数業者のアプリケーションをインストールするために、複数のプロキシ・ノード及び複数のコンテナ・ゲストを起動する際には、各プロキシ・ノードには対応するアプリケーションに応じた通信量の制限を設定する。
図22には、トピック通信量によるスロットリングの仕組みを図解している。同図において、コンテナ・ゲスト2210側のゲスト・ノード2211(パブリッシャ)から、コンテナ・ホスト2200側のホスト・ノード2201(サブスクライバ)へのデータ通信量を、プロキシ・ノード2202において制限している。
また、図23には、トピック通信量によるスロットリングを行なう処理シーケンス例を示している。
パブリッシャとして動作するコンテナ・ゲストは、プロキシ・ノードへ,データを送信する(S2301)。
プロキシ・ノードは、一定時間内で送信トピック数又は送信パケット量に対する通信量の制限を課しており、通信量制限を超えてコンテナ・ゲストからデータ通信が行なわれたときには、送信元のゲスト・ノードに通知する(S2302)。
コンテナを用いたグルーピングにより、所定の条件を満たさないアプリケーションを隔離する仕組みについて、図24を参照しながら詳細に説明する。
図24において、コンテナ・ホスト2400側では、データ送信用のアプリケーションがインストールされ、ホスト・ノード2401(パブリッシャ)として動作するとともに、データ受信用のアプリケーションがインストールされ、ホスト・ノード2402として動作している。
コンテナ・ゲスト2410を起動する前の処理として、コンテナ・ゲスト2410内のゲスト・マスタ2411に、データ送信用のホスト・ノード2401を対象とするプロキシ・ノード2403(パブリッシャ)のトピック名と、データ受信用のホスト・ノード2402を対象とするプロキシ・ノード2404(サブスクライバ)のトピック名を、登録する。
起動したコンテナ・ゲスト2410は、仮想NICによって論理的に分離されるアドレス又は名前空間である。コンテナ・ゲスト2410内には、第三者から提供されたような、所定の条件を満たさないアプリケーションがインストールされ、ゲスト・ノード2412として動作している。ここでは、ゲスト・ノード2412は、プロキシ・ノード2403と同じトピック名でサブスクライバとしてゲスト・マスタ2411に登録されるとともに、プロキシ・ノード2404と同じトピック名でパブリッシャとしてゲスト・マスタ2411に登録されているものとする。
コンテナ・ゲスト2410は仮想NICによって論理的に分離されるアドレス又は名前空間であり、したがって、コンテナ・ゲスト2410は、コンテナ・ホスト2400から隔離されている。ゲスト・ノード2412は、ゲスト・マスタ2411に登録したコンテナ・ゲスト2410側のトピックを経由して、コンテナ・ゲスト2410外、すなわちコンテナ・ホスト2400側とデータを送受信することができる。
ゲスト・ノード2412は、ゲスト・マスタ2411に登録されたプロキシ・ノード2403から、ホスト・ノード2401の送信データを受信することはできるが、コンテナ・ホスト2400で動作する(ゲスト・マスタ2411に登録されていない)ホスト・ノード2405からデータを受信することはできない。
また、ゲスト・ノード2412は、ゲスト・マスタ2411に登録されたプロキシ・ノード2404に対してデータを送信することによって、プロキシ・ノード2404を介してホスト・ノード2402にデータを送信することはできるが、コンテナ・ホスト2400で動作する(ゲスト・マスタ2411に登録されていない)ホスト・ノード2405へデータを送信することはできない。
また、ゲスト・ノード2412からのデータ受信用に起動されたプロキシ・ノード2404は、ゲスト・ノード2412からの受信データが、アプリケーションにあらかじめ規定された出力値の仕様範囲内かどうかをチェックする。そして、実施例5で説明したように、出力値の仕様範囲外であることを検知すると、ゲスト・ノード2412の停止や、古い、安定したバージョンのアプリケーションからゲスト・ノードを再起動するといった対応処理を実施する。
図6を参照しながら既に説明したように、ロボットや自動走行車、無人航空機といった自律動作装置100上では「認識」、「状況理解」、「行動計画」、「行動制御」に分類される多数のアプリケーション・プログラムが動作する。
図25には、ロボットを想定した自律動作装置100のアプリケーション・プログラムの構成例を示している。同図において、認識系アプリケーションから取得したデータを、状況理解系アプリケーションである「Input Adapter」経由で、独自のアルゴリズムを持つ画像分析アプリケーション「Image Analyzer」に入力する。
「Image Analyzer」が所定の条件を満たし、正常な動作を行なうことが保証されていれば、適切な画像解析結果を行動計画系のアプリケーション「Path planner」に出力し、「Path planner」はロボットが稼働する経路を適切に選択することができる。ところが、「Image Analyzer」が所定の条件を満たさず、プログラムの悪意若しくは何らかのバグによって不適切な画像解析結果を「Path planner」に出力した場合には、「Path planner」はロボットが稼働する経路を適切に選択することができなくなる。
そこで、図26に示すように、コンテナを用いたグルーピングを導入する。具体的には、参照番号2601で示すコンテナ・ゲストを起動し、所定の条件を満たさない「Image Analyzer」をこのコンテナ・ゲスト2601内にインストールして、外部から隔離したノードとして動作させる。また、「Image Analyzer」の入力側と出力側には、それぞれ参照番号2602、2603で示すプロキシ・ノードを準備して、「Input Adapter」と「Path planner」に送受信されるデータを制限することにより、不適切な画像解析結果を「Path planner」に出力しないようにする。プロキシ・ノード2603は、「Image Analyzer」から受信したデータがあらかじめ規定された出力値の仕様範囲外である場合には、実施例3(図17)で示した監視フレームワークを利用して、「Image Analyzer」のノードを停止させるようにしてもよい。また、プロキシ・ノード2603は、監視フレームワークを利用して、「Image Analyzer」のノードを、同等の機能を持つ別のノードを含むコンテナに切り替えるようにしてもよい。
図27には、自動走行車を想定した自律動作装置100のアプリケーション・プログラムの構成例を示している。同図において、状況理解系アプリケーションである「場に付与された交通ルール」と「空間・状態」が出力するデータを、「交通可能場所判断アプリケーション」に入力する。
「交通可能場所判断アプリケーション」が所定の条件を満たし、正常な動作を行なうことが保証されていれば、適切な交通場所の判断結果を行動計画系のアプリケーション「Behavior plan」に出力し、「Behavior plan」は自動走行車への適切な動作計画を作成することができる。ところが、「交通可能場所判断アプリケーション」が所定の条件を満たさず、プログラムの悪意若しくは何らかのバグによって不適切な判断結果を「Behavior plan」に出力した場合、「Behavior plan」は自動運転車への適切な動作計画を作成することができなくなる。
そこで、図28に示すように、コンテナを用いたグルーピングを導入する。具体的には、参照番号2801で示すコンテナ・ゲストを起動し、所定の条件を満たさない「交通可能場所判断アプリケーション」をこのコンテナ・ゲスト2601内にインストールして、外部から隔離したノードとして動作させる。また、「交通可能場所判断アプリケーション」の入力側と出力側には、それぞれ参照番号2802、2803、2804で示すプロキシ・ノードを準備して、「場に付与された交通ルール」と「空間・状態」と「Behavior plan」に送受信されるデータを制限することにより、不適切な交通可能場所の判断結果を「Behavior plan」に出力しないようにする。プロキシ・ノード2804は、実施例3(図17)で示した監視フレームワークを利用して、「交通可能場所判断アプリケーション」から受信したデータがあらかじめ規定された出力値の仕様範囲外である場合には、「交通可能場所判断アプリケーション」のノードを停止させるようにしてもよい。また、プロキシ・ノード2804は、監視フレームワークを利用して、「交通可能場所判断アプリケーション」のノードを、同等の機能を持つ別のノードを含むコンテナに切り替えるようにしてもよい。
このように、本明細書で開示する技術によれば、パブリッシャ/サブスクライバ型の非同期通信モデルを用いたシステムにおいて、コンテナと称されるグルーピング方法を導入して、コンテナに所属する構成ユニット(アプリケーションなど)又は構成ユニットに含まれるソフトウェアの所属するコンテナ内に通信を制限することができる。この技術によれば、構成ユニット開発における独立性を維持しつつ、構成ユニット又は構成ユニットに含まれるソフトウェアの任意のグルーピングが可能である。
また、本明細書で開示する技術によれば、コンテナを用いたグルーピングを利用して、同一のソースからの情報に対し、構成ユニット毎に割り当てる特性に応じた加工(例えば、構成ユニットのセキュリティ・レベルに合わせて情報を劣化する)を施した上で送信することができる。
また、本明細書で開示する技術によれば、コンテナを用いたグルーピングを利用して、更新・追加された構成ユニットに含まれるソフトウェアがシステム動作中に誤作動などを起こした場合には、その誤作動を検出し、システム動作を継続させながら、誤作動などを起こしたソフトウェアを更新・追加する前に動作が保証されていたソフトウェアの動作に切り替えることができる。
また、本明細書で開示する技術によれば、コンテナを用いたグルーピングを利用して、更新中の構成ユニットに関連する送受信データを一時保存し、更新後に一時保存した送受信データから接続を再開することで、構成ユニットや構成ユニットに含まれるソフトウェアを安全に更新・追加することができる。
また、本明細書で開示する技術によれば、コンテナを用いたグルーピングを利用して、構成ユニットが送受信するデータ量の制限を、物理レベル(パケット量)及び論理レベル(パブリッシャ/サブスクライバ通信で使用するトピック数)で実現し、マルチテナント(構成ユニットを複数の業者に提供する場合)においても、各々に均等なネットワーク・リソースを配分することができる。