From eef51dd888aa120837fc746b45fab44ce14891fc Mon Sep 17 00:00:00 2001
From: Shengkang Chen <shengkangchen@Shengkangs-MacBook-Pro.local>
Date: Fri, 15 Feb 2019 00:43:42 -0800
Subject: [PATCH] added simulated comm

---
 .../__pycache__/data_analyzer.cpython-36.pyc  | Bin 5574 -> 5574 bytes
 .../realworld_dataset_manager.cpython-36.pyc  | Bin 12810 -> 13047 bytes
 .../realworld_dataset_manager.py              |   7 +-
 .../__pycache__/sim_manager.cpython-36.pyc    | Bin 3941 -> 4833 bytes
 CoLo-AT/simulation_process/sim_manager.py     |  62 ++++++++++++++----
 CoLo-AT/test_simulation.py                    |   8 +--
 6 files changed, 58 insertions(+), 19 deletions(-)

diff --git a/CoLo-AT/data_analysis/__pycache__/data_analyzer.cpython-36.pyc b/CoLo-AT/data_analysis/__pycache__/data_analyzer.cpython-36.pyc
index 9b93370356b5023e51bb249b484f896ee3e248c1..9099e8d5a14e68fe056753339e4b41849ba094a8 100644
GIT binary patch
delta 16
XcmX@6eN3C(n3tDJ;z7(t_Why&E93<s

delta 16
XcmX@6eN3C(n3tF9NNMy&_Why&E)fM`

diff --git a/CoLo-AT/dataset_manager/__pycache__/realworld_dataset_manager.cpython-36.pyc b/CoLo-AT/dataset_manager/__pycache__/realworld_dataset_manager.cpython-36.pyc
index 018cc86e57a4288f0eae01ff5857953b2fb5c0b1..5ed681eb5c3773249ce5512ba5e08b9c1e174c34 100644
GIT binary patch
delta 500
zcmZWkOK1~87@lu-vq@KK64O^oQnlEcZEGJEtp{(uDoCj`v}F+^Iw4kQgVQM#NvLQJ
zMNje<1<xL&^dfT+#Z!wQf}j*MQLqIMMf7TqIvc$?@V);38<@E#cJuCVW25_RCx7Y6
z)HC-hM>~DzAJ9XutO2ajPb-B!a_yT3kBCE}s{%hE`o&?9F|J8?qNl?AX3;yrya8IV
zC64KE=m~H_uQ`t+n4ojf6=dm4^s@dOO#{B3j&Il))#;X(z+0-emhg@y+wR~!RoiZ3
zll){EAN8kX7^vy3_S3+&?n+$%erTB<2Y%6d$7}wZ>HGV$7973RS#@w+zwjOc%lcyP
zw1o$HwSNtGPE&&?m#$gt?+F<R{3(O^ZbOQd*bN9IS&19qE-zbV!t2ROva(&W&A<4V
z95HRrlKYIv^8t+pgOKbr;)e?=r)FmJQUz(xzm%I1i#1+QBQh3Ts8igyT5}<<a<X`}
zsB#5aT$mF|E~x8oU>@a|Jwp@r@>>}~Yl6m8cK3hPF^^~EQPcDwD|I>Rwb0YSC1=?r
f8Kdo3!aZQ@u)%zW&J20njnmxFqfkR67HRkcDu;)~

delta 302
zcmeyK+Lgj(%*)FqHa#Y$By1zseI`cf$*-6$F=|iV%dF41X!2WT8Ah$iTr7o>+9@h2
zsx6FB!YMi_>M0sPmPm?bFoUM<<T)%wjAonpS(h*}T5jILHj9HXWU@d1l+8{8vW$!o
zlNkl$7^62Q2p(Z!^xUi}wwsah%;bmSHH_yc$4N9XUYh(+qJj4+0|P@b6OdqFtdgG`
zXed6pRWge4#^wi-?2L@JH@}c_VPt%?Sy#q~k@4;3D%k)=#_y9)%N^rqU<B%80qJ8B
zVyse{{7_D2^B#F^W=8hSFO+VwF`92aq&ba|v2$~zb_6ryq|KZ3)-W>eoE&dpBkHHg
v6jEda)Tzl>)B>j5G({)(8P-o0GLm330g4o>O*SynoE&X5ot2A2fP)hN(1lk7

diff --git a/CoLo-AT/dataset_manager/realworld_dataset_manager.py b/CoLo-AT/dataset_manager/realworld_dataset_manager.py
index ea32212..b527385 100755
--- a/CoLo-AT/dataset_manager/realworld_dataset_manager.py
+++ b/CoLo-AT/dataset_manager/realworld_dataset_manager.py
@@ -23,7 +23,6 @@ def find_nearest_time_idx(l, value):
         return None
 
 
-
 def find_next_time_idx(array, start_idx, value):
     i = start_idx
     try:
@@ -455,3 +454,9 @@ class RW_Dataset_Manager:
 
         return valid_respond, current_time, req
 
+    def get_robot_groundtruth(self, gt_time, robot_index):
+        gt_time_idx = find_nearest_time_idx(self.time_arr['groundtruth'][robot_index], gt_time) 
+        gt = self.groundtruth_data[robot_index][gt_time_idx]
+
+        return gt
+
diff --git a/CoLo-AT/simulation_process/__pycache__/sim_manager.cpython-36.pyc b/CoLo-AT/simulation_process/__pycache__/sim_manager.cpython-36.pyc
index d643fa9309460c81f3c936277613a0a4947439ee..2abcfecd1515e8497a8c7f92566c428ba0bfdf5e 100644
GIT binary patch
literal 4833
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
VziSjN<2DGT8v18lLW$#K{{hy%=J@~s

delta 1733
zcma)7&2Jk;6rb4-d%f%3^~XB4(|ojqk~)y|GX(@~C`Exo1*k-znjqt3Ho+TzWp-0F
z)fj_ZK><}tHAf^4J#j?hKR_H25)$IDCpd86A3$(Hyti>^5f?1YZ{NH(@6DTezc>En
z<gYX4dD}L>-Ftg|(YtT{xO9pT;*&aMq^>Z^lslxZGLz{nb%)k9X0bFgK+;*}4N}X>
zDf-iJZFMsZUid4)P+?q!5q?Pti3p=3O7W`*eWXw#s2~k0lt3AgK^nd)d<~HXt;W<r
z1~fWoOrZrSVWO{4K}xja8G0EbGM)|5#XOvDlYw<WZ>0nYGze*w$qqT7{B~poSw<Kc
zDT6H9l5K2}$RlN49oV@2z)AcvJA{7&32V5)>qOX0-%<E?AgO^PoDm(k!U|mBvQ!n4
z7(#|xkQ0t@lk@5Prf`D%h_E!cp<ICT<RFD&5<Uk><V8O4KwA(w21!ET(gYb4;ckjm
zGVoYNcr7Xl%zU1J{{%=DNco^F3gc5dB0o;#+CQ26JCWU+ZxNA#(;q;371+AUviA;4
zVPg<DVRGIiX$z|9zIuC6ewdz;f2MBezd`Ycyq*p!ld<0Ct!@-MtQj>!KWem_8-6?d
z`sZ|(o{H_Oy-ugW{aqMgKeo1ELB|in=C&W3-90e%HhNJgmojIUOFRWpc^)8ESSQXV
zwnn%gMt&!D!l)Vf5N5N-na}ImCPe1*^7G7krk>^-QKQ9f$(-p~X6SceMKYf=mmCZj
zz6n4SgPO8wp36{!I?0d^%<IFKl!sJg3R9W3tpfQTq2eb5Sd>ulE=j1U|350;CEGMI
z1d!Z2BIF}{{FrP}mSS?>DwH({d`L)zA4ft83(%Gitd)1(j~pNraA?ep9B>Jle?(Q_
z3os?a%zG-3wJ<0SJmkcV0_9zRLT1NQ^%Aa?gclTne@bHCl9#iyLr;{(%mFJfrwpW+
z5S}Pw`Ma;c{^jxh6;T;SamL)N05_|mDoV@-7J30nE=ZN&zfmn=SAnxIprMZ1>3~l1
zzaY&VDsaPy2rJ>>WN=LWo}HijG~uekFG5;VuxgqW##}8PU4(qWUV-9%V1HD#pwb-Q
zoSG6VOK0lZ7Vxh|`IB<isZu7Nb#BZ&4d$3`q4sDsH&A*8fXT0%m#HQHa8A26E=)7O
z9W@&fcjQI4MqT-?dtrHo=g<M!#R~{U1P=ipIzE9=28h+R-{n=DPRj4y^6(gnQ)n@;
zVWR!M&!<s0hj0Sn34|Gh;|Px-JdSV@AXcF#Vr_S?74dmg>HxLLhwa1ho#r)!1%SGa
zHxMRk>o%`IH{za+b}NkdQ@CmoVM&VI+RAAZ&!CsV!+s-bb$osnbr%qxLpX<U9-waY
zHo~OS4(}W9*v-#4uYoPx0yylrOZm?XWo@-aS8FNxLw+H(3>LmBt-^^HvE>bFsODv^
zfmqAOIy?*geSQgM^=u+9b(&GTwGnIZeJ@seA-@8~SnI=-&&pn5x|Ccgv@!fIUAq#e
Nc(coT9r;D!>fd1)l~Moz

diff --git a/CoLo-AT/simulation_process/sim_manager.py b/CoLo-AT/simulation_process/sim_manager.py
index c4bf8c4..6bf24ca 100644
--- a/CoLo-AT/simulation_process/sim_manager.py
+++ b/CoLo-AT/simulation_process/sim_manager.py
@@ -14,11 +14,38 @@ class SimulationManager():
 	def __init__(self, name):
 		self.name = name
 
-	def sim_process_native(self, robot_labels, dm, robot_system, state_recorder, comm = True, simple_plot = False):
+	def comm_controller(self, rbt_idx, num_robots):
+		receiver_idx = rbt_idx
+		sender_idx = (rbt_idx+1)%(num_robots)
+
+		return receiver_idx, sender_idx
+
+	def simulated_communication(self, receiver_status, sender_status):
+		max_range = 5 # in meters
+		threshold = 0.2
+
+		[receiver_idx, receiver_gt] = receiver_status
+		[sender_idx, sender_gt] = sender_status
+		
+		r_x, r_y = receiver_gt['x_pos'], receiver_gt['y_pos']
+		s_x, s_y = sender_gt['x_pos'], sender_gt['y_pos']
+		dis = math.sqrt((r_x-s_x)**2+(r_y-s_y)**2)
+
+		mean = math.exp(-1.5*dis)
+		std = math.exp(-0.5*dis)
+
+		if numpy.random.normal(mean, std) > threshold:
+			return True
+		else:
+			return False
+
+
+	def sim_process_native(self, robot_labels, dm, robot_system, state_recorder, simulated_comm = True, comm = True, simple_plot = False):
 		#dm: dataset manager 
 		print('******** Simulation Process Started! ********')
 		print('communication: ', comm)
 		self.robot_labels = robot_labels
+		self.robot_system = robot_system
 		
 		start_time = dm.get_start_time()
 		duration = dm.get_duration()
@@ -44,7 +71,7 @@ class SimulationManager():
 			if self.time  < prev_time:
 				print('Time inconsistant!')
 				break
-			if valid ==  False :
+			if valid == False :
 				break 
 			robot_state = robot_system.localization_update(rsp)
 			state_var.append(robot_state['state variance'])
@@ -53,18 +80,26 @@ class SimulationManager():
 			# communication protocall
 			if comm:
 				if rsp.get_type()=='measurement':
+
 					rbt_idx = rsp.get_robot_index()
-					comm_rsp = request_response.Comm_req_resp(self.time, rbt_idx)
-					message = comm_rsp.get_message()
-					sender_idx = (rbt_idx+1)%(robot_system.num_robots)
-					sender_id = robot_labels[sender_idx]
-					message['data'] = {'subject_ID':sender_id}
-					message['groundtruth'] = rsp.get_groundtruth
-					comm_rsp.set_message(message)
-					
-					robot_state = robot_system.localization_update(comm_rsp)
-					state_var.append(robot_state['state variance'])
-					state_recorder.record_state(rsp, robot_state)
+					receiver_idx, sender_idx = self.comm_controller(rbt_idx, self.robot_system.num_robots)
+
+					receiver_gt = dm.get_robot_groundtruth(self.time, receiver_idx)
+					sender_gt = dm.get_robot_groundtruth(self.time, sender_idx)
+
+					if simulated_comm and self.simulated_communication([sender_idx, sender_gt], [receiver_idx, receiver_gt]):
+						# simulated communication 
+						comm_rsp = request_response.Comm_req_resp(self.time, receiver_idx)
+						message = comm_rsp.get_message()
+
+						sender_id = robot_labels[sender_idx]
+						message['data'] = {'subject_ID':sender_id}
+						message['groundtruth'] = rsp.get_groundtruth
+						comm_rsp.set_message(message)
+						
+						robot_state = robot_system.localization_update(comm_rsp)
+						state_var.append(robot_state['state variance'])
+						state_recorder.record_state(rsp, robot_state)
 					
 		if simple_plot:
 			state_recorder.simple_plot(plot_title=self.name)
@@ -81,6 +116,7 @@ class SimulationManager():
 		print('******** Simulation Process Started! ********')
 		req_type_list = ['odometry', 'measurement', 'communication']
 		self.robot_labels = robot_labels
+		self.robot_system = robot_system
 		
 		start_time = dm.get_start_time()
 		duration = dm.get_duration()
diff --git a/CoLo-AT/test_simulation.py b/CoLo-AT/test_simulation.py
index 405984f..4466974 100644
--- a/CoLo-AT/test_simulation.py
+++ b/CoLo-AT/test_simulation.py
@@ -20,7 +20,6 @@ from pprint import pprint
 
 # load algorithms 
 sys.path.append(os.path.join(os.path.dirname(__file__), "localization_algos"))
-
 from centralized_ekf import Centralized_EKF # works
 from simple_ekf import Simple_EKF
 from ekf_ls_bda import EKF_LS_BDA
@@ -41,14 +40,13 @@ start_time, starting_states, dataset_data, time_arr = testing_dataset.load_datas
 
 analyzer = Analyzer('analyzer', robot_labels)
 
-
 loc_algo = EKF_LS_BDA('algo')
 robot = RobotSystem('robot', robot_labels, loc_algo, distr_sys = False)
 
 sim = SimulationManager('sim LS-BDA')
-state_recorde_gs_ci = StatesRecorder('LS-BDA', robot_labels)
-sim.sim_process_native(robot_labels, testing_dataset, robot, state_recorde_gs_ci, simple_plot = True)
-loc_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorde_gs_ci, plot_graphs = True)
+state_recorder_bda = StatesRecorder('LS-BDA', robot_labels)
+sim.sim_process_native(robot_labels, testing_dataset, robot, state_recorder_bda, simple_plot = True)
+loc_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_bda, plot_graphs = True)
 
 ##############################################################################
 
-- 
GitLab