並木様
産総研の栗原です。
OpenRTM-aistのバージョン0.4系と1.0系とでは、get_ports()のIDLでの定義
が変更されています。(他にもIDLレベルでの変更もございます。)
0.4系 -> PortList get_ports();
1.0系 -> PortServiceList get_ports();
よって、PortListHolderではなく、PortServiceListHolderを使用するように
変更する事で接続できるようになるかと思います。
以下のソースを、
> PortListHolder p1 = new PortListHolder();
> PortListHolder p2 = new PortListHolder();
PortServiceListHolder p1 = new PortServiceListHolder();
p1.value = new PortService[0];
PortServiceListHolder p2 = new PortServiceListHolder();
p2.value = new PortService[0];
のように変更し、ご確認頂けますでしょうか?
参考までに、OpenRTM-aist-Java-1.0.0のSimpleIOサンプルに
含まれておりますConnectorComp.javaを添付させて頂いて
おります。
また、以前、株式会社セックの中本様が0.4.2から1.0.0への変更点を
まとめてくださった資料をこちらのMLに流して下さいました。
とてもわかりやすくまとめて下さっておりますので、こちらの資料も
添付させて頂いております。
以上、宜しくお願い致します。
On Tue, 01 Mar 2011 15:55:56 +0900
Shuichiro Namiki wrote:
> 並木と申します。
> 今回、初めて質問いたします。よろしくお願いします。
>
> 最近、OpenRTMをはじめまして、
> 別の方が0.4.2で作成した内容を1.0.0で
> 作り直すことになりました。
> (言語はJavaを使用しています)
>
> 0.4.2では以下のようなソースでポートを接続していたのですが、
> 1.0.0ではDataFlowComponentからget_portsを使用しようとすると
> ClassCastExceptionを起こしてしまい、キャストできずに
> PortServiceの取得ができません。
> (0.4.2で動作することは確認が取れております)
>
> 0.4.2→1.0.0にする上でどこに差分があって、
> どのように修正すればよいか
> ご存知な方教えていただけますようお願いいたします。
>
>
> (0.4.2で作成済みのソースから抜粋)
> ====
> String connector_id = null;
> ConnectorProfile prof = null;
>
> // サーバ側のCobraConsumerを取得
> CorbaConsumer consumerServerDB = null;
> ORB orb = ORBUtil.getOrb();
> CorbaNaming naming = new CorbaNaming(orb, nameServer);
> // nameServerは文字列"localhost:2809"
>
> consumerServerDB =
> new CorbaConsumer(DataFlowComponent.class);
> consumerServerDB.setObject(naming.resolve(serverURI + ".rtc"));
> // serverURIは任意指定の文字列
>
> // ローカル側のCobraConsumerを取得
> CorbaConsumer consumerLocalDB = null;
> consumerLocalDB =
> new CorbaConsumer(DataFlowComponent.class);
> consumerLocalDB.setObject(naming.resolve(thisConsumerName + ".rtc"));
> // thisConsumerNameは任意指定の文字列
>
> PortListHolder p1 = new PortListHolder();
> PortListHolder p2 = new PortListHolder();
>
> // サーバ側とローカル側のポートを取得
> // ★ここで1.0.0の場合はキャスト失敗する★
> p1.value =
> ((DataFlowComponent) consumerServerDB._ptr()).get_ports();
> p2.value =
> ((DataFlowComponent) consumerLocalDB._ptr()).get_ports();
>
> prof = new ConnectorProfile();
> connector_id = serverURI + "_" + thisConsumerName;
> prof.connector_id = connector_id;
> prof.name = connector_id;
> prof.properties = new NameValue[0];
> prof.ports = new Port[2]; // 1.0.0ではPortからPortServiceに変更
> prof.ports[0] = p1.value[0];
> prof.ports[1] = p2.value[0];
>
> // ローカルとサーバのポートを接続
> ConnectorProfileHolder proflist = new ConnectorProfileHolder(prof);
> proflist.value = prof;
> ReturnCode_t ret = prof.ports[0].connect(proflist);
> ====
>
> (ソースから抜粋)の9行目、14行目をではなく、
> に変えてみたりもしたのですが、
> RTCBuilderで生成する際にDataFlowを指定しているので
> 今度は(というかやはり)最後のconnectで接続失敗してしまいます。
>
>
> 以上です。よろしくお願いいたします。
>
>
並木と申します。
今回、初めて質問いたします。よろしくお願いします。
最近、OpenRTMをはじめまして、
別の方が0.4.2で作成した内容を1.0.0で
作り直すことになりました。
(言語はJavaを使用しています)
0.4.2では以下のようなソースでポートを接続していたのですが、
1.0.0ではDataFlowComponentからget_portsを使用しようとすると
ClassCastExceptionを起こしてしまい、キャストできずに
PortServiceの取得ができません。
(0.4.2で動作することは確認が取れております)
0.4.2→1.0.0にする上でどこに差分があって、
どのように修正すればよいか
ご存知な方教えていただけますようお願いいたします。
(0.4.2で作成済みのソースから抜粋)
====
String connector_id = null;
ConnectorProfile prof = null;
// サーバ側のCobraConsumerを取得
CorbaConsumer consumerServerDB = null;
ORB orb = ORBUtil.getOrb();
CorbaNaming naming = new CorbaNaming(orb, nameServer);
// nameServerは文字列"localhost:2809"
consumerServerDB =
new CorbaConsumer(DataFlowComponent.class);
consumerServerDB.setObject(naming.resolve(serverURI + ".rtc"));
// serverURIは任意指定の文字列
// ローカル側のCobraConsumerを取得
CorbaConsumer consumerLocalDB = null;
consumerLocalDB =
new CorbaConsumer(DataFlowComponent.class);
consumerLocalDB.setObject(naming.resolve(thisConsumerName + ".rtc"));
// thisConsumerNameは任意指定の文字列
PortListHolder p1 = new PortListHolder();
PortListHolder p2 = new PortListHolder();
// サーバ側とローカル側のポートを取得
// ★ここで1.0.0の場合はキャスト失敗する★
p1.value =
((DataFlowComponent) consumerServerDB._ptr()).get_ports();
p2.value =
((DataFlowComponent) consumerLocalDB._ptr()).get_ports();
prof = new ConnectorProfile();
connector_id = serverURI + "_" + thisConsumerName;
prof.connector_id = connector_id;
prof.name = connector_id;
prof.properties = new NameValue[0];
prof.ports = new Port[2]; // 1.0.0ではPortからPortServiceに変更
prof.ports[0] = p1.value[0];
prof.ports[1] = p2.value[0];
// ローカルとサーバのポートを接続
ConnectorProfileHolder proflist = new ConnectorProfileHolder(prof);
proflist.value = prof;
ReturnCode_t ret = prof.ports[0].connect(proflist);
====
(ソースから抜粋)の9行目、14行目をではなく、
に変えてみたりもしたのですが、
RTCBuilderで生成する際にDataFlowを指定しているので
今度は(というかやはり)最後のconnectで接続失敗してしまいます。
以上です。よろしくお願いいたします。