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 zcmZv>Wk4Lw)-4=@ySqbhAKXK5ch|u+xJw6j%K*WGI|SDd+}%A$aF^f&xjg5*-*?}0 za_7g?u2p;QT6<M>bx+SuEmZI_RCN~=;4fcC+v2?14oI?`gjSsgFiVbDE>f~FD}~^p zq>05#nKAO2rzRD4oVotqU^4%8b7jyd3*ngZuRF?9c~3=7M;@^t3Pdg3YBxU<zC5j5 zj~tPo?}-{+Jn%pNc~<XK7WHFf`GNX)(sbn5GTRiE-Tl<`a(yr(>i<yQ(O>llU`{+e zs-I94W32m}F-XT@j_50A-K^lVg#X5ydD9i(@X{=$NObKxicr`4=T_)~^?9T?YyHD9 zWzn8IFaP*OiqYBARoz0##Y2;_=%3w(@)wdSf=b8d1N96?>f6lW!9oM)tEPyK*vS=z z1>TptgY{4V@V}f`03LR;@b@kOhW<yM4~Om|bQ}BRU&T<Kz9nT!%W}s|C{oT%Oys6C z2}q$13=2Ml@2Q*{q;m``R*Pk)i9aQ}r(UyojtY^xE?%KefEDbG2>nA6SN3)%MLW<K znwq>Sy7K(5Rv8+aQo2Xm0#5rl{GN~09UbdtjUFy;6kpC!h?*(tdE_F2le!oJAOzLr z*im=@G~$XC_dF%L&Azs&Kr@gzW2MXSj6l9Eux5K)+G~cD@%&5n6TTIBO}xggmG|oq z^)~;yi;Qc`{|piOj&RN`9$KYwIAnQ!G!F@>K<t3h3KA;gQ_EfJxEXT{xI2B=A%FQ* zM}BS;wMjovi~>Au4!3dFoF6;7h8W!X_N?sjDpieMJB+^Va_(?Z7r7Zun$b@czUGkg zZ3FrLN+#uuO7MRQ*eUWmPyW_cs8cNfk<ZsoAqRHkCn|0o8ZHyR>|m^cdd<p?Bv0yE z$=Q2>2o+VE9}PPCo5K>14GkaVUHvbE8FbNpd%m3DF92*nv+ggzc;X4a$^xTw;)Bn~ zoD5�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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