OpenRTM / OpenRTM-aist-Java

OpenRTM-aist: RT-Middleware and OMG RTC implementation in Java implemented by AIST
Other
1 stars 5 forks source link

コンポーネント生成時にPort周りでExceptionが発生する。 #16

Closed n-ando closed 5 years ago

n-ando commented 5 years ago

Describe the bug コンポーネント生成時にPort周りでExceptionが発生する。

java.lang.ClassCastException: Unknown data type.
        at jp.go.aist.rtm.RTC.util.NVUtil.copyToProperties(Unknown Source)
        at jp.go.aist.rtm.RTC.Manager.publishPorts(Unknown Source)
        at jp.go.aist.rtm.RTC.Manager.registerComponent(Unknown Source)
        at jp.go.aist.rtm.RTC.Manager.createComponent(Unknown Source)
        at StringInComp.myModuleInit(Unknown Source)
        at jp.go.aist.rtm.RTC.Manager.activateManager(Unknown Source)
        at StringInComp.main(Unknown Source)
java.lang.ClassCastException: Unknown data type.
        at jp.go.aist.rtm.RTC.util.NVUtil.copyToProperties(Unknown Source)
        at jp.go.aist.rtm.RTC.Manager.subscribePorts(Unknown Source)
        at jp.go.aist.rtm.RTC.Manager.registerComponent(Unknown Source)
        at jp.go.aist.rtm.RTC.Manager.createComponent(Unknown Source)
        at StringInComp.myModuleInit(Unknown Source)
        at jp.go.aist.rtm.RTC.Manager.activateManager(Unknown Source)
        at StringInComp.main(Unknown Source)

To Reproduce

2つ以上のデータポートを持つコンポーネントを起動すると、RTCインスタンス生成時に発生。

Expected behavior Exceptionが何も発生しない状態が正常。

Environment

n-ando commented 5 years ago

原因は2つあった。

  1. NVUtils::copyToProperties() の問題

    • NVUtil.java 内の static void copyToProperties(Properties prop, final NVListHolder nvlist) において、TimedWString を文字列にする文がない。
    • 汎用的にHelper関数を呼び出して、toString() 関数を呼び出すロジックがあるが、うまく機能しておらず、ここでExceptionが出ている。
    • そもそも、toString() を呼び出しても、意味のある文字列には変換されない。例えば、RTC.TimedString@1ed4004b のような文字列に変換されるだけ。
  2. OutPort.h の data_port.data_value の問題

    • 1.2 ではすでに廃止されたOutPortのProfile::properties にデータそのものを持たせる機能がJavaではまだ残っていた。

対応策としては、

  1. NVUtil::toProperties() 関数をJavaのRefrectionを用いてもう少しちゃんとデータを文字列に変換する方法に変える。ただし、C++では、文字列になるものだけを>>=で文字列に変換しており、大半のstructなどは文字列にせずにスルーしている。
  2. OutPort.h んぼ data_value を properties に持たせる機能を削除する