[openrtm-users 01022] Re: support for wchar and wstring data types in BasicDataType.idl

Yosuke Matsusaka yosuke.matsusaka @ aist.go.jp
2009年 11月 26日 (木) 14:04:58 JST


産総研の松坂です。

前回メールに不具合が起こる場合のソースをつけていなかったので、添付して送ります。
OpenRTM-aist 1.0.0RC1 Python版付属のサンプルコードを少し書き換えてUTF-8文字列を
送ろうとしているのですがcdrMarshalエラーが出ます。

前回メールを出した後で

[openrtm-users 00503] ポートの型による処理速度の差異

の一連の議論を読み返したのですが、wchar型もwstring型も文字列を送るという本来の
目的では生かしておいてほしいように思います(遅い反応ですいません)。
国際化文字列を送るという目的を考えると上記議論で問題となったパフォーマンスに
影響するコード変換機能も本来はありがたい機能です。

とはいえcharという名前は、8bitデータ型として誤解されやすいので、例えば新しい
TimedChar型はTimedOctet型と等価にして、より誤解の少なそうな名前(TimedCharacterとか)
を現在のTimedChar型と等価なものとして新しくに新設するなどして検討いただけると
ありがたいのですが、どうでしょうか?

ユーザ型で解決してしまっても良いのですが、国際化文字列の送受信は非常によく使われる機能だと
思うので何か共通のプロトコルがあった方が良いように思います。

2009/11/25 Yosuke Matsusaka <yosuke.matsusaka @ aist.go.jp>:
> OpenRTM-aist開発者の皆様
>
> 産総研の松坂です。
>
> ポートの間でやり取りされるデータ型は、BasicDataType.idlで定義されていると思うのですが、
> データ型の中にwcharとwstringをサポートするデータ型を例えばTimedWCharやTimedWString
> などの形で追加することはできませんでしょうか?
>
> 国際化文字列は現在のTimedString型でも無理矢理通信できてしまうのですが、上記のwstring型を
> 使う方がより正規の(?)方法のようです。
>
> 国際化文字列を無理矢理通信する方法はC++では使えたのですが、Pythonでは普通のやり方では
> 送信側にcdrMarshalエラーが出てしまうようで、うまい方法はないかと思っています。
>
> --
> Yosuke Matsusaka, Ph.D  <yosuke.matsusaka @ aist.go.jp>
>  Interaction Modeling Group /
>  National Institute of Advanced Industrial Science and Technology (AIST)
>  Tel: 029-862-6726  Web: http://staff.aist.go.jp/yosuke.matsusaka/
>



-- 
Yosuke Matsusaka, Ph.D  <yosuke.matsusaka @ aist.go.jp>
  Interaction Modeling Group /
  National Institute of Advanced Industrial Science and Technology (AIST)
  Tel: 029-862-6726  Web: http://staff.aist.go.jp/yosuke.matsusaka/
-------------- next part --------------
#/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

import OpenRTM_aist
import RTC

consolein_spec = ["implementation_id", "ConsoleIn",
                  "type_name",         "ConsoleIn",
                  "description",       "Console input component",
                  "version",           "1.0",
                  "vendor",            "Shinji Kurihara",
                  "category",          "example",
                  "activity_type",     "DataFlowComponent",
                  "max_instance",      "10",
                  "language",          "Python",
                  "lang_type",         "script",
                  ""]


class ConsoleIn(OpenRTM_aist.DataFlowComponentBase):
    def __init__(self, manager):
        OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
        self._data = RTC.TimedString(RTC.Time(0,0),0)
        self._outport = OpenRTM_aist.OutPort("out", self._data)


    def onInitialize(self):
        # Set OutPort buffer
        self.registerOutPort("out", self._outport)
        return RTC.RTC_OK

        
    def onExecute(self, ec_id):
        print "Hit return key:"
        sys.stdin.readline()
        self._data.data = u"テスト"
        print "Sending to subscriber: ", self._data.data
        self._outport.write()
        return RTC.RTC_OK


def MyModuleInit(manager):
    profile = OpenRTM_aist.Properties(defaults_str=consolein_spec)
    manager.registerFactory(profile,
                            ConsoleIn,
                            OpenRTM_aist.Delete)

    # Create a component
    comp = manager.createComponent("ConsoleIn")

def main():
    # Initialize manager
    mgr = OpenRTM_aist.Manager.init(sys.argv)

    # Set module initialization proceduer
    # This procedure will be invoked in activateManager() function.
    mgr.setModuleInitProc(MyModuleInit)

    # Activate manager and register to naming service
    mgr.activateManager()

    # run the manager in blocking mode
    # runManager(False) is the default
    mgr.runManager()

    # If you want to run the manager in non-blocking mode, do like this
    # mgr.runManager(True)

if __name__ == "__main__":
	main()


openrtm-users メーリングリストの案内