[openrtm-users 00280] Re: 動的な入出力ポートの変化について

Ando Noriaki n-ando @ aist.go.jp
2007年 11月 26日 (月) 09:49:55 JST


産総研 安藤です

> 現在、接続数が増加したときに、接続させるポート数を
> 増やしていけるようなサーバのような形態をとるモジュールを
> 作成するために、試行錯誤をしています。
> 中略
> しかし、管理を簡単化するために配列等をつかって管理をしたいと思い行ってみたところ配列として宣言すると、初期化がうまくいきません。
>
> 実現したいコードの簡単な例としては、下記のようになります。
>
> -----module.h-----
>
> protected:
>  TimedLong m_in[2];
>  InPort<TimedLong> m_inIn[2];
>
> ----module.cpp------
>
> modele()
>  : ...
>   m_inIn[0]("in0",m_in[0]),
>   m_inIn[1]("in1",m_in[1]),

通常、初期化リストで配列を初期化することは出来ません。

> エラーには、
> expected '{' before '[' token
> expected unqualified-id before '[' token

ですので、このようなエラーが出ます。
データポートはコンストラクタにポート名と変数を与えなくてはいけないので、
メンバ変数の配列として持たせることは出来ません。

ポートを動的に変化させる方法を知りたいとのことでしたので、
以下のような方法はどうでしょうか?

以下は、SimpleIOサンプルのConsoleInCompに対して修正を加えて、
数値を入力するたびに、OutPortが一つ増えるというコードです。
(使いようがあるのかわからないですが)

[ConsoleIn.h]
ヘッダにて以下のように変数を宣言
  std::vector<TimedLong> m_outv;
  std::vector<OutPort<TimedLong>* > m_outOutv;
  int count; //ポートのインスタンス番号を管理するカウンタ

[ConsoleIn.cpp]
コンストラクタ
ConsoleIn::ConsoleIn(RTC::Manager* manager)
  : RTC::DataFlowComponentBase(manager),
    count(0), dummy(0)
{
countのみ初期化

onExecute()にて

RTC::ReturnCode_t ConsoleIn::onExecute(RTC::UniqueId ec_id)
{
  // 入力を格納する一時変数
  TimedLong out;

  std::cout << "Please input number: ";
  std::cin >> out.data;
  std::cout << "Sending to subscriber: " << out.data << std::endl;

  // OutPortにつける名前を作成
  std::string out_name("out");
  out_name += otos(count); // otos(): StringUtil.h

 // 変数を一つ増やす
  m_outv.push_back(out);
  // OutPort を一つ増やす
  m_outOutv.push_back(new OutPort<TimedLong>(out_name.c_str(), m_outv.back()));
  // OutPortを登録
  registerOutPort(out_name.c_str(), *(m_outOutv.back()));

  // 全部のOutPortから値を出力
  for (int i(0), len(m_outv.size()); i < len; ++i)
    {
      m_outv[i] = out;
      m_outOutv[i]->write();
    }

  ++count; // カウンタを増やす。
  return RTC::RTC_OK;
}


これで、動的にOutPortが増やせます。
ConsoleInでOutPortを増やしたときのRtcLinkの画像(笑)と、
このコードの完全版を添付します。
example/SimpleIOのしたにコピーして、コンパイルすれば動くはずです。
-- 
安藤慶昭@独立行政法人産業技術総合研究所 研究員
                   知能システム研究部門 タスクインテリジェンス研究グループ
                   〒305-8568 茨城県つくば市梅園1-1-1 中央第2
                   TEL: 029-861-5981 FAX: 029-861-5971
                   n-ando @ aist.go.jp, n-ando @ ieee.org
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: dynamic_port.png
型:         image/png
サイズ:     54908 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20071126/512fe1b9/attachment-0001.png>
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: DynamicOutport.tgz
型:         application/x-gzip
サイズ:     1936 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20071126/512fe1b9/attachment-0001.bin>


openrtm-users メーリングリストの案内