Manager::createComponentについて
Simple Wiki Based Contents Management System
関心分野 >> RTミドルウェア >> Manager::createComponentについて

Manager::createComponent()

このメソッドは、RTコンポーネントを生成するためのルーチンである。マニュアルによると
指定したRTコンポーネントのインスタンスを登録されたFactory経由 で生成する。
インスタンス生成が成功した場合、併せて以下の処理を実行する。

  * 外部ファイルで設定したコンフィギュレーション情報の読み込み,設定
  * ExecutionContextのバインド,動作開始
  * ネーミングサービスへの登録
となっている。では、詳細にソースコードを読んでみる。

引数

引数は、通常は、RTコンポーネントの名前であるが、char *comp_arg となっている。これは、生成するコンポネントの名前(ID)とオプション設定を同時に指定できるようになっている。
引数の形は、
id?key0=value0&key1=value1...
RTC:[vendor]:[category]:impl_id:[version]
RTC:::ID:
となっており、最初に procComponentArgs関数を呼び出して、処理している。procComponentArgs関数では、RTコンポーネントのIDに関する処理も行っている。すなわち、OpenRTM-aistでは、RTコンポーネントのIDは、で表すようになっている。そのため、createComponent関数でIDのみを与えると、と変換されている。また、IDには、":"を入れてはいけないようにもなっている。
procComponentArgs(const char *comp_arg, coil::Properties& comp_id, coil::Properties& comp_conf);
を呼び出すと、comp_argsが処理され、
comp_id["RTC"]=id[0]
comp_id["vendor"]=id[1]
comp_id["category"]=id[2]
comp_id["implementation_id"]=id[3]
comp_id["version"]=id[4]
と分解される。
また、comp_argsがコンフィギュレーション付きである場合には、
comp_conf[key0]=value0
comp_conf[key1]=value1
      ...
となる。

createComponent の処理

createComponent メソッドでは、RTコンポーネントの生成に必要な手続きを行う。大まかにいうと次のようになる。
  • 引数の処理し、comp_args -> comp_id, comp_propを得る。
  • comp_propに "exportted_ports"があるかどうかを確認して、exported_portsの処理を行う。
  • 予め設定された comp_idに対するFactoryを用いてRTコンポーネント生成する。Factoryがない場合には、ローダブルモジュールとみなしてモジュールをファイルから読み込みFactoryを設定する。これも失敗すれば、エラーとなる。
  • coil::Properties prop = factory->profile()とする。さらに、comp_propの内容を propに追加する。
  • inherit_propで定義しているプロパティについて設定されていなければ、m_configにある対応するプロパティを設定する。inherit_propは、以下のとおり。
const char* inherit_prop[] = {
  "exec_cxt.periodic.type",
  "exec_cxt.periodic.rate",
  "exec_cxt.evdriven.type",
  "naming.formats",
  "logger.enable",
  "logger.log_level",
  "naming.enable",
  "naming.type",
  "naming.formats",
  ""
};
  • RTObject_impl *comp = factory->create(this) でRTコンポーネンオブジェクトを生成する。
  • configureComponent(comp, prop)を呼び出して、RTコンポーネントにプロパティを設定する。このときpropのプロパティにcategory.type_name.config_file,category.instance_name.config_fileに記載されている内容を上書きする。プロパティの優先度は、category.instance_name.config_fileの内容が最も高く、propの内容が最も低い。
  • comp->initialize() を呼び出して初期化する。この処理は、RTコンポーネントの生成状態にあたる。詳細は、RTコンポーネントの振舞を参照。
  • registerComponent(comp)を呼び出して生成したRTコンポーネントを登録し、compを返す。resisterComponent関数では、m_compManager.registerObjectを呼び出すとともに、NameServerに登録を行う。m_compManagerは、ObjectManagerオブジェクトであるが、std::vector<Object*>で生成されたオブジェクトを管理しているようである。