[openrtm-users 00168] Re:

Ando Noriaki n-ando @ aist.go.jp
2007年 7月 27日 (金) 16:37:10 JST


賀田様
OpenRTM-aistユーザの皆様

ユーザ定義のデータ型をInPortおよびOutPortで使用する方法についてですが、
簡単な方法を思いつきましたのでご報告します。

まず、使用したいデータ型を以下のように適当なIDLファイルに記述します。

ImageType.idl
---------------------------------------
struct Imagetype
{
    long point_size;
    long Send_Buf[3][10000];
    long Image_New;
    float address;
};

struct TimedImagetype
{
    RTC::Time tm;
    Imagetype data;
};
---------------------------------------

このファイルをコンポーネントを作成するディレクトリにおきます。
次に、rtc-templateでコンポーネントを作成します。
その際に、このIDLファイルを--consumer-idlオプションに指定します。

rtc-template -bcxx \
    --module-name=ConsoleIn --module-type='DataFlowComponent' \
    --module-desc='Console input component' \
    --module-version=1.0 --module-vendor='Noriaki Ando, AIST' \
    --module-category=example \
    --module-comp-type=DataFlowComponent --module-act-type=SPORADIC \
    --module-max-inst=10 --outport=out:TimedImagetype \
    --consumer-idl=MyImageType.idl

この例では、MyImageType.idlで定義したTimedImagetypeを
OutPortのデータ型として用いています。
生成されたコードをコンパイルします。

make -f Makefile.ConsoleIn

コンパイルが通るはずです。
コンポーネント内でのデータの使用方法は通常のものと同じです。

これと同じデータ型を他のコンポーネントでも使用したい場合は、
このIDLファイルだけコピーして、同様にrtc-templateの--consumer-idl
オプションでファイルを指定してください。

まだ、これで実際にコンポーネントを作成して試していないので、
もし、この方法で出来ましたらメーリングリストでご報告いただければとおもいます。
(出来ない場合も教えてください。)


07/07/18 に Ando Noriaki<n-ando @ aist.go.jp> さんは書きました:
> 賀田さま
>
> 産総研の安藤です
>
> 下記の手順でほとんどあっていると思いますが、
>
> > はじめまして。中央大学理工学部國井研究室4年の賀田と申します。
> > 現在OpenRTMの勉強中です。開発環境はVM上でのOpenRTM-aist-FC6です。
> >
> > 画像の送受信をするコンポーネントを作ろうと思い、以前先輩が作ったコンポーネン
> > トを参考にしました。
> > そのソースのヘッダファイルに、 "TimedImagetype" という変数の型があり、これ
> > が画像の送受信用のものと判断しました。
> > ところがOpenRTMのデベロッパーズガイドを見ると "TimedImagetype"という型は無い
> > ことがわかりました。
> > そこで自分で型を定義する必要があると考え、
> > /home/openrtm/OpenRTM-aist-0.4.0/rtm/idl にある、"BasicDataType.idl"を編集し
> > ました。編集内容は以下の通りです。
> >
> >
> > 〜BasicDataType.idl〜
> > struct Imagetype{
> >     long point_size;
> >     long Send_Buf[3][10000];
> >     long  Image_New;
> >     float address;
> > };
> >
> > struct TimedImagetype{
> >    Time tm;
> >    Imagetype data;
> > };
> >
> > *これらの構造体を追加。内容は以前先輩が作ったものと同じ。
> >
> >
> > このIDLファイルをメイクし、"BasicDataType.hh"が変更されるのも確認しました。
>
> この、変更されたヘッダはシステムのヘッダのディレクトリにインストールされていますか?
> つまり、変更後 make install をましたか?
>
> > そしてテンプレートの "ConsoleIn.h"を以下のように編集しました。
>
> テンプレートのConsoleIn.hとは?
>
> > 〜ConsoleIn.h〜
> > TimedImagetype m_imageout;
> > OutPort<TimedImagetype> m_Outimage;
> >
> > *これらの構造体変数とインスタンスを追加。
> >
> >
> > こうしてテンプレートの "Makefile.ConsoleIn" をメイクしたところ、以下のような
> > エラーがでました。
> >
> >
> > 〜エラーの内容〜
> > error:  TimedImagetype' does not name a type
> > error:  TimedImagetype' was not declared in this scope
> > error:  template argument 1 is invalid
>
> コンパイル時にヘッダを探すパスに、先ほど変更された.hhのファイルが
> 存在するディレクトリは含まれていますか?
>
> あと、ひとつ気になるのは、新たに作成したTimedImagetypeのネームスペースは
> どこでしょうか?
> もし、RTCのネームスペースにあるのであれば、
>
> RTC::TimedImagetype m_imageout;
> OutPort<RTC::TimedImagetype> m_Outimage;
>
> とすべきですね。
>
> > 根本的に間違っているんでしょうか?今の僕にはどうしたら良いかわかりません。
> > よろしかったらどこが間違っているか教えていただけないでしょうか?
> > もし、根本的に間違っていたら、どうしたらRTで画像データのやり取りができるか教
> > えていただきたいです。
> > よろしくお願い致します。
> >
>
>
> --
> 安藤慶昭@独立行政法人産業技術総合研究所 研究員
>                   知能システム研究部門 タスクインテリジェンス研究グループ
>                   〒305-8568 茨城県つくば市梅園1-1-1 中央第2
>                   TEL: 029-861-5981 FAX: 029-861-5971
>                   n-ando @ aist.go.jp, n-ando @ ieee.org
>


-- 
安藤慶昭@独立行政法人産業技術総合研究所 研究員
                   知能システム研究部門 タスクインテリジェンス研究グループ
                   〒305-8568 茨城県つくば市梅園1-1-1 中央第2
                   TEL: 029-861-5981 FAX: 029-861-5971
                   n-ando @ aist.go.jp, n-ando @ ieee.org



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