[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 メーリングリストの案内