haraisao / RtORB

Light-weight CORBA implementation with C-Language.
Other
2 stars 1 forks source link

OpenRTM-aist-C(RtORB)でのユーザ定義データ型の使用について #6

Open moritaritsuko opened 9 years ago

moritaritsuko commented 9 years ago

ユーザ定義データ型を使用したサンプルRTコンポーネントを起動するとエラーとなります。

環境  Windows7(64bit)上のVMware(Ubuntu12.04) 手順  1.ネームサーバを起動 ($cd CosName、$sh NameService.sh)  2.サンプルRTコンポーネントを起動 ($cd example/MyDataIO、$sh MyDataInComp.sh)   ⇒下記のメッセージが表示され、RTコンポーネントを起動できませんでした。    Data Type Error. [MyData_MyStruct2] is not matched.    Create new PortAdmin.    ERROR: Fail to initialize a component.    --- ERROR --     [ERROR] Can't Unbind Object. [repo_id=(null)]     [NameServer] Unbinding RTC to NameServer is done.    [Exit] is done.    Failed to create component.    Creating a component: "MyDataIn"....Aborted (core dumped)   ⇒この時、起動していたネームサーバが、下記のエラーとなり、終了しました。    bind :Bad Context Name..    Segmentation fault (core dumped)

 gdbデバッガで確認したところ、「RTC_InPort_create()」でポート生成時、「TypeCodeTbl[]」(Port.h)に  登録されていない型のためエラーとなっているようです。

★ユーザ定義データ型を使用する際、IDLファイルにデータ型を定義してコンパイルするだけでなく、  他に定義等を行う必要があるのでしょうか。  (「使用できていない可能性があります」とは記載されていますが。)

haraisao commented 9 years ago

ソースコードを見て確認しましたが、現在TypeCodeTblが固定になっています。 ユーザ定義のデータ型を擁するには、Port.cの中にある Port_getTypeCode関数でTypecodeを返さなければいけません。 この実装を lib/orb/corba-typecode.c にある CORBA_TypeCode_get_by_repoid関数に置き換えれば、大丈夫だと思います。(まだ、こちらでは動作未確認です)

現在の実装のままでは、独自データ型のポート生成は不可能です。

moritaritsuko commented 9 years ago

現在の実装のままでは、独自データ型のポート生成は不可能です。

ユーザ定義データ型の動作確認の方、よろしくお願いします。

では、lib\rtm\idl\BasicDataType.idlで定義されているデータ型(たとえば、TimedString)を利用して、 OpenRTM-aist-Python等で作成されたRTコンポーネントとOpen-RTM-aist-Cで作成した RTコンポーネントを接続したい場合、どう対応すればよいのでしょうか。 (OpenRTM-aist-1.0.0(C++)で作成のRTCとの接続OKとのことですが。)

OpenRTM-aist-C(RtORB)で、データポートのデータ型に、「TimedString」を定義して  <~.h>    RTC_OutPort m_outPort;    TimedString m_outData;  <~.c>   private->m_outPort = RTC_OutPort_create(obj->m_rtobjRef, "out", "TimedString"); コンパイルすると、下記のエラーとなりました。  SampleIN0.h:16:3: エラー: 不明な型名 ‘TimedString’ です

haraisao commented 9 years ago

ユーザ定義のデータ型を使うために、Port_createPort関数の引数を変更しました。今までは、文字列でデータ型を指定していましたが、CORBA_TypeCode型の変数を引数に取るようjにしています。 これで、ユーザ定義型のデータ型の取り扱いには特にライブラリのソースコードの変更をしなくてよいようになっています。

現在のところexampleにあるMyDataのコンポーネントでの動作は確認していますが、すべてのデータ型に対応しているとは言い切れません。 特に64ビットOS上で動作させる場合には、アライメントがOSやコンパイラに依存しますので、32ビットOSのみでの使用を奨励しています。

moritaritsuko commented 9 years ago

回答ありがとうございます。 修正されたファイルを展開し、MyDataOutCompとMyDataInCompのサンプルコンポーネントを 「MyStruct2」のポートを接続し、Activateしたところ、MyDataOutCompコンポーネントが終了してしまいました。

lib\rtm\Makefileに、下記のコンパイルオプションが追加されていたため、有効にしてコンパイルして みましたが、同じ結果となりました。  #CFLAGS += -DOS64

ソース検索したところ、コンパイルオプション「OS64」を使用しているファイルが、 「lib/orb/giop-marshal.c」でした。 そのため、lib\orb\Makefileに、上記のコンパイルオプションが定義されていませんでしたが、 定義を追加してコンパイルしたところ、MyDataOutCompとMyDataInCompコンポーネントが 終了することなく、実行することができました。 (コンソール画面に出力されている内容で確認しました。)

上記対応で、問題ないでしょうか。

haraisao commented 9 years ago

はい、それで問題ありません。 #8に関しては、この修正からわかると思いますが、データ型の指定方法が変わっています。 詳細は、#8の方にフォローしておきます。