Android 版 OpenRTM とのソースコードの差分について¶
Android 版 OpenRTM( 未来技術研究所様作成 ) は、 JacORB を使用している。 aist 版では、 sun 依存にする部分がある。
今後のバージョンアップを考慮して、移植作業の工数を減らす( 理想としては、移植作業が不要にする )ため、ソースコード差分を減らす、または、aist 版で JacORB を使用することを検討する。
作成:片見
ソースコードの移植作業について¶
aist 版 ( r597 ) との差分を示す。r597 は、未来技術研究所様の依頼で、差分を減らすように修正したもの。
以下は、 Android 版 OpenRTM のソースコードと差分とったものではなく、未来技術研究所 高木さまからのメールの資料から抽出。
移植のために修正が必要なファイルを以下に示す。
- jp/go/aist/rtm/RTC/IopIorInterceptor.java
- jp/go/aist/rtm/RTC/Manager.java
- jp/go/aist/rtm/RTC/ManagerConfig.java
- jp/go/aist/rtm/RTC/ManagerServant.java
- jp/go/aist/rtm/RTC/port/CorbaPort.java
- jp/go/aist/rtm/RTC/util/ORBUtil.java
- jp/go/aist/rtm/RTC/port/EncapsOutputStreamExt.java
jp/go/aist/rtm/RTC/IopIorInterceptor.java¶
aist 版では endpoint の取得で、sun 依存のクラスを使用している。
ソースコードで JacORB のコメントされているところを活かして、 sun とコメントされているところをコメントアウトすることにより、sun と JacORB の切り替えを行う。
--- .jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/IopIorInterceptor.java 2011-12-08 16:05:48.000000000 +0900 +++ .jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/IopIorInterceptor.java 2011-12-12 10:47:41.000000000 +0900 @@ -14,6 +14,15 @@ import org.omg.IOP.TaggedComponent; import org.omg.PortableInterceptor.IORInterceptor; +/* +//<+JacORB +import org.jacorb.orb.etf.ProtocolAddressBase; +import org.jacorb.orb.iiop.IIOPAddress; +import org.jacorb.orb.iiop.IIOPProfile; +import java.util.List; +import java.util.Iterator; +//+> +*/ /** * {@.ja ポータブルインターセプタを利用してIORを書き換える.} @@ -93,6 +102,7 @@ return; } + //<+ sun com.sun.corba.se.spi.orb.ORB sunorb = (com.sun.corba.se.spi.orb.ORB)orb; @@ -103,6 +113,29 @@ = (com.sun.corba.se.spi.ior.iiop.IIOPProfileTemplate)iop.getTaggedProfileTemplate(); String host = ptemp.getPrimaryAddress().getHost(); short port = (short)ptemp.getPrimaryAddress().getPort(); + //+> + +/* + //<+ JacORB + ProtocolAddressBase address = null; + org.jacorb.orb.ORB jacorb = (org.jacorb.orb.ORB)orb; + if (jacorb.getBasicAdapter() == null) { + return; + } + List eplist = jacorb.getBasicAdapter().getEndpointProfiles(); + for (Iterator i = eplist.iterator(); i.hasNext(); ) { + org.omg.ETF.Profile p = (org.omg.ETF.Profile)i.next(); + if (p instanceof IIOPProfile) { + address = ((IIOPProfile)p).getAddress(); + break; + } + } + if (address == null) { + return; + } + short port = (short)((IIOPAddress)address).getPort(); + //+> +*/ for(int ic=0;ic<m_endpoints.size();ic++){ if(m_endpoints.get(ic).Port==0){
jp/go/aist/rtm/RTC/Manager.java¶
ORB の起動 ( init() ) の引数を生成する際に、 sun 依存のものを使用。
ソースコードの final の String 変数を以下のように設定することにより、sun と JacORB の切り替えが可能。
№ | 変数名 | sun を使用する場合 | JacORB を使用する場合 |
SERVER_HOST | "com.sun.CORBA.ORBServerHost" | "OAIAddr" | |
SERVER_PORT | "com.sun.CORBA.ORBServerPort" | "OAPort" | |
LISTENER_PORT | "com.sun.CORBA.POA.ORBPersistentServerPort" | "OAPort" |
+ private static final String SERVER_HOST = "com.sun.CORBA.ORBServerHost"; + private static final String SERVER_PORT = "com.sun.CORBA.ORBServerPort"; + private static final String LISTENER_PORT = "com.sun.CORBA.POA.ORBPersistentServerPort"; + //private static final String SERVER_HOST = "OAIAddr"; + //private static final String SERVER_PORT = "OAPort"; + //private static final String LISTENER_PORT = "OAPort";
jp/go/aist/rtm/RTC/ManagerConfig.java¶
rtc.conf をサーチする path に差異がある。
CONFIG_FILE_PATH のファイルパスの変更。
public static final String[] CONFIG_FILE_PATH = { "./rtc.conf", - "/etc/rtc.conf", - "/etc/rtc/rtc.conf", - "/usr/local/etc/rtc.conf", - "/usr/local/etc/rtc/rtc.conf", + "/sdcard/rtc.conf", + "/mnt/sdcard/rtc.conf", null };
jp/go/aist/rtm/RTC/ManagerServant.java¶
マネージャを CORBA 化して、参照を登録する部分で sun 依存の ORB を使用している。
createManagerCORBAServant() 内の orb のキャストを変更することで sun と JacORB を切り替える。
sun の場合は、com.sun.corba.se.impl.orb.ORBImpl を活かして、 JacORB の場合は、org.jacorb.orb.ORB を活かす。
+ private void createManagerCORBAServant() throws Exception { + m_mgr.getPOA().activate_object( this ); + com.sun.corba.se.impl.orb.ORBImpl orb + = (com.sun.corba.se.impl.orb.ORBImpl)m_mgr.getORB(); +// org.jacorb.orb.ORB orb +// = (org.jacorb.orb.ORB)m_mgr.getORB(); + orb.register_initial_reference( + "manager", m_mgr.getPOA().servant_to_reference(this) ); + }
jp/go/aist/rtm/RTC/port/CorbaPort.java¶
org.omg.CORBA.ObjectHelper を JacORB 未実装のため削除
--- jp/go/aist/rtm/RTC/port/CorbaPort.java 2010-05-07 13:50:17 +0900 +++ jp/go/aist/rtm/RTC/port/CorbaPort.java 2011-08-11 09:03:39 +0900 @@ -17,7 +17,7 @@ import org.omg.CORBA.ORB; import org.omg.CORBA.BAD_OPERATION; import org.omg.CORBA.Object; -import org.omg.CORBA.ObjectHelper; import org.omg.CORBA.Any; import org.omg.CORBA.TCKind; import org.omg.PortableServer.Servant; @@ -792,37 +792,37 @@ } - private class subscribe implements operatorFunc { - - public subscribe(Vector<Consumer> cons) { - - this.m_cons = new Vector<Consumer>(cons); - this.m_len = cons.size(); - } - - public void operator(java.lang.Object elem) { - - operator((NameValue) elem); - } - - public void operator(NameValue nv) { - - for (int i = 0; i < this.m_len; ++i) { - if (this.m_cons.get(i).name.equals(nv.name)) { - try { - org.omg.CORBA.Object obj = ObjectHelper.extract(nv.value); - if( obj != null ) { - this.m_cons.get(i).consumer.setObject(obj); - } - } catch (BAD_OPERATION ignored) { - } - } - } - } - - private Vector<Consumer> m_cons; // コンストラクタで必ず初期化されるので、ここではインスタンス生成しない。 - private int m_len; - } // functors /**
jp/go/aist/rtm/RTC/util/ORBUtil.java¶
JacORBは、ロガー(Logger)未対応のためコメント
@@ -41,9 +41,9 @@ if (orb == null) { orb = ORB.init(args, prop); try { - if (orb instanceof com.sun.corba.se.spi.orb.ORB) { - Logger logger = ((com.sun.corba.se.spi.orb.ORB) orb).getLogger(""); - logger.setLevel(Level.SEVERE); // log + if (orb instanceof org.jacorb.orb.ORB) { +// Logger logger = ((org.jacorb.orb.ORB) orb).getLogger(""); +// logger.setLevel(Level.SEVERE); // log } } catch (Exception e) { e.printStackTrace(); // system error
jp/go/aist/rtm/RTC/port/EncapsOutputStreamExt.java¶
データポートでシリアル化するために sun 依存のクラスを使用。
№ | 移植のための修正 | sun を使用する場合 | JacORB を使用する場合 |
ORB クラスのインポート | com.sun.corba.se.spi.orb.ORB | org.omg.CORBA.ORB | |
Stream クラスのインポート | com.sun.corba.se.impl.encoding.EncapsOutputStream | org.jacorb.orb.CDROutputStream | |
EncapsOutputStreamExt 継承するクラス | EncapsOutputStream | CDROutputStream | |
コンストラクタのスーパークラスの呼び出し | super((ORB)orb,isLittleEndian); | super((ORB)orb); | |
getByteArray()メソッド | return toByteArray(); | return getBufferCopy(); |
package jp.go.aist.rtm.RTC.port; /** * {@.ja EncapsOutputStreamの拡張クラス。} * {@.en Expansion class of EncapsOutputStream} */ import com.sun.corba.se.impl.encoding.EncapsOutputStream; import com.sun.corba.se.spi.orb.ORB; //import org.jacorb.orb.CDROutputStream; //import org.omg.CORBA.ORB; //public class EncapsOutputStreamExt extends CDROutputStream { public class EncapsOutputStreamExt extends EncapsOutputStream { /** * {@.ja コンストラクタ} * {@.en Constructor} * <p> * */ public EncapsOutputStreamExt(org.omg.CORBA.ORB orb, boolean isLittleEndian) { super((ORB)orb,isLittleEndian); //super((ORB)orb); } /** * {@.ja ストリームの内容を配列で取得する。} * {@.en Gets the content of the stream in the array.} * <p> */ public final byte[] getByteArray(){ return toByteArray(); //return getBufferCopy(); } }
aist 版での JacORB の使用¶
概要¶
aist 版で sun ではなく、 JacORB を使用することにより、移植作業が不要となる。
そのため、 aist 版で JacORB を使用することを検討する。(Linux で確認。 )
調査/検討¶
sun 依存のクラスは、シリアライズ (EncapsInputStream,EncapsOutputStream) で使用してる。
その代替えとして JacORB の CDRInputStream,CDROutputStream の使用を検討したが、CDROutputStream は endian の設定ができないことがわかった。(CDRInputStream では endian のための実装がされている。 )
CDROutputStream を継承して endian のための実装をすることも可能であるが、本筋から外れるので、これは考慮しないものとする。
JacORB は、 OpenRTM-aist の一部の仕様 ( データポート接続のエンディアン設定機能 ) を満すことができいため、JacORB は採用は見送ることとする。
ただし、今後、JacORB がバージョンアップにより CDROutputStream の endian の実装がされれば、再検討する。
データポート接続のエンディアン設定機能を使用せず、多言語間の接続を Bigエンディアンで接続するという機能限定で使用する場合は、JacORB を使用することができる。
詳細¶
以下に他項目の検討内容を示す。
JacORB のインストール¶
JacORB は、sun-java に同梱されていないため、コンパイルおよびインストールする必要がある。
http://www.jacorb.org/download.html
コンパイルおよびインストールには、JDK と ANT が必要となる。
※ Java JDK 1.5 or above is required for JacORB 2.3.1
ビルド¶
rtm をビルドする際に、JacORB(/usr/local/JacORB/classes) の classpath を追加する。
idl コンパイラは idlj を使用してもエラーは発生しない。
※ RTCB の出力を変更する必要あり。
動作確認¶
- classpath に以下を追加する。
- /usr/local/JacORB/classes
- /usr/local/JacORB/lib/avalon-framework-4.1.5.jar
- java起動オプションを追加
- -Djava.endorsed.dirs=/usr/local/JacORB/lib
- -Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB
- -Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton
- 起動シェルスクリプトを変更する。
java -Djava.endorsed.dirs=/usr/local/JacORB/lib -Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB -Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton RTMExamples.SimpleIO.ConsoleInComp -f RTMExamples/SimpleIO/rtc.conf ${1+"$@"}
※ RTCB の出力を変更する必要あり。
- SimpleIO,SimpleServicem,ConfigSample が正常に動作することを確認した。
- omniとの接続
- SimpleIO:エンディアンが合わない。対応可能か調査中。
- JacORB の CDROutputStream ではエンディアンの設定ができない。CDRInputStream では可能。ソースコードを確認したのうえで変更が必要。
- java corba との接続
- SimpleIO:エンディアンが合わない。対応可能か調査中。
JacORB の再配布¶
JacORB は GNU LIBRARY GENERAL PUBLIC LICENSE。
RTM と一緒に配布した方がユーザにとっては、インストール作業が楽になる。
バージョンアップを考慮するとユーザに委ねた方がいいのか?
※ 同梱する場合、インストーラの構成を修正する必要あり。
ネームサービス¶
examples で確認したところ、 orbd でも問題なし。
JacORB の ネームサービスを使用する必要があるか?
互換性¶
今までの財産との互換は?
sun と JacORB は接続可能か?
RTCは再コンパイルで利用可能か?
sun-java と JacORB の組み合せ¶
sun-java と JacORB でバージョン依存があるか?