From 3b5b4a49fefb037c1fd5a8ed4bf08c29ad635d43 Mon Sep 17 00:00:00 2001
From: William Chen <billyskc@ucla.edu>
Date: Mon, 3 Jun 2019 22:15:41 -0700
Subject: [PATCH] updated analysis and recorder modules

---
 CoLo-AT/Algorithm Comparison.pdf              | Bin 27907 -> 22885 bytes
 .../__pycache__/data_analyzer.cpython-36.pyc  | Bin 6905 -> 7073 bytes
 CoLo-AT/data_analysis/data_analyzer.py        |  18 ++++++++---
 ...simulated_dataset_manager_w.cpython-36.pyc | Bin 7048 -> 7048 bytes
 CoLo-AT/gs_ci_journal_sim.py                  |  19 ++++++------
 .../__pycache__/ekf_gs_ci2.cpython-36.pyc     | Bin 4318 -> 4272 bytes
 .../__pycache__/ekf_ls_bda.cpython-36.pyc     | Bin 4820 -> 4820 bytes
 .../__pycache__/gs_ci_bound.cpython-36.pyc    | Bin 3415 -> 3375 bytes
 CoLo-AT/localization_algos/ekf_gs_bound.py    |  17 +++++-----
 CoLo-AT/localization_algos/ekf_gs_ci2.py      |   2 +-
 CoLo-AT/localization_algos/gs_ci_bound.py     |  29 ++++++++----------
 .../__pycache__/robot_system.cpython-36.pyc   | Bin 4113 -> 4204 bytes
 CoLo-AT/robots/robot_system.py                |  13 +++++---
 .../__pycache__/sim_manager.cpython-36.pyc    | Bin 5319 -> 5319 bytes
 .../__pycache__/state_recorder.cpython-36.pyc | Bin 4684 -> 4989 bytes
 CoLo-AT/simulation_process/state_recorder.py  |  15 +++++++--
 16 files changed, 67 insertions(+), 46 deletions(-)

diff --git a/CoLo-AT/Algorithm Comparison.pdf b/CoLo-AT/Algorithm Comparison.pdf
index ecf54c22f8094da499d2356a5eb9472b84c1e26d..be8592ab63d020456462f6a207fa78bf16221817 100644
GIT binary patch
delta 10746
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

delta 15762
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

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 00026763e21aa8bcb83c2edf9f8367b7c06a0654..7c702c1fe6559289fc6ad2a6503301457bd71125 100644
GIT binary patch
delta 1471
zcmY*ZON$&;6u!5rx?Ww?k4(R+CT5Y0Xp>+Nox}%mKqv7L6U3OAWNc|_rpjjeQQdR9
zW|+j=HfCHJ8Mq3PowzVtnO#r}_zT?jLU5tbxKM;FL`BcJ)k#QS&R5_4&bjA4IH&(w
z{PMK@jO*IJ{d=!bu76|SFmm&R5Etwfupt+>j7yCc8O`m}-Mb+jmB7ki6|gE;4a@`c
z!LRWww>6@Y4()#mT&a={i8X~#vQOFdYYsQL<-u%~#J)xntz)xq#gbVc|HNxy<}?}A
zxPcL&-ci_}+>@F&(~OP+SxoLr)#qABP#G?yS;LG+xYp4jX244`&GZOlE%9=aY3prc
zros+0W_zSY_UIUb%DgfYvvN^|SLH@kZpp8;wYy5V1L;40i-3=IRN!~G+csgl>O7>O
zgy&#ZelW|!4DzJD_z1>^^nTooK}<MK#R7!aq`L^rlk5;MU$Qx1@=bZRN<wG0p;SiM
ztt+b}u{dqpp}VJ0;9)Mwa(9m=4kARSY97?QQ~^_!t0(pqcr?;>xy$o>ju&{5A8M&w
z4+}Rla4VPRP=8;$MCwKHqqVG?P#jZB6zx9EiI41{sKkSb-rbCYZfl~&eby5{+Y5AF
z=-Kc6NpYA2Nz{xOYYrmTWZUt?O<1rIiSM%2Q|xg_HmP;{8xJCq&0f^pOd_@ubl2t|
zU7h-3@lW;#%EevB_f?I;P+;Kq;ZTl>Kb-QB95uDWv_KcYOvO=jswg(i!6>LUJ$TH$
zr;JzO2<!^NRfIJ>ks5FJ-kD^3Q83(QQ7?)UrlM2EE+WGPQ>o#qX$Cc1I@OWAi=Y71
zwRFv+`KSNEuWqnY5OJA3hr!PSOsoj@jTk%_!!~3uAiM-nFR~o+ml3c#**Sz)5ne-h
z9RW9FZy=l(zZSlrw-3g}vO*Wd=W}=5Ht2OFy+&I!O6Ta3_^LFfzldYy>thGJcyihK
zp8!cnTBOkb88Cf!jnifF-rFMsiiL6`RG<shn`%QFnImgtkDwZ{D~HS6Xe(Ul7;J@S
z+A7qog-T16m8?s}eyD6!pn8e$D=YdkY|GAyoyyV164J{Ecrf_{i~*}V@*O6{0O~0W
zlAy_=jXn#ZyapJ!g>V)jM(88RH+vJ=1%!*@_sY{Hhr&Nx1?GgBvTAHvJ9xHwlIm$W
zh|St@J*@|EtG3~GAoBj}eIRV_u-?LCfjHrvJcc_=9M)g&C(UlK9(9N8IC|F+uw7Ur
zKJ=c1miXE`Z>@k(S1+=m_}e>EmY0;d@P2Fu;fA>2KjmMw&zMixd6va^Ym$M|7+hm7
K!c2VTNB;w+nNCXp

delta 1365
zcmY+D&u`pB6vt=AUfb&*n{2YXUMCf;s8C~i2oOr3B9Q(d6p%vNY!w87l^dJT_5Mg^
z9VxA5wGu%bkSZdLgep$Jf6(RxQsKa#09+QqncTQ=K&k}qjko;R)%*B6-+A+FkKcT`
z_~$u$!Sn35KmC34>ofQ456x0Q2yq}TLG+)IpPTE~4(Yy#>0lb70#SviLHH2${a=M6
zY@KK%rM-_pGoPfSt208$A?2^%a)l*|0gN_CcSa|fp4$Are9a1nKZ;shSR{j*Ffk)G
zQpSH1zViIBXM*=o)Rk8kdQ4JwNc;7?W?Tq}&{G5Mvn-~^o)r+NIV~#VF;s?eMO0Od
zswk>!ako3%Ai{;EjWq(3G}S;0;k61-sya&!C?%o{BUqY`x)q#_>7$vkDnU+7c@v;~
zr6xhum6`&jHbpo-iS2P+bcST$>^3$?W(e9cW9NWT(6O6Y!aJZ@5eezJ>w#NVE--h6
zcF6dgAT3*XqAaFFNlb{zZA}<)=}rM2Ub*jU>m;05<rF^WO5=8=9d+YQ#M4tfId4BD
zZ`vt!<WF`auQ;b^AluG&kMTLk<ssrpz{tyZw3Re>65ix{UAgI=ly}_+?{SzTnnf*!
zp;MRYREO(7|Nm;3IYk-dlwjVXE_0E2=qKnT{4M4(gED4A&ZKtq!25#@ui`^oL#!hj
zfRWbS>oi7ACyDxdJn1CejB7Zlau-nHf@9_3s^bEBxb)aSbsfO~p`Ne#fBoaX;1`<w
zS;)A~pTp!uz^ItOeG?vK3HQ)^9`OPoEb|iTCB#dJ3y6ydJVg950&mD)L9ED+%XjG)
zM<=JMj4sG?m2bQl{E+3Z5zB{_6?$G?st)Nd^84!TA)ZEja&;m<0g;is^|r~N0AcLE
zCFo`H?%KeFZlJ=98JraDj<%@{tU+;L3x?;We^Hn%CRl3nhA6Z&VZ#XlXIoQ^YAC1p
zud`c&-XyUuzpXWlm*KX2S=Rl>H_oGc6X7Co3wRq4I%*$A<%siU9A#0HCtE!pC!Du1
zCq*nHK0w?=s6BfX)fM@f|8zx%HtpA7OrSNek!)H!`q`hSM&1c>GB|7GtspN1TV4X0
zk2Y>k-V06`5f*z#{t(Qc#^NKF_ipsEW;?o(wEO%l&Tb+sL{mO7Ge@W8>dYI(H84VL
zm3QP<GfP$VeySF}8s9+(*_rjFGwTOe?Ir7sJ;CwIgvC(-I%DV7h;?`5i?hk!He(=t

diff --git a/CoLo-AT/data_analysis/data_analyzer.py b/CoLo-AT/data_analysis/data_analyzer.py
index a68e60d..d1b233b 100644
--- a/CoLo-AT/data_analysis/data_analyzer.py
+++ b/CoLo-AT/data_analysis/data_analyzer.py
@@ -91,14 +91,19 @@ class Analyzer():
 		finish_flag = False
 
 		loc_err_per_run = []
+		state_err_per_run = []
+		trace_per_run = []
+
+
 		lm_measurement_num = []
 		relative_measurment_num = []
 		comm_num = []
-		trace_per_run = []
+		
 		time_arr = []
 
 		while True:
 			loc_err_per_time_iterval = 0
+			state_err_per_time_interval = 0
 			trace_per_time_iterval = 0
 			num_dataline_per_time_iterval = 0
 			lm_measurement_count = 0
@@ -123,7 +128,8 @@ class Analyzer():
 
 				
 				if selected_labels == None or data_in_time_order[time_index][1] in selected_labels:
-					loc_err_per_time_iterval+= data_in_time_order[time_index][7]
+					loc_err_per_time_iterval += data_in_time_order[time_index][7]
+					state_err_per_time_interval += np.linalg.norm(data_in_time_order[time_index][8] - data_in_time_order[time_index][9])
 					trace_per_time_iterval += data_in_time_order[time_index][4]
 					num_dataline_per_time_iterval+=1
 				
@@ -134,10 +140,12 @@ class Analyzer():
 
 			if num_dataline_per_time_iterval != 0:
 				loc_err_per_run.append(loc_err_per_time_iterval/num_dataline_per_time_iterval)
+				state_err_per_run.append(state_err_per_time_interval/num_dataline_per_time_iterval)
 				trace_per_run.append(trace_per_time_iterval/num_dataline_per_time_iterval)
 				   
 			else:
 				loc_err_per_run.append(0)
+				state_err_per_run.append(0)
 				trace_per_run.append(0)
 
 			lm_measurement_num.append(lm_measurement_count)
@@ -155,7 +163,7 @@ class Analyzer():
 		if plot_graphs:
 			self.plot_loc_err_and_trace(loc_err_per_run, trace_per_run, time_arr, operations_distr = [lm_measurement_num, relative_measurment_num, comm_num], recorder_name = recorder_name)
 
-		return loc_err_per_run, trace_per_run, time_arr
+		return loc_err_per_run, state_err_per_run, trace_per_run, time_arr
 
 	def robot_location_at_unit_time_interval(self, data_recorder, unit_time_interval = 0.2):
 		#recorded_dataline = [time, robot_label, est_x_pos, est_y_pos, trace_state_var, gt_x_pos, gt_y_pos, loc_err] 
@@ -262,9 +270,9 @@ class Analyzer():
 		arr_loc_err = []
 		arr_trace = []
 		for data_recorder in arr_data_recorder:
-			loc_err_per_run, trace_per_run, time_stamps = self.calculate_loc_err_and_trace_state_variance_per_run(data_recorder, plot_graphs = False, selected_labels = selected_labels)
+			loc_err_per_run, state_err_per_run, trace_per_run, time_stamps = self.calculate_loc_err_and_trace_state_variance_per_run(data_recorder, plot_graphs = False, selected_labels = selected_labels)
 			if only_trace == None or data_recorder.name not in only_trace:
-				arr_loc_err.append([time_stamps, loc_err_per_run, data_recorder.name])
+				arr_loc_err.append([time_stamps, state_err_per_run, data_recorder.name])
 			arr_trace.append([time_stamps, trace_per_run, data_recorder.name] )
 
 		print('Plotting Comparison Graphs')
diff --git a/CoLo-AT/dataset_manager/__pycache__/simulated_dataset_manager_w.cpython-36.pyc b/CoLo-AT/dataset_manager/__pycache__/simulated_dataset_manager_w.cpython-36.pyc
index 381de36ccc1f4eb7c7dd8ef1ec3fc445ea46b36d..35c5604c197dbd43ba397d71f598ccbad8207c35 100644
GIT binary patch
delta 16
XcmeA$?=WXK=H=z;{PuMtd!sY}ED{B!

delta 16
XcmeA$?=WXK=H=x&)B0f}d!sY}D<}nW

diff --git a/CoLo-AT/gs_ci_journal_sim.py b/CoLo-AT/gs_ci_journal_sim.py
index 9769bc1..9d4b5c4 100644
--- a/CoLo-AT/gs_ci_journal_sim.py
+++ b/CoLo-AT/gs_ci_journal_sim.py
@@ -27,7 +27,7 @@ from ekf_gs_sci2 import EKF_GS_SCI2
 
 
 ##############################################################################
-duration = 200
+duration = 100
 robot_labels = [1,2,3,4]
 testing_dataset = Sim_Dataset_Manager('testing')
 start_time, starting_states, dataset_data, time_arr = testing_dataset.circular_path_4_robots(duration)
@@ -40,7 +40,7 @@ state_recorder = StatesRecorder('gs_ci', robot_labels)
 
 sim.sim_process_native(robot_labels, testing_dataset, robot, state_recorder, simple_plot = False)
 
-loc_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder, plot_graphs = False, selected_labels = [1])
+loc_err_per_run, state_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder, plot_graphs = False, selected_labels = [1])
 
 #analyzer.trajectory_plot(state_recorder)
 
@@ -55,10 +55,9 @@ robot = RobotSystem('robot', robot_labels, loc_algo, distr_sys = True)
 sim = SimulationManager('sim gs_ci_bound')
 state_recorder_bound = StatesRecorder('gs_ci_bound', robot_labels, state_var_only = True)
 sim.sim_process_native(robot_labels, testing_dataset, robot, state_recorder_bound, simple_plot = False)
-loc_err_per_run, trace_per_run_b, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_bound, plot_graphs = False, selected_labels = [1])
+loc_err_per_run, state_err_per_run, trace_per_run_b, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_bound, plot_graphs = False, selected_labels = [1])
 ##############################################################################
 
-
 testing_dataset.dataset_reset()
 loc_algo = Centralized_EKF('algo')
 robot = RobotSystem('robot', robot_labels, loc_algo, distr_sys = False)
@@ -66,7 +65,7 @@ robot = RobotSystem('robot', robot_labels, loc_algo, distr_sys = False)
 sim = SimulationManager('sim cen_ekf')
 state_recorder_LS_cen = StatesRecorder('LS_cen', robot_labels)
 sim.sim_process_native(robot_labels, testing_dataset, robot, state_recorder_LS_cen, simple_plot = False)
-loc_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_LS_cen, plot_graphs = False)
+loc_err_per_run, state_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_LS_cen, plot_graphs = False)
 
 ##############################################################################
 
@@ -77,7 +76,7 @@ robot = RobotSystem('robot', robot_labels, loc_algo, distr_sys = False)
 sim = SimulationManager('sim ls_bda')
 state_recorder_LS_BDA = StatesRecorder('LS_BDA', robot_labels)
 sim.sim_process_native(robot_labels, testing_dataset, robot, state_recorder_LS_BDA, simple_plot = False)
-loc_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_LS_BDA, plot_graphs = False)
+loc_err_per_run, state_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_LS_BDA, plot_graphs = False)
 
 
 ##############################################################################
@@ -89,7 +88,7 @@ robot = RobotSystem('robot', robot_labels, loc_algo, distr_sys = False)
 sim = SimulationManager('sim ls_ci')
 state_recorder_LS_CI = StatesRecorder('LS_CI', robot_labels)
 sim.sim_process_native(robot_labels, testing_dataset, robot, state_recorder_LS_CI, simple_plot = False)
-loc_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_LS_CI, plot_graphs = False)
+loc_err_per_run, state_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_LS_CI, plot_graphs = False)
 
 ##############################################################################
 
@@ -100,6 +99,8 @@ robot = RobotSystem('robot', robot_labels, loc_algo, distr_sys = True)
 sim = SimulationManager('sim gs_sci')
 state_recorder_GS_SCI = StatesRecorder('GS_SCI', robot_labels)
 sim.sim_process_native(robot_labels, testing_dataset, robot, state_recorder_GS_SCI, simple_plot = False)
-loc_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_GS_SCI, plot_graphs = False)
+loc_err_per_run, state_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_GS_SCI, plot_graphs = False)
+
+analyzer.algos_comparison([state_recorder, state_recorder_LS_cen, state_recorder_LS_BDA, state_recorder_LS_CI, state_recorder_GS_SCI, state_recorder_bound], only_trace = ['gs_ci_bound'], selected_labels = [1])
+
 
-analyzer.algos_comparison([state_recorder, state_recorder_LS_cen, state_recorder_LS_BDA, state_recorder_LS_CI, state_recorder_GS_SCI, state_recorder_bound], only_trace = ['gs_ci_bound'], selected_labels = [1])
\ No newline at end of file
diff --git a/CoLo-AT/localization_algos/__pycache__/ekf_gs_ci2.cpython-36.pyc b/CoLo-AT/localization_algos/__pycache__/ekf_gs_ci2.cpython-36.pyc
index bac96246273de72566a102ee4ecc5854305bbdd9..a02f049cf7ac54d49143049b5fe2c2769f6fa360 100644
GIT binary patch
delta 107
zcmcboxIvNAn3tEU=G)hpryDs_SQrmY{=hChxsxSu@;jC)MzzVAtd5N5Ca-4g=RX(D
zP{UlqQp1|g9L%7}HrbO+escpG3!{Po0}wFsFmf=mFtGqJ2crOx%>fc&;$UK7+PsY2
Gf)fDpq8TUv

delta 125
zcmdm>cu$ejn3tE!q3uJ=<BgmtER5GC=dt7n3#G70GSu*kK(J5>yA8wSn=I9gR+Hbe
zDorkDm1lf3c{*!9|D$k*8s-|78rF2?U<OT&$);@bB1}aJ3=9llLKDW`9KgoG$Y?Y<
Ql3k9OQG{`G1-k_&0CmM4R{#J2

diff --git a/CoLo-AT/localization_algos/__pycache__/ekf_ls_bda.cpython-36.pyc b/CoLo-AT/localization_algos/__pycache__/ekf_ls_bda.cpython-36.pyc
index df5af6c196922ce05dc1069d82fc707493feac86..ba0a8a86ae49dfa3867677edda712eb20893b78f 100644
GIT binary patch
delta 146
zcmcbjdPSApn3tEUY{%D)>@i$iQS3SS$%#4f#ZjAcxqR5-EEpIViY!5d9FVxhn01TA
zBR(^$$Q~qQ3nHw5L=<mPYD#HxYD#=@W_oU7kqbzSJ-0NcBr`s%$N{9x5kxqF2xk!C
Z3L@Mliwk~Wa|bbfCeITRpR6LZ0RULkC9VJf

delta 146
zcmcbjdPSApn3tE!x&6aN_82a%TkJXc$%#4f#kV%+a`~{uSurp$6j_4^IUsS1G3yqK
zM|@^hkt0aR9z@uH#CeNSQ%aLlQ{sy=({mGx+(2UNxurQJnekagP9SB@Ai@PixPl0G
Y5aBUdT<`;%Cx{s^d7hB?WEG(e0OU+3V*mgE

diff --git a/CoLo-AT/localization_algos/__pycache__/gs_ci_bound.cpython-36.pyc b/CoLo-AT/localization_algos/__pycache__/gs_ci_bound.cpython-36.pyc
index ae10aa7792e6ae1c7580c28e4258839aa5d64c59..607a82df754796bfe76937e000767780fb5e9098 100644
GIT binary patch
delta 393
zcmcaEwO)$Tn3tF9?B}mB9UD1+GuE@#FvK&aumMS?6m}rVoWcSmSyC8+88kWk(iy<u
zg8fS-AS2xv3@+P4g@3>p8|>4$t}iaI<=T#5XtLhoOw38okIzfYO})ihmRJ;Dc8e24
z6(#1Sr{3ZQF_Q#S6N@tQ(r<C*CRRWsCTB1iF)~e_&9t9UXmd2P5F?}L<UAHnE_R>;
zoPoG_#^i%6Hj*JFOf_81j4lkZ9<{tFj5WL>47GeU3|Y*R<5(57Sh84C7@HYI7;1PR
z*qnix!G@vGDV(8(xrU{NHJusgKW4uo-pLzTWw`l)<`#*82=U1`SgRTNCx@`9$;p6h
z1Bo&)@-T8RvM>oSaxif)@c~ITMyt(p*vuIjg(hEN&jFH-9PW&Un>#t$K|+FD6+p6!
g%YxBk^I@)NM#hxM@;vj{IXIX(*f~TeAK{q{0JlqE_W%F@

delta 484
zcmaKoF-rqc49AoA?p@zq@2*;_w$(|e&Wbt|1QkRC7Y7HGa^>2?S}VO4Dfo(@h?CO;
z!76?NK}y{n#Z6p<;uq-F&B4WYb#T%^eo6k2kmMo#o;GG|+k89i@ATWo7gkU}4n3ks
z2BaQUx#qzpWVDSQ0RX>s9ooyHuL@<aiy786+_Ha|tGEY+F7t8+ZX*mwZqSY93vRGi
z@dpJ{O718_x>~JJE(VUQnj^AJMiJ#RdBWk&1&t#nWJ_B!bv1ffdF?}DG%4Tt^hqOG
zC&E0#71*_!wuiz_K+~x%ZGo_bzE6TH!Gt3m569u0{ANYMAO*tkXbS4Iq<MIT2@uwg
z&jW=lRI&m}tQq@f!W@X$U+sblO)#Gh-W1qs?*J7tBtUt|CZl7aG9Dr>AK5X+2d6LV
zBU2MftfdtIE##<?A>@P;2Q9)eOLd&<)b)A9n7oga6;pf_XFD#x2&JCUP|TYPxZb%j
Uw-J5$8NG`{IOP$ZlDC%p1}3?2Q~&?~

diff --git a/CoLo-AT/localization_algos/ekf_gs_bound.py b/CoLo-AT/localization_algos/ekf_gs_bound.py
index fe91db4..320691a 100644
--- a/CoLo-AT/localization_algos/ekf_gs_bound.py
+++ b/CoLo-AT/localization_algos/ekf_gs_bound.py
@@ -10,10 +10,10 @@ def rot_mtx(theta):
 class EKF_GS_BOUND(ekf_algo_framework):
 	def __init__(self, algo_name):
 		ekf_algo_framework.__init__(self, algo_name)
-		self.var_v = 0.04
-		self.var_range = 0.7
-		self.var_bearing = 0.3
-		self.max_range  = 3.5 
+		self.var_v = 0.1**2
+		self.var_range = 0.1**2
+		self.var_bearing = 0.3**2
+		self.max_range  = 0.001
 
 	def state_variance_init(self, num_robots):
 		return 0.1*np.matrix(np.identity(2*num_robots), dtype = float)
@@ -22,7 +22,7 @@ class EKF_GS_BOUND(ekf_algo_framework):
 		[s, orinetations, sigma_s, index] = robot_data
 		i = 2*index
 		trace_state_var = np.trace(sigma_s[i:i+2, i:i+2])
-		return trace_state_var
+		return np.trace(sigma_s)
 
 	def propagation_update(self, robot_data, sensor_data):
 		[s, orinetations, sigma_s, index] = robot_data
@@ -49,6 +49,7 @@ class EKF_GS_BOUND(ekf_algo_framework):
 			jj = 2*j
 			sigma_s[jj:jj+2, jj:jj+2] += delta_t*delta_t*var_v*np.identity(2)
 
+		print(np.trace(sigma_s))
 		return [s, orinetations, sigma_s]
 
 	def absolute_obser_update(self, robot_data, sensor_data):
@@ -71,13 +72,13 @@ class EKF_GS_BOUND(ekf_algo_framework):
 		H = rot_mtx(self_theta).getT()*H_i
 
 		var_range = self.var_range
-		var_range = self.var_range
-		range_max = self.range_max
+		max_range = self.max_range
 		var_bearing = self.var_bearing
 
-		R = np.matrix(max(var_range, range_max, var_bearing)*np.identity(2))
+		R = np.matrix(max(var_range, max_range**2*var_bearing)*np.identity(2))
 		sigma_s = (sigma_s.getI()+H.getT()*R.getI()*H).getI()
 
+
 		return [s, orinetations, sigma_s]
 
 	
diff --git a/CoLo-AT/localization_algos/ekf_gs_ci2.py b/CoLo-AT/localization_algos/ekf_gs_ci2.py
index 2adbad7..fd399d2 100644
--- a/CoLo-AT/localization_algos/ekf_gs_ci2.py
+++ b/CoLo-AT/localization_algos/ekf_gs_ci2.py
@@ -38,7 +38,7 @@ class EKF_GS_CI2(ekf_algo_framework):
 		self_theta = orinetations[index]
 
 		Q = sigma_odo
-		Q[1,1] = Q[1,1]*v*v
+		#Q[1,1] = Q[1,1]*v*v#
 		W = delta_t*rot_mtx(self_theta)
 
 		s[i,0] = s[i,0] + cos(self_theta)*v*delta_t   #x
diff --git a/CoLo-AT/localization_algos/gs_ci_bound.py b/CoLo-AT/localization_algos/gs_ci_bound.py
index 44f0804..d3d7fbf 100644
--- a/CoLo-AT/localization_algos/gs_ci_bound.py
+++ b/CoLo-AT/localization_algos/gs_ci_bound.py
@@ -9,10 +9,11 @@ def rot_mtx(theta):
 class GS_CI_Bound(ekf_algo_framework):
 	def __init__(self, algo_name):
 		self.algo_name = algo_name
-		self.d_max = 2 # max measurement distance 
-		self.d_var = 0.2
-		self.bearing_var = 0.2
-		self.var_v = 0.25
+
+		self.var_v = 0.25**2
+		self.var_range = 0.3**2
+		self.var_bearing = 0.3**2
+		self.max_range  = 1.5
 
 	def state_variance_init(self, num_robots):
 		return 0.04*np.matrix(np.identity(2*num_robots), dtype = float)
@@ -37,10 +38,6 @@ class GS_CI_Bound(ekf_algo_framework):
 		for j in range(num_robots):
 			jj = 2*j
 
-		if j==index:
-			sigma_s[jj:jj+2, jj:jj+2] += sigma_odo[0,0]*np.identity(2)*delta_t*delta_t
-		else:
-			#var_v = pow(2*self.d_max, 2)/12
 			var_v = self.var_v
 			sigma_s[jj:jj+2, jj:jj+2] += var_v*np.identity(2)*delta_t*delta_t
 		
@@ -60,11 +57,11 @@ class GS_CI_Bound(ekf_algo_framework):
 		H_i[0, i] = -1
 		H_i[1, i+1] = -1
 
-		d_max = self.d_max
-		var_dis = self.d_var
-		var_phi = self.bearing_var
+		max_range = self.max_range
+		var_dis = self.var_range
+		var_phi = self.var_bearing
 
-		sigma_th_z =  np.matrix(max(var_dis, d_max*d_max*var_phi)*np.identity(2))
+		sigma_th_z =  np.matrix(max(var_dis, max_range*max_range*var_phi)*np.identity(2))
 		sigma_s = (sigma_s.getI() + H_i.getT() * sigma_th_z.getI() * H_i).getI()
 
 		return [s, orinetations, sigma_s]
@@ -90,11 +87,11 @@ class GS_CI_Bound(ekf_algo_framework):
 		H_ij[0, j] = 1
 		H_ij[1, j+1] = 1
 
-		d_max = self.d_max
-		var_dis = self.d_var
-		var_phi = self.bearing_var
+		max_range = self.max_range
+		var_dis = self.var_range
+		var_phi = self.var_bearing
 
-		sigma_th_z =  np.matrix(max(var_dis, d_max*d_max*var_phi)*np.identity(2))
+		sigma_th_z =  np.matrix(max(var_dis, max_range*max_range*var_phi)*np.identity(2))
 		sigma_s = (sigma_s.getI() + H_ij.getT() * sigma_th_z.getI() * H_ij).getI()
 		return [s, orinetations, sigma_s]
 
diff --git a/CoLo-AT/robots/__pycache__/robot_system.cpython-36.pyc b/CoLo-AT/robots/__pycache__/robot_system.cpython-36.pyc
index e6f893b9bb34363e909e83cc8442b5731bb39e34..1fd2769d85d4c09a6c7592f51c8ff5792061162a 100644
GIT binary patch
delta 1189
zcmZuwPiP!f7=Lg6@9fNOve|UANp`boB4#TMmc&a9EY#G3h+tb%Xw$6IykXtl?9TSh
z1UAbX3a%am59+6f7D2_Eg5X6g3iaTr*h4QK=A<Vn_Tr(62f^=6iiYCA`+a}j`~J-P
ze($~7!&+v|b?qPidbIu1SDCjd{Q!UhtSgMVa8v2Pf_j#gz(<^gFVqU$RhMjy5b^@9
za0q{@jTa-mV+hhQ$5fD}HC%~Mc9b#QBv)s*l~{>YL4{f-jFt)RSVGw#*S9VaMlO)L
z^2!4hQ`Ixj&{l3FN`H{(BcBH$x6z&CTTwIMZNDFRQ9I~|b&XG^{xI@*)I^N@rpGxi
zqL)ugDE$jFQkz3q#uere2sLPt9#b4OhjLUsA6yHf3kPB3_f|tcf;-x&RT*Db(lXpZ
z{fUH$!~N^~ei${G7kSS@Ro_{XE%C+wIcx0&9&7fz!5R2ize*?JZ+#|vq(P_|b956n
zjP3QREUO;=oyo67%{Ch*h5Z3m@sD1?(RScRW0szSUyakYiQ(x?3h<11`AVjxv~UEm
zE$lceG?p!s*ul%!g^HF_CS!#X;V`>P_~((qT=e32q!+E69H$&vYFjKnrf*Q;2usGo
z&*s9ViLUZ4<zGi?M`OpC-BOs%mLAv4iCkK<h&A&VF^zHp<uR0#DACVISH<|9$5yGU
zNsG<EmUU{X92@;Dk;fjKu7Upd*(}_$o_=mFHnF#P=}+lYL5+?zN*G2k61)A8&{-8b
zQ}_z2#-_{;e^|S80WN30Jy{THkst-jEY(=8B&~TdCrnZ9OpOU!{K$waqJp$sh7J1)
zd}6;gee0(DZZ{q%c*CuSuYOZ~>$gwA%-%7moR|UkvzxWVmV`*z7`8<5%X7bs-fXmj
z&**o0;bNm+gpyM^IgjTPqvu7uJ>)BB@CgY^(w#Xw-1P^N;#?AeFM{WsuO!-TFgU1J
z4_Tq|aFCciKMcK=&+Bm4IYCduBg9pxxodPCF1kIPKacTn&poqzglDqE)LyXb?X^eg
zLuwup>m^vry+cpH_qnYbWm#9g7G9HZT*6Zl(pGn*_Fu+SOW&7{8!oO;{*0w+)Sj{&
zt6(XXYN=fA)^mvxgozp+go)nY?+p%kdKKEhi(cn>JdtRf06xsWJn>`!_&s0y2Q^+I
AO8@`>

delta 1129
zcmZuw&1)1%6tC)!>7JhM=}9JElguO&jV7~-AVH8_B%<c9OK|;w2u3ruQ_V1$%*R%D
zmh4aiyAB>i3F<q!c-o^kFQSO}2Y3?}u@By5J$Ugb_^KyrHri0Xdhhl7_*K<=?}~Sd
z$$7`IURT~<I`uGlgVKKhD5OJYEiK5J)}w-yUD&TMnt_|jT0T;m?MUzVycI-lH7vJy
z&2NTYSZg%{_@FG(arjAHq<Q#DEx>(spQRE)PT~rV!wYpG$;f$9qNhtboYCffE@^xS
z|3z*PdOR#6hJM-OoR6ZFk4YH+0uxdyAk5$jOawv`bcl{9ok{pJF$^EI1Bax0Nr|&^
z8|7W`k<I<zHvAwgGcWWGz_Px&S2Ezm@A#VQEsvEOUi%ol(k~y6nGW`uHd?>en$>bx
zYxu$L5+i{h9|aGz(`^C5#HC-eSf`}+Pi^q4VY$XOFAi?Bk&eIfGIu8(#=HL3>jX?0
zKUxXQ8DFst731Pcs;X3#9_?Df>ZXLo>>TOZ_?Ws-QFC&nr%)nnX4MIQ5GGg}t+a1N
z%|%Z`sN1^9GCg{Y3R{>m7RJn}3j=lKHsy~(bxmV~%&IEPV#)2AX_1a=X0fJ=5kt6V
za398f0C%)AQdcp4bz2*$Yf@vQuw@?3j&&2wWg$7(^#t1QvK+iLXOE0`4dgZ<?UEbI
zqeOceB@81N={n7h&{+YQDSVC<x`xaShmsXK33roEXQzZZL~=yrSS+#PsMPXeLKtlN
zzTPc}0`}z|=vXVs>fiU|_hbS7wXPVCC$Il^_VE_{l6sy}@S@*R`GPvQ_Nk>(HcD0T
zv9SpPuj<DQ7n#x${?YdN0D4A=h8ObMCf|<=&q&xK&B?{hir<!F!(~hGB0RItjg}_+
zouTre9T}g~&cZ?G2YM7PARdHk&OAK~kDP`bS+bGip$T9vePZVSvl3<3TNQ7;)`_Qc
zyL%R4D}9U3z=XTJl$V9&K=COF(-P!t^|`J{>1)PVibqh#9}ccSp2k!)YGq9Wp1DOj
P0B_vY%<dRi$`n5V3&k1^

diff --git a/CoLo-AT/robots/robot_system.py b/CoLo-AT/robots/robot_system.py
index 075be13..bea3736 100644
--- a/CoLo-AT/robots/robot_system.py
+++ b/CoLo-AT/robots/robot_system.py
@@ -31,7 +31,7 @@ class RobotSystem:
 		else:
 			self.robot_sys = CentralizedRobotSystem(name, robot_labels, loc_algo)
 			print('created a centralized system for ', self.num_robots, ' robots ')
-		self.gt_orientations = np.zeros(self.num_robots)
+
 
 	def set_starting_state(self, start_state_arr):
 		if self.distr_sys:
@@ -40,6 +40,11 @@ class RobotSystem:
 		else:
 			self.robot_sys.set_starting_state(start_state_arr)
 
+
+		self.gt_orientations = np.zeros(self.num_robots)
+		for i, label in enumerate(self.robot_labels):
+			self.gt_orientations[i] = start_state_arr[label][3]
+
 	def request_data(self, time):
 		pass
 	'''
@@ -82,7 +87,7 @@ class RobotSystem:
 			a_v = message_data ['angular velocity']
 			
 			#sigma_odo = np.matrix([[5.075*v, 0], [0, 0.1]]) #with respect to velocity and orientation for utias datasets
-			sigma_odo = np.matrix([[0.01, 0], [0, 0.1]]) #with respect to velocity and orientation
+			sigma_odo = np.matrix([[0.01, 0], [0, 0.01]]) #with respect to velocity and orientation
 			sensor_covariance = sigma_odo
 			delta_t = message_data['delta_t']
 			
@@ -98,7 +103,7 @@ class RobotSystem:
 
 		elif rsp_type == 'measurement':
 
-			sigma_obser = np.matrix([[0.015, 0], [0,0.01]]) #with respect to range and bearing
+			sigma_obser = np.matrix([[0.1**2, 0], [0, 0.035**2]]) #with respect to range and bearing
 			sensor_covariance = sigma_obser
 			obj_id = message_data['subject_ID']
 			meas_range = message_data['measurment_range'] 
@@ -155,5 +160,5 @@ class RobotSystem:
 				[est_states, est_orientaions, est_state_variance]= self.robot_sys.get_status()
 				trace_sigma_s = self.robot_sys.get_trace_state_variance(robot_index)
 
-		robot_state = {'x_pos':est_states[2*robot_index], 'y_pos': est_states[2*robot_index+1], 'trace of state variance': trace_sigma_s, 'state variance': est_state_variance, 'update_type': update_type }
+		robot_state = {'x_pos':est_states[2*robot_index], 'y_pos': est_states[2*robot_index+1], 'trace of state variance': trace_sigma_s, 'state variance': est_state_variance, 'update_type': update_type, 'est_states': est_states.copy() }
 		return robot_state
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 8406071719767482050a4be41f2168eaa7139445..1450bcf5f5e286f03e7a2161ce1cbf2616342420 100644
GIT binary patch
delta 708
zcmYL{OK%e~5XZCKB)d(>gQP+bP*UD(3l&XiTJbF9U7<>dLnI4ixm_o9wY%Al-H^bc
z7cQKA;{$L+LcQ<}@)_7~02jmoxZ+tPxcu~=nZL&)k0;*5bCyb_!tnFYPtL?XO)9{*
zxfpVwQZcnJNlEg^{~zk__DYr5Ku3r%v87Rmoopv>wRBimwTS*uXj@JFrO<6&$Ye6f
zlpn%H6lLtlskvYPrX$gt#bf!~rUIArZgH_rrvDm-43b>m`1XkYSX{23KuZHVI3bsk
z^*K5GRb+N<*5rtOQF(8z>)#dGc#0mY=UK3B6gUVMv8mry-&D?E+3|Ux7*%jqmyde+
zb0+tCLANTW^u~1Uz-z&IJb;6zLxYEE4l$3ojJSeWFi7lxM{pIxMGU8+IB^;DU+r+<
zi5-dv+E`q|qAR(gY8-R8hPfMvRm3gCGU8wbc^y$g+%!mRIhILwZ(k@#A1h~)UIX%I
zNawtR3SSu343b>WyqrwEq-11zCk=#Da1TxQ5f2Q=@raKUjR#VSt$<S{W<yRH02>p>
z%ua*BHaYUIgYZX0zpJ(GK1^>JvOxI61sR)zA%`-yeS&y~c!YRtK-|HWH2+8V=|XTh
z`fKe+wTXrnVgvC~f2*%q&-MJw$+@mcB-xm$9q6QTcOW9OIROz1dE!#q6J}ltZ5_{a
F{{T;8zNG*F

delta 708
zcmYL{%Wl&^6o%tE7dIhINGep7LSWG%w@_$HZ`|)73KarGg+L5$JxQms9p{W25?FMD
zkXX--2VjYW`Ve^r<_%y2Y+%d$MuN?!bNSCjXJ+6I+`>Y+TpWA%<8xtPAJ-M)TU>NG
zF`0PDuGD48BmcjvzT3-HZ4>JOeQir)?Js4Q^463Jiz}8^AB*$Wr210aIC?6R$><?J
zq*)jv=*XEF&?eJStM$^M{4JBA(`u(QSJ%UT1znGHu4Qx`tv;0&>l2V1L5D)frSw`{
z@Bb=!cJ2gX>UrgZwWfYo<oHwgR@1d;4J8G@0iLP1)i)Iv>4MLL#A69ftC53le#XRJ
z&#FdcLfsv%?YRv)i2^L1E=^}(%>nbk0&o^sG|+ayBU*;L0(U5iwc}Ci)ix)t?NCIt
zisU&Y9mx}x^kYuv5xWjt25tfufW1rLHJ}XKFfbSHOP%fPiiFZ*<xJ2Wr#uAdp0{D)
z!gR+#=bGknGS%v`G1HkW5Hg{A5ZwpXp&W~NFJW<8O0gMmmWX2^XC9H)H<uO>3))-y
zz`qW{?`ieE*0}m0oznFJ;cJIvYzjk8BWU{=cmX^F9vNt-y(!KA5q|n0cpUY$_Om((
y!4&WW=%{b?E7nUjGkSR1M_D%Zl5M(}nmcU~nU@n3c_G&hV@+Z9Wwff|(TzXIHp&11

diff --git a/CoLo-AT/simulation_process/__pycache__/state_recorder.cpython-36.pyc b/CoLo-AT/simulation_process/__pycache__/state_recorder.cpython-36.pyc
index 7d0b96af6d2bd113c042393330c80a3848183572..fecf62bb365b60850ecd554432651b7f9690698c 100644
GIT binary patch
delta 2148
zcmZ`)&2Jk;6rb5Iuh;9f<2oNsL)(NT;L=jsh^RnGQ2N0~l~hWh6;hDdW;e!`zcRZP
zPPLXreC2>N2RL&<oDix6haM18#R2*k?2$vI3UTCwK)g4*#!e$^<=?z{@6DSx^M3RE
zc=4ZQV<nw7Ui$a1ou$d|jZZ24njg~ZXZ%#vgkRdB0jVbP#F6%-KJCM-WOdg34F8S3
zHdVb#9CDi!<*la@A>=6qC}w$9`esvVv_h?J`>fIl)%z}MdSSBcmptG0T@c+yyY4cO
zi(067Zf%cgu$CndbbydnLbYb!b8FucR^U&h+b7R}now=zGh=y<Z_5{YDKKA!pEnC>
zbhdl~i9^EI$VYGONL{Hb2Q-ii#GwVWNRAXpa4dOGx<X=$bi_iZW9z<omvkPD#QWh$
zJctRGBKI7*s|>g3s>7gN%~84uu<L;m$blMYK|-L8iBy%oNC?NW(M^I*t!hECPbumX
znDoe8kLHdX+mo@qmxvWc?4ZW;R8@0?yuTBdOWR^9Toh9fux91+SLgoteRXy{lq-!&
z(PWco5yi-Z6dF)A=9m0R-3^u9X6t|%sMhRO%WXI;iQX42#0)|f0n1S|*c1$*g=Mca
z%5nMGG&;=iN6O|#0Yw3`=$Z3eK@v7}KMi_s0f5jvouvy>o?29)CVUEfi+odke+k)B
zq++)y+AySEhL8=r?ym4()ORo7sm6Hb(9^Mf8<P;^^H%wqwrWkl8a%O}SCt=X+dawA
zp)7KrbW;J8w?Mikj4F(2D4G(W#tKX<rjra5V45MAhSq^51q_R{P+<1hF}fL`1+Gd5
zNr4&k#$5&@5G32!@Dn{?kU2vl%#%P5(l8U4C)1=)<4_6E4ML?xgMh48lR<Vs8jy_v
zVFC+|Hnf@XJQLf~Fu#Eg1BzO)g9soRg1Hr@So2=fFI5_j+hOx?d10!|n(c<;v$p>U
z!-BHs`LBs$FEm_l&>4oD6cjCHU=<Xj?s}eGcG+_nN8PJ6p|PC82>)|bbPa}GNN|%O
zYXk=)b{-{XaU$ZS%-sEuZ|n1Pp8NV6DmxFW_;>okoh4kpjPMLWP3G=4nG-Sjb#U-5
z0T8OgXHi{3TB01GA?4_lqybHrrA2y*&nLImkw{|*I5i+3T$^}pCD_VkHQWY|M(F(|
z{+W4#|D3!$Egsl$%JZzTkZz8wI44$Y8|yFQI~}w01nwLi&2_{ZVEiYe^&Ug&hpNq(
zeIRbKC`VVP$K`cG9os?)JdRxz#vB;iypy_h8OtyxgA97tn!6>JF^qOFa)eXj2s!iO
z9QKzn0Vequ<|GYx+r0A%cAznCCvcy33!b@K@()@f^WKBM&4-lE@E<Lks=Sb?<wS$L
ziD9IuS>EJdX3n0w1{!u9Vb~(ED}+j`*7QTQ#VQRyl)ZMHnf%YpJ9LV#X6IiW(l2U#
z7+?e88Fr<-O1)KcOBn2sf1dr2zRjOxS9&MW_XUI(5sC;`5Z**sLs&<^RM;@b8#w(K
zVYrWwu-7sf07>M{0qDR{Bd6zeSy%K+fcPoV$oN+i)}&y91pni*ci_Q!ZFt3}`NN41
PW^WCm9ovSV%`N-~!<ff#

delta 1765
zcmZ`(-D@0G6rVd^JKy`6th=ni#8lW2qop<`icM{-*n+FJT9H<UX=k$TvO7E8nboAs
zy3m05exLdeRQf3Tr1;P`1$`C=1o1^hi%)$NJZEO|fl0W`Z|*twoOACv=XdYFPyMi{
zoiR=A%C8S^T&RAbeN4!w><+moZl8;E_B&ZOI`48Wca>|CPTOFs{O8Z8o<AOX)QP;d
zoQR<}*rFoGaa2N(0TR+nq=9qO8{Fq;l`RQZ$sGGcXt2A&%2Wk|P58pE0k*%2xR~pc
zUGfU|{=FOggr5j8iG>E|k_N2Uyh|oxuHhTpM9Sx2F_B$yQh;?O7GoinVmU6PsC1Qy
z3Q>i=7^}O4;0_YTM0uJk<V@kh)~P`uHz?$?lCMj-toB7WoquTL^^iN1Knj1Rz{9Nj
z^k(a?-&UI&iO}<VZH*Q|nN}sy!pNbK9rcD6J*t2@k)0s$e3ur`#y~I;ECehOxR>CU
zSl}7;{H~3EFQjEOsIam0x?aU;3N`klRBz6K9JT;BQX>`-i2*}|QDdU~_9^U9o1{@Q
zugn#+iPH5V+joZE3Y*B6>e$F*EZHw|ot$Qm<W&oghH0dYY_avil__)sdZNd&E5YBu
z`p2j-VJ6bgTxDWGcg$FijaW_5f<6`fwMc@#>5p+4*0@-S4Ukf-admE&<eml49rA>@
za=#E4vj$E33JBU>w_+38y}#Jka@oq)^<3Vghmp&vf68{XljwAGa}?P<-}SaB)-}<)
zbTszeh>oKV=;NTFSo7QUh&t>iW&T=9h_(rKP|u+khECU`4fK?@1|ugrxFQq@lQMxe
zafU5FjtlJ)EiqqRA}w}TeUbgFF1+~!n$9B}A^?bqLA_fe>Sjzi3z~2lfFlYFizqzO
z0p~b0K?Y*X@{2%@x3o?Rn|VyjL7U97hguyO8seEba{Ck`g*tnrJy%bOdX!S^yuM&=
z9r9QPk1D&PZ>%8QPuQo7Maxp~T-$Xbr^o)$gG&kT2Z`iR>g=QyY75!TQ1bS;i30b^
zv%%s>MKI*v;(*;Z-dMv#PB=gjtp}r9wnr&O3l3#4mu9eOo^IhaJt4phdtlCxkliz{
zJ&PCl1hXpcGY%j_&yIG2^yD9XxomwyNQM1TbjU2bTpCnnAp(6B!|*hlv+qhv%NwXZ
zkFfu|&~qRrVlWs*i4@SDA0<LK9#W0Xm0u$z)-BJUJ$PcW7X$;mgz!HS>0xge3_Kfy
z?XYjl?~x0vUO6+JLE8m{ClMAARuP^@SVLGxz@yNEGro-Cb%cX`_TL>Uz=956`f4da
zNUf}t6hRS{6+j$f_NVOoiZ$~Bm?r!vgzR=g$k%~e*kpfK-f3RO9WdIFZP@kd!hh<S
BYIy(v

diff --git a/CoLo-AT/simulation_process/state_recorder.py b/CoLo-AT/simulation_process/state_recorder.py
index 97a6696..ad6a540 100644
--- a/CoLo-AT/simulation_process/state_recorder.py
+++ b/CoLo-AT/simulation_process/state_recorder.py
@@ -21,6 +21,7 @@ class StatesRecorder():
 		self.loc_err_arr = {}
 		self.trace_sigma_s_arr = {}
 		self.updata_type_arr = {}
+		self.gt_states = np.matrix(np.zeros((2*self.num_robots,1)))
 		for i, label in enumerate(self.dataset_labels):
 			self.recorded_data[label]=[]
 			self.loc_err_arr[label]=[]
@@ -28,6 +29,10 @@ class StatesRecorder():
 			self.updata_type_arr[label]=[]
 
 	def set_starting_state(self, stating_states):
+		for i, label in enumerate(self.dataset_labels):
+			self.gt_states[2*i,0] = stating_states[label][1]
+			self.gt_states[2*i+1,0] = stating_states[label][2]
+
 		for i, label in enumerate(self.dataset_labels):
 			self.start_time = stating_states[label][0]
 			time = 0
@@ -35,7 +40,7 @@ class StatesRecorder():
 			y_pos = stating_states[label][2]
 			initial_trace_state_var = 0.0001
 			loc_err = 0
-			recorded_dataline = [time, label, x_pos, y_pos, initial_trace_state_var, x_pos, y_pos, loc_err] 
+			recorded_dataline = [time, label, x_pos, y_pos, initial_trace_state_var, x_pos, y_pos, loc_err, self.gt_states.copy(), self.gt_states.copy()] 
 			self.data_in_time_order.append(recorded_dataline)	
 			self.recorded_data[label].append(recorded_dataline)	
 			self.loc_err_arr[label].append(0)
@@ -60,17 +65,20 @@ class StatesRecorder():
 		est_y_pos = float(robot_state['y_pos'])
 		trace_state_var = robot_state['trace of state variance']
 		updata_type = robot_state['update_type']
+		est_states = robot_state['est_states'].copy()
 		gt_x_pos = gt['x_pos']
 		gt_y_pos = gt['y_pos']
 		robot_label = self.dataset_labels[robot_idx]
 		
+		self.gt_states[2*robot_idx,0] = gt_x_pos
+		self.gt_states[2*robot_idx+1,0] = gt_y_pos
 		
 		if self.state_var_only:
 			loc_err = 0
-			recorded_dataline = [time, robot_label, gt_x_pos, gt_y_pos, trace_state_var, gt_x_pos, gt_y_pos, loc_err] 
+			recorded_dataline = [time, robot_label, gt_x_pos, gt_y_pos, trace_state_var, gt_x_pos, gt_y_pos, loc_err, self.gt_states.copy(), self.gt_states.copy()] 
 		else:
 			loc_err = sqrt((est_x_pos-gt_x_pos)*(est_x_pos-gt_x_pos)+(est_y_pos-gt_y_pos)*(est_y_pos-gt_y_pos))
-			recorded_dataline = [time, robot_label, est_x_pos, est_y_pos, trace_state_var, gt_x_pos, gt_y_pos, loc_err] 
+			recorded_dataline = [time, robot_label, est_x_pos, est_y_pos, trace_state_var, gt_x_pos, gt_y_pos, loc_err, est_states, self.gt_states.copy()] 
 		
 		#warning (optional)
 		'''
@@ -94,6 +102,7 @@ class StatesRecorder():
 		self.loc_err_arr[robot_label].append(loc_err)
 		self.trace_sigma_s_arr[robot_label].append(trace_state_var)
 		self.updata_type_arr[robot_label].append(updata_type)
+
 		
 
 	def get_data_in_time_order(self):
-- 
GitLab