Open moritaritsuko opened 9 years ago
ソースコードを見て確認しましたが、現在TypeCodeTblが固定になっています。 ユーザ定義のデータ型を擁するには、Port.cの中にある Port_getTypeCode関数でTypecodeを返さなければいけません。 この実装を lib/orb/corba-typecode.c にある CORBA_TypeCode_get_by_repoid関数に置き換えれば、大丈夫だと思います。(まだ、こちらでは動作未確認です)
現在の実装のままでは、独自データ型のポート生成は不可能です。
現在の実装のままでは、独自データ型のポート生成は不可能です。
ユーザ定義データ型の動作確認の方、よろしくお願いします。
では、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’ です
ユーザ定義のデータ型を使うために、Port_createPort関数の引数を変更しました。今までは、文字列でデータ型を指定していましたが、CORBA_TypeCode型の変数を引数に取るようjにしています。 これで、ユーザ定義型のデータ型の取り扱いには特にライブラリのソースコードの変更をしなくてよいようになっています。
現在のところexampleにあるMyDataのコンポーネントでの動作は確認していますが、すべてのデータ型に対応しているとは言い切れません。 特に64ビットOS上で動作させる場合には、アライメントがOSやコンパイラに依存しますので、32ビットOSのみでの使用を奨励しています。
回答ありがとうございます。 修正されたファイルを展開し、MyDataOutCompとMyDataInCompのサンプルコンポーネントを 「MyStruct2」のポートを接続し、Activateしたところ、MyDataOutCompコンポーネントが終了してしまいました。
lib\rtm\Makefileに、下記のコンパイルオプションが追加されていたため、有効にしてコンパイルして みましたが、同じ結果となりました。 #CFLAGS += -DOS64
ソース検索したところ、コンパイルオプション「OS64」を使用しているファイルが、 「lib/orb/giop-marshal.c」でした。 そのため、lib\orb\Makefileに、上記のコンパイルオプションが定義されていませんでしたが、 定義を追加してコンパイルしたところ、MyDataOutCompとMyDataInCompコンポーネントが 終了することなく、実行することができました。 (コンソール画面に出力されている内容で確認しました。)
上記対応で、問題ないでしょうか。
はい、それで問題ありません。 #8に関しては、この修正からわかると思いますが、データ型の指定方法が変わっています。 詳細は、#8の方にフォローしておきます。
ユーザ定義データ型を使用したサンプル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ファイルにデータ型を定義してコンパイルするだけでなく、 他に定義等を行う必要があるのでしょうか。 (「使用できていない可能性があります」とは記載されていますが。)