[openrtm-commit:03023] r902 - in trunk/OpenRTM-aist-Python/OpenRTM_aist/python3_examples: . Throughput

openrtm @ openrtm.org openrtm @ openrtm.org
2017年 12月 15日 (金) 11:08:20 JST


Author: miyamoto
Date: 2017-12-15 11:08:20 +0900 (Fri, 15 Dec 2017)
New Revision: 902

Added:
   trunk/OpenRTM-aist-Python/OpenRTM_aist/python3_examples/Throughput/
   trunk/OpenRTM-aist-Python/OpenRTM_aist/python3_examples/Throughput/Throughput_py.py
   trunk/OpenRTM-aist-Python/OpenRTM_aist/python3_examples/Throughput/rtc.conf
Log:
[compat,bugfix,->RELENG_1_2] fixed bug.

Added: trunk/OpenRTM-aist-Python/OpenRTM_aist/python3_examples/Throughput/Throughput_py.py
===================================================================
--- trunk/OpenRTM-aist-Python/OpenRTM_aist/python3_examples/Throughput/Throughput_py.py	                        (rev 0)
+++ trunk/OpenRTM-aist-Python/OpenRTM_aist/python3_examples/Throughput/Throughput_py.py	2017-12-15 02:08:20 UTC (rev 902)
@@ -0,0 +1,605 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# -*- Python -*-
+
+"""
+ @file Throughput_py.py
+ @brief Throughput sample
+ @date $Date$
+
+ @author 宮本 信彦 n-miyamoto at aist.go.jp
+ 産業技術総合研究所 ロボットイノベーション研究センター
+ ロボットソフトウェアプラットフォーム研究チーム
+
+ LGPL
+
+"""
+import sys
+import time
+sys.path.append(".")
+
+# Import RTM module
+import RTC
+import OpenRTM_aist
+
+import math
+
+
+# Import Service implementation class
+# <rtc-template block="service_impl">
+
+# </rtc-template>
+
+# Import Service stub modules
+# <rtc-template block="consumer_import">
+# </rtc-template>
+
+
+# This module's spesification
+# <rtc-template block="module_spec">
+throughput_py_spec = ["implementation_id", "Throughput_py", 
+		 "type_name",         "Throughput_py", 
+		 "description",       "Throughput sample", 
+		 "version",           "1.0.0", 
+		 "vendor",            "AIST", 
+		 "category",          "example", 
+		 "activity_type",     "STATIC", 
+		 "max_instance",      "1", 
+		 "language",          "Python", 
+		 "lang_type",         "SCRIPT",
+		 "conf.default.datatype", "double",
+		 "conf.default.outputfile", "test.dat",
+		 "conf.default.increment", "100",
+		 "conf.default.sleep_time", "0.1",
+		 "conf.default.mode", "logincr",
+		 "conf.default.maxsize", "1000000",
+		 "conf.default.maxsend", "1000",
+		 "conf.default.maxsample", "100",
+		 "conf.default.filesuffix", "-test",
+
+		 "conf.__widget__.datatype", "radio",
+		 "conf.__widget__.outputfile", "text",
+		 "conf.__widget__.increment", "text",
+		 "conf.__widget__.sleep_time", "text",
+		 "conf.__widget__.mode", "radio",
+		 "conf.__widget__.maxsize", "text",
+		 "conf.__widget__.maxsend", "text",
+		 "conf.__widget__.maxsample", "text",
+		 "conf.__widget__.filesuffix", "text",
+		 "conf.__constraints__.datatype", "(octet,short,long,float,double)",
+		 "conf.__constraints__.mode", "(logincr,incr,const)",
+
+         "conf.__type__.datatype", "string",
+         "conf.__type__.outputfile", "string",
+         "conf.__type__.increment", "long",
+         "conf.__type__.sleep_time", "double",
+         "conf.__type__.mode", "string",
+         "conf.__type__.maxsize", "long",
+         "conf.__type__.maxsend", "long",
+         "conf.__type__.maxsample", "long",
+         "conf.__type__.filesuffix", "string",
+
+		 ""]
+# </rtc-template>
+
+class DataListener(OpenRTM_aist.ConnectorDataListenerT):
+  def __init__(self, comp, data):
+    self._comp = comp
+    self._data = data
+
+  def __del__(self):
+    pass
+
+  def __call__(self, info, cdrdata):
+    data = OpenRTM_aist.ConnectorDataListenerT.__call__(self, info, cdrdata, self._data)
+    self._comp.receiveData(data.tm, len(data.data))
+
+
+
+class ConnListener(OpenRTM_aist.ConnectorListener):
+  def __init__(self, comp):
+    self._comp = comp
+
+  def __del__(self):
+    print("dtor of ", self._name)
+
+  def __call__(self, info):
+    print("------------------------------")
+    print("Profile::name:       ", info.name)
+    print("Profile::id:         ", info.id)
+    print("Profile::properties: ")
+    print(info.properties)
+    print("------------------------------")
+    self._comp.setConnectorProfile(info)
+
+
+##
+# @class Throughput_py
+# @brief Throughput sample
+# 
+# データポートのスループットを計測するコンポーネント。interface_type,
+#	subscription_type 等 ConnectorProfile パラメータやデータサイズ、サン
+#	プル数などを変更して、その際の転送時間(最大、最小、平均、標準偏差)
+#	およびスループットを測定してファイルに記録することができる。
+#	基本的には、以下の(a)や(b)のような接続形態で使用する。
+#	<pre>
+#	+-----------+
+#	|  ______   |    ______     ______
+#	+->|_____|>-+   >|_____|>-->|_____|>
+#	(a)                 (b)
+#	</pre>
+#	同一コンポーネント内では(a)、同一プロセス内、同一ノード内のスループッ
+#	トは (a)または(b)、異なるノード間のスループットを計測する際は (b)の
+#	接続形態で計測する。計測は以下の手順で行う。
+#	-# コンポーネントを起動する
+#	-# コンフィグレーションパラメータを設定する
+#	-# 必要なコネクタプロファイルを設定してポートを接続する
+#	-# コンポーネントをアクティベートする
+#	計測結果はデータを受け取ったコンポーネントがファイルに記録する。
+# 
+# 
+class Throughput_py(OpenRTM_aist.DataFlowComponentBase):
+	
+	##
+	# @brief constructor
+	# @param manager Maneger Object
+	# 
+	def __init__(self, manager):
+		OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
+		self._size = 0
+
+
+
+		
+
+
+		# initialize of configuration-data.
+		# <rtc-template block="init_conf_param">
+		"""
+		データ型
+		 - Name: datatype datatype
+		 - DefaultValue: double
+		 - Constraint: (octet,short,long,float,double)
+		"""
+		self._datatype = ['double']
+		"""
+		出力ファイル名。onActivated時、またはデータ受信時にファイルがオープンされるの
+		で、それ以降にパラメータを設定した場合は反映されない。
+		 - Name: outputfile outputfile
+		 - DefaultValue: test.dat
+		"""
+		self._outputfile = ['test.dat']
+		"""
+		データ増分。mode が incr の場合のデータ増分を byte で指定する。
+		 - Name: increment increment
+		 - DefaultValue: 100
+		 - Unit: byte
+		"""
+		self._increment = [100]
+		"""
+		onExecute内で待機する時間
+		 - Name: sleep_time sleep_time
+		 - DefaultValue: 0.1
+		 - Unit: s
+		"""
+		self._sleep_time = [0.1]
+		"""
+		- mode: 計測モード名。logincr, incr, const から選択可能。
+		- logincr: logスケールでデータ数を増加させ計測。実際には、1, 2, 5,
+		10, .. といった間隔でデータ数を増加させ、logスケールでプ
+		ロットした際にほぼ等間隔となるように計測する。
+		- incr: incrementパラメータで指定されたバイト数で、一定間隔でデータ
+		数を増加させる。
+		- const: データは増加させず一定サイズでスループットを計測する。
+		 - Name: mode mode
+		 - DefaultValue: logincr
+		 - Constraint: (logincr,incr,const)
+		"""
+		self._mode = ['logincr']
+		"""
+		最大データ個数を指定する。送信するシーケンスデータのサイズを指定する。実際の
+		データサイズは、この個数に1データ当たりのバイト数をかけたものとなる。
+		 - Name: maxsize maxsize
+		 - DefaultValue: 1000000
+		"""
+		self._maxsize = [1000000]
+		"""
+		最大送信数。データ送信回数の最大値を指定する。モードがlogincr, incr
+		の場合、データサイズ毎に maxsend 回数データを送信する。
+		 - Name: maxsend maxsend
+		 - DefaultValue: 1000
+		"""
+		self._maxsend = [1000]
+		"""
+		最大サンプリング数。データを受信し、統計情報を計算する際の最大サンプル数を指
+		定する。データ送信側の送信数がサンプル数より少ない場合、受信したサンプル数で
+		統計情報を計算する。データ送信側の送信数がサンプル数より多い場合、古い情報は
+		破棄され、最新の maxsample 個の計測データから統計情報を計算する。
+		 - Name: maxsample maxsample
+		 - DefaultValue: 100
+		"""
+		self._maxsample = [100]
+		"""
+		ファイル識別子
+		 - Name: filesuffix filesuffix
+		 - DefaultValue: -test
+		"""
+		self._filesuffix = ['-test']
+		
+		# </rtc-template>
+		self._datasize = 0
+		self._fs = None
+		self._record = []
+		self._sendcount = 0
+		self._logmulcnt = 0
+		self._varsize = 0
+
+
+		 
+	##
+	#
+	# The initialize action (on CREATED->ALIVE transition)
+	# formaer rtc_init_entry() 
+	# 
+	# @return RTC::ReturnCode_t
+	# 
+	#
+	def onInitialize(self):
+		# Bind variables and configuration variable
+		self.bindParameter("datatype", self._datatype, "double")
+		self.bindParameter("outputfile", self._outputfile, "test.dat")
+		self.bindParameter("increment", self._increment, "100")
+		self.bindParameter("sleep_time", self._sleep_time, "0.1")
+		self.bindParameter("mode", self._mode, "logincr")
+		self.bindParameter("maxsize", self._maxsize, "1000000")
+		self.bindParameter("maxsend", self._maxsend, "1000")
+		self.bindParameter("maxsample", self._maxsample, "100")
+		self.bindParameter("filesuffix", self._filesuffix, "-test")
+		
+		# Set InPort buffers
+		
+		# Set OutPort buffers
+		
+		# Set service provider to Ports
+		
+		# Set service consumers to Ports
+		
+		# Set CORBA Service Ports
+		#self.getConfigService().update()
+		#print self._datatype
+		self._data_type = OpenRTM_aist.normalize(self._datatype)
+		if self._data_type == "octet":
+			self._d_in = RTC.TimedOctetSeq(RTC.Time(0,0), [])	
+			self._d_out = RTC.TimedOctetSeq(RTC.Time(0,0), [])
+			self._varsize = 1
+		elif self._data_type == "short":
+			self._d_in = RTC.TimedShortSeq(RTC.Time(0,0), [])	
+			self._d_out = RTC.TimedShortSeq(RTC.Time(0,0), [])
+			self._varsize = 2
+		elif self._data_type == "long":
+			self._d_in = RTC.TimedLongSeq(RTC.Time(0,0), [])	
+			self._d_out = RTC.TimedLongSeq(RTC.Time(0,0), [])
+			self._varsize = 4
+		elif self._data_type == "float":
+			self._d_in = RTC.TimedFloatSeq(RTC.Time(0,0), [])	
+			self._d_out = RTC.TimedFloatSeq(RTC.Time(0,0), [])
+			self._varsize = 4
+		elif self._data_type == "double":
+			self._d_in = RTC.TimedDoubleSeq(RTC.Time(0,0), [])	
+			self._d_out = RTC.TimedDoubleSeq(RTC.Time(0,0), [])
+			self._varsize = 8
+		else:
+			return RTC.RTC_ERROR
+			
+			
+		self._inIn = OpenRTM_aist.InPort("in", self._d_in)
+		self.addInPort("in",self._inIn)
+		self._outOut = OpenRTM_aist.OutPort("out", self._d_out)
+		self.addOutPort("out",self._outOut)
+		self._inIn.addConnectorDataListener(OpenRTM_aist.ConnectorDataListenerType.ON_BUFFER_WRITE,
+											DataListener(self, self._d_in))
+		self._inIn.addConnectorListener(OpenRTM_aist.ConnectorListenerType.ON_CONNECT,
+										  ConnListener(self))
+
+		return RTC.RTC_OK
+
+	def receiveData(self, tm, seq_length):
+		received_time = OpenRTM_aist.Time().getTime()
+		if self._size == 0:
+			self._size = seq_length
+		record_num = len(self._record)
+		record_ptr = record_num
+		if self._size != seq_length and record_num != 0:
+			
+			max_latency = 0.0
+			min_latency = 0.0
+			mean_latency = 0.0
+			variance = 0.0
+			stddev = 0.0
+			throughput = 0.0
+			sum = 0.0
+			sq_sum = 0.0
+			record_len = len(self._record)
+			
+			#print record_len
+			
+			
+			for d in self._record:
+				tmp = d
+				sum += tmp
+				sq_sum += tmp * tmp
+				if tmp > max_latency:
+					max_latency = tmp
+				elif tmp < min_latency:
+					min_latency = tmp
+			
+			mean_latency = sum / record_len
+			variance = (sq_sum / record_len) - (mean_latency * mean_latency)
+			stddev = math.sqrt(variance)
+			throughput = ((((self._size * self._varsize) + 8) * 8) / mean_latency) / (1024 * 1024)
+			
+			self._fs.write(str(self._size)+"\t")
+			self._fs.write(str(min_latency)+"\t"+str(max_latency)+"\t")
+			self._fs.write(str(mean_latency)+"\t"+str(stddev)+"\t")
+			self._fs.write(str(throughput)+"\n")
+			self._record = []
+			
+			if seq_length < self._size:
+				
+				async = OpenRTM_aist.Async_tInvoker(self, Throughput_py.exit)
+				async.invoke()
+				return
+		send_time = OpenRTM_aist.TimeValue(tm.sec, tm.nsec/1000)
+		if record_ptr == self._maxsample[0]:
+			self._record.pop(0)
+		self._record.append((received_time-send_time).toDouble())
+		self._size = seq_length
+			
+		
+	def setConnectorProfile(self, info):
+		outputfile = self._datatype[0] + "-" + info.properties.getProperty("interface_type") + self._filesuffix[0] + ".dat"
+		if self._fs is None:
+			try:
+				self._fs = open(outputfile, 'w')
+			except:
+				print("File open failed!!")
+				return
+		self._fs.write("# Profile::name:      " + info.name + "\n")
+		self._fs.write("# Profile::id:        " + info.id + "\n")
+		self._fs.write("# Profile::properties: " + "\n")
+		ss = str(info.properties)
+		propv = ss.split("\n")
+		for prop in propv:
+			self._fs.write("# " + prop + "\n")
+		self._fs.write("size[byte]\tmin[s]\tmax[s]\tmean[s]\tstddev[s]\tthroughpiut[Mbps]" + "\n")
+		
+		#print outputfile
+		#print "setConnectorProfile"
+	def setDataSize(self, size):
+		self._d_out.data = [0]*size
+		#print "setDataSize"
+	def getDataSize(self):
+		#print "getDataSize"
+		return len(self._d_out.data)
+	def writeData(self):
+		OpenRTM_aist.setTimestamp(self._d_out)
+		self._outOut.write()
+		#print "writeData"
+	def getInPortConnectorSize(self):
+		return len(self._inIn.get_connector_profiles())
+
+	#	##
+	#	# 
+	#	# The finalize action (on ALIVE->END transition)
+	#	# formaer rtc_exiting_entry()
+	#	# 
+	#	# @return RTC::ReturnCode_t
+	#
+	#	# 
+	#def onFinalize(self):
+	#
+	#	return RTC.RTC_OK
+	
+	#	##
+	#	#
+	#	# The startup action when ExecutionContext startup
+	#	# former rtc_starting_entry()
+	#	# 
+	#	# @param ec_id target ExecutionContext Id
+	#	#
+	#	# @return RTC::ReturnCode_t
+	#	#
+	#	#
+	#def onStartup(self, ec_id):
+	#
+	#	return RTC.RTC_OK
+	
+	#	##
+	#	#
+	#	# The shutdown action when ExecutionContext stop
+	#	# former rtc_stopping_entry()
+	#	#
+	#	# @param ec_id target ExecutionContext Id
+	#	#
+	#	# @return RTC::ReturnCode_t
+	#	#
+	#	#
+	#def onShutdown(self, ec_id):
+	#
+	#	return RTC.RTC_OK
+	
+		##
+		#
+		# The activated action (Active state entry action)
+		# former rtc_active_entry()
+		#
+		# @param ec_id target ExecutionContext Id
+		# 
+		# @return RTC::ReturnCode_t
+		#
+		#
+	def onActivated(self, ec_id):
+		self._datasize = 1
+		self.setDataSize(int(self._datasize))
+		self._sendcount = 0
+		self._logmulcnt = 0
+		return RTC.RTC_OK
+	
+		##
+		#
+		# The deactivated action (Active state exit action)
+		# former rtc_active_exit()
+		#
+		# @param ec_id target ExecutionContext Id
+		#
+		# @return RTC::ReturnCode_t
+		#
+		#
+	def onDeactivated(self, ec_id):
+		if self._fs:
+			self._fs.close()
+			self._fs = None
+		self._datasize = 1
+		self.setDataSize(self._datasize)
+		self._sendcount = 0
+		self._logmulcnt = 0
+		
+		if self.getInPortConnectorSize() == 0:
+			async = OpenRTM_aist.Async_tInvoker(self, Throughput_py.exit)
+			async.invoke()
+		return RTC.RTC_OK
+	
+		##
+		#
+		# The execution action that is invoked periodically
+		# former rtc_active_do()
+		#
+		# @param ec_id target ExecutionContext Id
+		#
+		# @return RTC::ReturnCode_t
+		#
+		#
+	def onExecute(self, ec_id):
+		logmul = [2.0, 2.5, 2.0]
+		if self.getDataSize() != self._datasize:
+			self.setDataSize(int(self._datasize))
+		self.writeData()
+		self._sendcount += 1
+		if self._sendcount%(self._maxsample[0]+1) != 0:
+			return RTC.RTC_OK
+		
+		if self._mode[0] == "logincr":
+			self._datasize *= logmul[self._logmulcnt%3]
+			self._logmulcnt += 1
+			#print self._datasize, self._logmulcnt
+		elif self._mode[0] == "incr":
+			self._datasize += self._increment[0]
+		else:
+			if self._sendcount > self._maxsend[0]:
+				self.deactivate(ec_id)
+				return RTC.RTC_OK
+		time.sleep(self._sleep_time[0])
+		if self._datasize > self._maxsize[0]:
+			print("Exiting")
+			self.setDataSize(1)
+			self.writeData()
+			self.deactivate(ec_id)
+			
+			
+		return RTC.RTC_OK
+	
+	#	##
+	#	#
+	#	# The aborting action when main logic error occurred.
+	#	# former rtc_aborting_entry()
+	#	#
+	#	# @param ec_id target ExecutionContext Id
+	#	#
+	#	# @return RTC::ReturnCode_t
+	#	#
+	#	#
+	#def onAborting(self, ec_id):
+	#
+	#	return RTC.RTC_OK
+	
+	#	##
+	#	#
+	#	# The error action in ERROR state
+	#	# former rtc_error_do()
+	#	#
+	#	# @param ec_id target ExecutionContext Id
+	#	#
+	#	# @return RTC::ReturnCode_t
+	#	#
+	#	#
+	#def onError(self, ec_id):
+	#
+	#	return RTC.RTC_OK
+	
+	#	##
+	#	#
+	#	# The reset action that is invoked resetting
+	#	# This is same but different the former rtc_init_entry()
+	#	#
+	#	# @param ec_id target ExecutionContext Id
+	#	#
+	#	# @return RTC::ReturnCode_t
+	#	#
+	#	#
+	#def onReset(self, ec_id):
+	#
+	#	return RTC.RTC_OK
+	
+	#	##
+	#	#
+	#	# The state update action that is invoked after onExecute() action
+	#	# no corresponding operation exists in OpenRTm-aist-0.2.0
+	#	#
+	#	# @param ec_id target ExecutionContext Id
+	#	#
+	#	# @return RTC::ReturnCode_t
+	#	#
+
+	#	#
+	#def onStateUpdate(self, ec_id):
+	#
+	#	return RTC.RTC_OK
+	
+	#	##
+	#	#
+	#	# The action that is invoked when execution context's rate is changed
+	#	# no corresponding operation exists in OpenRTm-aist-0.2.0
+	#	#
+	#	# @param ec_id target ExecutionContext Id
+	#	#
+	#	# @return RTC::ReturnCode_t
+	#	#
+	#	#
+	#def onRateChanged(self, ec_id):
+	#
+	#	return RTC.RTC_OK
+	
+
+
+
+def Throughput_pyInit(manager):
+    profile = OpenRTM_aist.Properties(defaults_str=throughput_py_spec)
+    manager.registerFactory(profile,
+                            Throughput_py,
+                            OpenRTM_aist.Delete)
+
+def MyModuleInit(manager):
+    Throughput_pyInit(manager)
+
+    # Create a component
+    comp = manager.createComponent("Throughput_py")
+
+def main():
+	mgr = OpenRTM_aist.Manager.init(sys.argv)
+	mgr.setModuleInitProc(MyModuleInit)
+	mgr.activateManager()
+	mgr.runManager()
+
+if __name__ == "__main__":
+	main()
+

Added: trunk/OpenRTM-aist-Python/OpenRTM_aist/python3_examples/Throughput/rtc.conf
===================================================================
--- trunk/OpenRTM-aist-Python/OpenRTM_aist/python3_examples/Throughput/rtc.conf	                        (rev 0)
+++ trunk/OpenRTM-aist-Python/OpenRTM_aist/python3_examples/Throughput/rtc.conf	2017-12-15 02:08:20 UTC (rev 902)
@@ -0,0 +1,7 @@
+corba.args: -ORBgiopMaxMsgSize 209715200
+manager.components.preconnect: Throughput_py0.out:Throughput_py0.in(dataflow_type=push&interface_type=corba_cdr)
+manager.components.preactivation: Throughput_py0
+
+example.Throughput_py.conf.default.maxsize: 1000000
+example.Throughput_py.conf.default.datatype: float
+example.Throughput_py.conf.default.filesuffix: -samecomp
\ No newline at end of file



More information about the openrtm-commit mailing list