diff --git a/CoLo-AT/.DS_Store b/CoLo-AT/.DS_Store
index 0a170c81bddf9aed977bbe5e7f11711c1cb66f95..e01a872f7fc14b9beb6328b08d623973ea733361 100644
Binary files a/CoLo-AT/.DS_Store and b/CoLo-AT/.DS_Store differ
diff --git a/CoLo-AT/colo_demo.gif b/CoLo-AT/colo_demo.gif
new file mode 100644
index 0000000000000000000000000000000000000000..510b42ad54e08dacc55ab4fa5ab76470af32d3cb
Binary files /dev/null and b/CoLo-AT/colo_demo.gif differ
diff --git a/CoLo-AT/data_analysis/__pycache__/__init__.cpython-35.pyc b/CoLo-AT/data_analysis/__pycache__/__init__.cpython-35.pyc
index b50e6bc72aa57d159806ba314e68b284a5e34db3..3f64cf4f459e9cc56d20cea280b6446ee79f42a7 100644
Binary files a/CoLo-AT/data_analysis/__pycache__/__init__.cpython-35.pyc and b/CoLo-AT/data_analysis/__pycache__/__init__.cpython-35.pyc differ
diff --git a/CoLo-AT/data_analysis/__pycache__/__init__.cpython-36.pyc b/CoLo-AT/data_analysis/__pycache__/__init__.cpython-36.pyc
index a6c36afd728c74bcb0dfce9bb6db5c63562fdade..7951a34af129990fbec3808b660de5d9b931859d 100644
Binary files a/CoLo-AT/data_analysis/__pycache__/__init__.cpython-36.pyc and b/CoLo-AT/data_analysis/__pycache__/__init__.cpython-36.pyc differ
diff --git a/CoLo-AT/data_analysis/__pycache__/data_analyzer.cpython-35.pyc b/CoLo-AT/data_analysis/__pycache__/data_analyzer.cpython-35.pyc
index 957a8ef427c43e0f9c0e22385fa6c384afc58433..66602b7cdaafa5773bc1edfc762f0b78535c5c2a 100644
Binary files a/CoLo-AT/data_analysis/__pycache__/data_analyzer.cpython-35.pyc and b/CoLo-AT/data_analysis/__pycache__/data_analyzer.cpython-35.pyc differ
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 9099e8d5a14e68fe056753339e4b41849ba094a8..98deeb48ab51fd14206fa66498458fe60f18dfe4 100644
Binary files a/CoLo-AT/data_analysis/__pycache__/data_analyzer.cpython-36.pyc and b/CoLo-AT/data_analysis/__pycache__/data_analyzer.cpython-36.pyc differ
diff --git a/CoLo-AT/data_analysis/__pycache__/realtime_plot.cpython-35.pyc b/CoLo-AT/data_analysis/__pycache__/realtime_plot.cpython-35.pyc
index e02adf784a5865eee4553c1a29f93871a9fe3835..b1e353177970a2d22a0aa09fab3db2049328c9f9 100644
Binary files a/CoLo-AT/data_analysis/__pycache__/realtime_plot.cpython-35.pyc and b/CoLo-AT/data_analysis/__pycache__/realtime_plot.cpython-35.pyc differ
diff --git a/CoLo-AT/data_analysis/__pycache__/realtime_plot.cpython-36.pyc b/CoLo-AT/data_analysis/__pycache__/realtime_plot.cpython-36.pyc
index 6b1a42fb26002c6c84ef44c593f5cfb6ffc15f86..3a8dd54cec228a7daaec9f21364b2a5091cbcb31 100644
Binary files a/CoLo-AT/data_analysis/__pycache__/realtime_plot.cpython-36.pyc and b/CoLo-AT/data_analysis/__pycache__/realtime_plot.cpython-36.pyc differ
diff --git a/CoLo-AT/data_analysis/data_analyzer.py b/CoLo-AT/data_analysis/data_analyzer.py
index 96f3abab42f0dac2346158d27daa76d8c73070c1..f608879cdffc056f76489078cb7a4b1faa586bda 100644
--- a/CoLo-AT/data_analysis/data_analyzer.py
+++ b/CoLo-AT/data_analysis/data_analyzer.py
@@ -25,17 +25,20 @@ class Analyzer():
 	def set_dataset_label(self, dataset_labels):
 		self.dataset_labels = dataset_labels
 
-	def plot_loc_err_and_trace(self, loc_err, trace, time_arr, measurement_count):
+	def plot_loc_err_and_trace(self, loc_err, trace, time_arr, measurement_count, recorder_name = None):
+		
+		[lm_measurement_num, relative_measurment_num] = measurement_count
 		fig = plt.figure()
 		plt.suptitle('Correctness analysis')
 		fig1 = fig.add_subplot(311)
 		fig2 = fig.add_subplot(312)
 		fig3 = fig.add_subplot(313)
 
-		fig1.plot(time_arr, loc_err)
-		fig2.plot(time_arr, trace)
-		fig3.bar(time_arr, measurement_count)
-
+		fig1.plot(time_arr, loc_err, label = recorder_name)
+		fig2.plot(time_arr, trace, label = recorder_name)
+		#fig3.bar(time_arr, lm_measurement_num, label = "landmark observation")
+		fig3.bar(time_arr, relative_measurment_num,  label = "relative observation")
+		fig3.bar(time_arr, lm_measurement_num, bottom = relative_measurment_num, label = "landmark observation")
 
 		fig1.set_title('Estimation deviation error')
 		fig1.set_xlabel('Time[s]')
@@ -50,12 +53,12 @@ class Analyzer():
 		fig2.legend(loc='center left', bbox_to_anchor=(1, 0.5))
 
 
-		fig3.set_title('Observation counts', fontsize=20)
-		fig3.set_xlabel('Time[s]', fontsize=16)
-		fig3.set_ylabel('Num of obser', fontsize=16) 
+		fig3.set_title('Observation counts')
+		fig3.set_xlabel('Time[s]')
+		fig3.set_ylabel('Num of obser') 
 		#fig1.set_ylim(0, 6)
 		fig3.legend(loc='center left', bbox_to_anchor=(1, 0.5))
-		fig3.tick_params(labelsize=14)
+		#fig3.tick_params(labelsize=14)
 
 
 		fig.subplots_adjust(hspace = 1.2)
@@ -65,7 +68,10 @@ class Analyzer():
 
 	def calculate_loc_err_and_trace_state_variance_per_run(self, data_recorder, unit_time_interval = 0.5, plot_graphs = True):
 		#recorded_dataline = [time, robot_label, est_x_pos, est_y_pos, trace_state_var, gt_x_pos, gt_y_pos, loc_err, update type] 
+		
 		data = data_recorder.get_recorded_data()
+		recorder_name = data_recorder.get_name()
+
 		update_in_time_order = data_recorder.get_updata_type_in_time_order()
 		data_in_time_order = data_recorder.get_data_in_time_order()
 		
@@ -75,7 +81,8 @@ class Analyzer():
 		finish_flag = False
 
 		loc_err_per_run = []
-		measurement_num = []
+		lm_measurement_num = []
+		relative_measurment_num = []
 		trace_per_run = []
 		time_arr = []
 
@@ -83,7 +90,8 @@ class Analyzer():
 			loc_err_per_time_iterval = 0
 			trace_per_time_iterval = 0
 			num_dataline_per_time_iterval = 0
-			measurement_count = 0
+			lm_measurement_count = 0
+			relative_measurement_count = 0
 
 			while interval_start_time <= time < interval_start_time+unit_time_interval:
 				try:
@@ -93,8 +101,10 @@ class Analyzer():
 					break
 				time = data_in_time_order[time_index][0]
 
-				if update_in_time_order[time_index] == 'landmark observation' or update_in_time_order[time_index] == 'relative observation':
-					measurement_count +=1
+				if update_in_time_order[time_index] == 'landmark observation':
+					lm_measurement_count +=1
+				if update_in_time_order[time_index] == 'relative observation':
+					relative_measurement_count +=1
 
 				loc_err_per_time_iterval+= data_in_time_order[time_index][7]
 				trace_per_time_iterval += data_in_time_order[time_index][4]
@@ -113,7 +123,10 @@ class Analyzer():
 				loc_err_per_run.append(0)
 				trace_per_run.append(0)
 
-			measurement_num.append(measurement_count)
+			lm_measurement_num.append(lm_measurement_count)
+			relative_measurment_num.append(relative_measurement_count)
+
+
 			time_arr.append((interval_start_time+unit_time_interval+interval_start_time)/2)
 			interval_start_time = interval_start_time+unit_time_interval
 
@@ -123,7 +136,7 @@ class Analyzer():
 		print('Avg trace of state variances per run: ', sum(trace_per_run)/len(trace_per_run))
 		
 		if plot_graphs:
-			self.plot_loc_err_and_trace(loc_err_per_run, trace_per_run, time_arr, measurement_count = measurement_num)
+			self.plot_loc_err_and_trace(loc_err_per_run, trace_per_run, time_arr, measurement_count = [lm_measurement_num, relative_measurment_num], recorder_name = recorder_name)
 
 		return loc_err_per_run, trace_per_run, time_arr
 
@@ -219,6 +232,7 @@ class Analyzer():
 
 
 	def algos_comparison(self, arr_data_recorder, only_trace=None):
+		print("************Algorithm Comparison***************")
 		arr_loc_err = []
 		arr_trace = []
 		for data_recorder in arr_data_recorder:
diff --git a/CoLo-AT/data_analysis/realtime_plot.py b/CoLo-AT/data_analysis/realtime_plot.py
index a9c65ffcc9c9fd9337916b82700b6ca6e3f51ec7..066239c8021fff68da08888741738a9558d1fb52 100644
--- a/CoLo-AT/data_analysis/realtime_plot.py
+++ b/CoLo-AT/data_analysis/realtime_plot.py
@@ -69,8 +69,10 @@ def initialize_graphs(num_robots, ax_err, ax_var, loc_err, trace_sigma, time_fun
 	arr_var = []
 	for i in range(0, num_robots):
 		time_arr = time_func(i + 1)
-		line, = ax_err.plot(time_arr, loc_err[i+1], colors[i]+'-', label='Robot ' + str(i+1))
-		line2, = ax_var.plot(time_arr, trace_sigma[i+1], colors[i]+'-', label='Robot ' + str(i+1))
+		#line, = ax_err.plot(time_arr, loc_err[i+1], colors[i]+'-', label='Robot ' + str(i+1))
+		#line2, = ax_var.plot(time_arr, trace_sigma[i+1], colors[i]+'-', label='Robot ' + str(i+1))
+		line, = ax_err.plot(time_arr, loc_err[i+1], colors[i]+'-')
+		line2, = ax_var.plot(time_arr, trace_sigma[i+1], colors[i]+'-')
 		arr_err.append(line)
 		arr_var.append(line2)
 	return [arr_err, arr_var]
@@ -155,7 +157,6 @@ def animate_plot(dataset_labels, data_recorder, analyzer, lm = None):
 	num_robots = int(len(dataset_labels))
 	# initialize graphs: error, demo, state variance
 	
-	'''
 	fig = plt.figure(figsize=(12, 9), tight_layout=True)
 	fig.subplots_adjust(top=0.88)
 	gs = gridspec.GridSpec(3, 2)
@@ -163,6 +164,7 @@ def animate_plot(dataset_labels, data_recorder, analyzer, lm = None):
 	ax_err = plt.subplot(gs[0, 0])
 	ax_var = plt.subplot(gs[0, 1])
 	ax = plt.subplot(gs[1:, :])
+
 	'''
 	fig = plt.figure()
 	gs = gridspec.GridSpec(3, 2)
@@ -172,6 +174,7 @@ def animate_plot(dataset_labels, data_recorder, analyzer, lm = None):
 
 	ax.set_xlim([-2, 2])
 	ax.set_ylim([-2, 2])
+	'''
 	# configure graph
 	# set bounds
 	#fig.set_size_inches((18,18))
diff --git a/CoLo-AT/dataset_manager/__pycache__/__init__.cpython-35.pyc b/CoLo-AT/dataset_manager/__pycache__/__init__.cpython-35.pyc
index f3c36bd5c707e061f9d31563c5f2f8b0ccc41c32..109e4a0bcacc9897b7b0a4058eec30b6f11996b3 100644
Binary files a/CoLo-AT/dataset_manager/__pycache__/__init__.cpython-35.pyc and b/CoLo-AT/dataset_manager/__pycache__/__init__.cpython-35.pyc differ
diff --git a/CoLo-AT/dataset_manager/__pycache__/__init__.cpython-36.pyc b/CoLo-AT/dataset_manager/__pycache__/__init__.cpython-36.pyc
index d15e459c547ee60f84d0fd9af17f5941c3593eb0..cb88c3505e2b2c5e6c1ee380f0a77cd9c0a344d3 100644
Binary files a/CoLo-AT/dataset_manager/__pycache__/__init__.cpython-36.pyc and b/CoLo-AT/dataset_manager/__pycache__/__init__.cpython-36.pyc differ
diff --git a/CoLo-AT/dataset_manager/__pycache__/realworld_dataset_manager.cpython-35.pyc b/CoLo-AT/dataset_manager/__pycache__/realworld_dataset_manager.cpython-35.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..401ad6cc646bff1fee55da87fdee3ea78068da04
Binary files /dev/null and b/CoLo-AT/dataset_manager/__pycache__/realworld_dataset_manager.cpython-35.pyc differ
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 5ed681eb5c3773249ce5512ba5e08b9c1e174c34..f73b2cf653e3579d4ded1a002c64063cda1cb593 100644
Binary files a/CoLo-AT/dataset_manager/__pycache__/realworld_dataset_manager.cpython-36.pyc and b/CoLo-AT/dataset_manager/__pycache__/realworld_dataset_manager.cpython-36.pyc differ
diff --git a/CoLo-AT/gs_ci_journal.py b/CoLo-AT/gs_ci_journal.py
new file mode 100644
index 0000000000000000000000000000000000000000..91ee0212f07fdd62f0520436112a5473b39e36be
--- /dev/null
+++ b/CoLo-AT/gs_ci_journal.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Sun Apr  8 17:55:06 2018
+
+@author: william
+"""
+
+import os, sys
+import getpass
+sys.path.append(os.path.join(os.path.dirname(__file__), "."))
+from dataset_manager.realworld_dataset_manager import RW_Dataset_Manager
+from simulation_process.sim_manager import  SimulationManager
+from robots.robot_system import RobotSystem
+from simulation_process.state_recorder import StatesRecorder
+from data_analysis.data_analyzer import Analyzer
+from data_analysis.realtime_plot import animate_plot
+
+# load algorithms 
+sys.path.append(os.path.join(os.path.dirname(__file__), "localization_algos"))
+from ekf_gs_ci2 import EKF_GS_CI2
+from gs_ci_bound import GS_CI_Bound
+
+# dataset_path = "/Users/shengkangchen/Documents/CoLo/CoLo-D/CoLo-Datasets/official_dataset3/"
+dataset_path = "/home/william/CoLo/CoLo-D/CoLo-Datasets/official_dataset3/" # for desktop Ubuntu
+
+robot_labels = [1,2,3]
+duration = 180 # duration for the simulation in sec
+testing_dataset = RW_Dataset_Manager('testing')
+start_time, starting_states, dataset_data, time_arr = testing_dataset.load_datasets(dataset_path, robot_labels, duration)
+analyzer = Analyzer('analyzer', robot_labels)
+
+loc_algo = EKF_GS_CI2('algo')
+robot = RobotSystem('robot', robot_labels, loc_algo, distr_sys = True)
+sim = SimulationManager('sim gs_ci')
+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 = True)
+
+#animate_plot(robot_labels, state_recorder, analyzer, testing_dataset.get_landmark_map())
+
+##############################################################################
+
+testing_dataset.dataset_reset()
+loc_algo = GS_CI_Bound('algo')
+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, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_bound, plot_graphs = True)
+
+analyzer.algos_comparison([state_recorder, state_recorder_bound], only_trace = ['gs_ci_bound'])
diff --git a/CoLo-AT/gs_sci_vs_ls_ci.py b/CoLo-AT/gs_sci_vs_ls_ci.py
new file mode 100644
index 0000000000000000000000000000000000000000..e3bba30a0e831272609bb0f52b909aa2f8185632
--- /dev/null
+++ b/CoLo-AT/gs_sci_vs_ls_ci.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Sun Apr  8 17:55:06 2018
+
+@author: william
+"""
+
+import os, sys
+import getpass
+sys.path.append(os.path.join(os.path.dirname(__file__), "."))
+from dataset_manager.realworld_dataset_manager import RW_Dataset_Manager
+from simulation_process.sim_manager import  SimulationManager
+from robots.robot_system import RobotSystem
+from simulation_process.state_recorder import StatesRecorder
+from data_analysis.data_analyzer import Analyzer
+from data_analysis.realtime_plot import animate_plot
+
+# load algorithms 
+sys.path.append(os.path.join(os.path.dirname(__file__), "localization_algos"))
+from centralized_ekf import Centralized_EKF # works
+from ekf_ls_bda import EKF_LS_BDA
+from ekf_ls_ci import EKF_LS_CI
+from ekf_gs_ci2 import EKF_GS_CI2
+from ekf_gs_sci2 import EKF_GS_SCI2
+
+
+# dataset_path = "/Users/shengkangchen/Documents/CoLo/CoLo-D/CoLo-Datasets/official_dataset3/"
+dataset_path = "/home/william/CoLo/CoLo-D/CoLo-Datasets/official_dataset1/" # for desktop Ubuntu
+
+robot_labels = [1,2,3]
+duration = 180 # duration for the simulation in sec
+testing_dataset = RW_Dataset_Manager('testing')
+start_time, starting_states, dataset_data, time_arr = testing_dataset.load_datasets(dataset_path, robot_labels, duration)
+analyzer = Analyzer('analyzer', robot_labels)
+
+loc_algo = EKF_GS_CI2('algo')
+robot = RobotSystem('robot', robot_labels, loc_algo, distr_sys = True)
+sim = SimulationManager('sim gs_ci')
+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 = True)
+
+#animate_plot(robot_labels, state_recorder, analyzer, testing_dataset.get_landmark_map())
+
+##############################################################################
+
+
+testing_dataset.dataset_reset()
+loc_algo = EKF_LS_CI('algo')
+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 = True)
+
+##############################################################################
+'''
+testing_dataset.dataset_reset()
+loc_algo = EKF_GS_SCI2('algo')
+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 = True)
+'''
+analyzer.algos_comparison([state_recorder, state_recorder_LS_CI])
diff --git a/CoLo-AT/icra2019_demo.py b/CoLo-AT/icra2019_demo.py
new file mode 100644
index 0000000000000000000000000000000000000000..69956e1540fec673f4c1c484ac9307c57b320484
--- /dev/null
+++ b/CoLo-AT/icra2019_demo.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Sun Apr  8 17:55:06 2018
+
+@author: william
+"""
+
+import os, sys
+import getpass
+sys.path.append(os.path.join(os.path.dirname(__file__), "."))
+from dataset_manager.realworld_dataset_manager import RW_Dataset_Manager
+from simulation_process.sim_manager import  SimulationManager
+from robots.robot_system import RobotSystem
+from simulation_process.state_recorder import StatesRecorder
+from data_analysis.data_analyzer import Analyzer
+from data_analysis.realtime_plot import animate_plot
+
+# load algorithms 
+sys.path.append(os.path.join(os.path.dirname(__file__), "localization_algos"))
+from centralized_ekf import Centralized_EKF
+from ekf_gs_ci2 import EKF_GS_CI2
+
+# dataset_path = "/Users/shengkangchen/Documents/CoLo/CoLo-D/CoLo-Datasets/official_dataset3/"
+dataset_path = "/home/william/CoLo/CoLo-D/CoLo-Datasets/official_dataset3/" # for desktop Ubuntu
+
+robot_labels = [1,2,3]
+duration = 120 # duration for the simulation in sec
+testing_dataset = RW_Dataset_Manager('testing')
+start_time, starting_states, dataset_data, time_arr = testing_dataset.load_datasets(dataset_path, robot_labels, duration)
+analyzer = Analyzer('analyzer', robot_labels)
+
+loc_algo = EKF_GS_CI2('algo')
+robot = RobotSystem('robot', robot_labels, loc_algo, distr_sys = True)
+sim = SimulationManager('sim gs_ci')
+state_recorder = StatesRecorder('gs_ci', robot_labels)
+
+sim.sim_process_native(robot_labels, testing_dataset, robot, state_recorder, simple_plot = True)
+loc_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder, plot_graphs = True)
+
+animate_plot(robot_labels, state_recorder, analyzer, testing_dataset.get_landmark_map())
+
+##############################################################################
+'''
+testing_dataset.dataset_reset()
+loc_algo = Centralized_EKF('algo')
+robot = RobotSystem('robot', robot_labels, loc_algo, distr_sys = False)
+
+sim = SimulationManager('Centralized_EKF')
+state_recorder_cen = StatesRecorder('Cen-EKF', robot_labels)
+sim.sim_process_native(robot_labels, testing_dataset, robot, state_recorder_cen, simple_plot = True)
+loc_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_cen, plot_graphs = True)
+
+analyzer.algos_comparison([state_recorde_gs_ci, state_recorder_cen])
+'''
diff --git a/CoLo-AT/isrr2017_v2_2019.py b/CoLo-AT/isrr2017_v2_2019.py
new file mode 100644
index 0000000000000000000000000000000000000000..344afecd0dd92e7ecdf14c0654d6f450ab8bbcbd
--- /dev/null
+++ b/CoLo-AT/isrr2017_v2_2019.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Sun Apr  8 17:55:06 2018
+
+@author: william
+"""
+
+import os, sys
+import getpass
+sys.path.append(os.path.join(os.path.dirname(__file__), "."))
+from dataset_manager.realworld_dataset_manager import RW_Dataset_Manager
+from simulation_process.sim_manager import  SimulationManager
+from robots.robot_system import RobotSystem
+from simulation_process.state_recorder import StatesRecorder
+from data_analysis.data_analyzer import Analyzer
+from data_analysis.realtime_plot import animate_plot
+
+# load algorithms 
+sys.path.append(os.path.join(os.path.dirname(__file__), "localization_algos"))
+from centralized_ekf import Centralized_EKF # works
+from ekf_ls_bda import EKF_LS_BDA
+from ekf_ls_ci import EKF_LS_CI
+from ekf_gs_ci2 import EKF_GS_CI2
+from ekf_gs_sci2 import EKF_GS_SCI2
+
+
+# dataset_path = "/Users/shengkangchen/Documents/CoLo/CoLo-D/CoLo-Datasets/official_dataset3/"
+dataset_path = "/home/william/CoLo/CoLo-D/CoLo-Datasets/official_dataset3/" # for desktop Ubuntu
+
+robot_labels = [1,2,3]
+duration = 180 # duration for the simulation in sec
+testing_dataset = RW_Dataset_Manager('testing')
+start_time, starting_states, dataset_data, time_arr = testing_dataset.load_datasets(dataset_path, robot_labels, duration)
+analyzer = Analyzer('analyzer', robot_labels)
+
+loc_algo = EKF_GS_CI2('algo')
+robot = RobotSystem('robot', robot_labels, loc_algo, distr_sys = True)
+sim = SimulationManager('sim gs_ci')
+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 = True)
+
+#animate_plot(robot_labels, state_recorder, analyzer, testing_dataset.get_landmark_map())
+
+##############################################################################
+
+testing_dataset.dataset_reset()
+loc_algo = Centralized_EKF('algo')
+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 = True)
+
+
+##############################################################################
+
+testing_dataset.dataset_reset()
+loc_algo = EKF_LS_BDA('algo')
+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 = True)
+
+
+##############################################################################
+
+testing_dataset.dataset_reset()
+loc_algo = EKF_LS_CI('algo')
+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 = True)
+
+##############################################################################
+
+testing_dataset.dataset_reset()
+loc_algo = EKF_GS_SCI2('algo')
+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 = True)
+
+analyzer.algos_comparison([state_recorder, state_recorder_LS_cen, state_recorder_LS_BDA, state_recorder_LS_CI, state_recorder_GS_SCI])
diff --git a/CoLo-AT/localization_algos/__pycache__/centralized_ekf.cpython-35.pyc b/CoLo-AT/localization_algos/__pycache__/centralized_ekf.cpython-35.pyc
index 81a915cb00b1fdfc5005ee5199ace0d68e5e028d..79c599cd36ed6d568c136407ebd3c80227e748ef 100644
Binary files a/CoLo-AT/localization_algos/__pycache__/centralized_ekf.cpython-35.pyc and b/CoLo-AT/localization_algos/__pycache__/centralized_ekf.cpython-35.pyc differ
diff --git a/CoLo-AT/localization_algos/__pycache__/centralized_ekf.cpython-36.pyc b/CoLo-AT/localization_algos/__pycache__/centralized_ekf.cpython-36.pyc
index 841baa9ca29af8beb5f008ea2df788530bc20823..b622a79aa5e6e569d0346267045d4f76a5f9e92b 100644
Binary files a/CoLo-AT/localization_algos/__pycache__/centralized_ekf.cpython-36.pyc and b/CoLo-AT/localization_algos/__pycache__/centralized_ekf.cpython-36.pyc differ
diff --git a/CoLo-AT/localization_algos/__pycache__/ekf_gs_ci2.cpython-35.pyc b/CoLo-AT/localization_algos/__pycache__/ekf_gs_ci2.cpython-35.pyc
index 1bb4b98c836ce1ebbd895f1c63f76b070036ea18..644e3723232ce5b977d0f3d3d8841634c8166d5c 100644
Binary files a/CoLo-AT/localization_algos/__pycache__/ekf_gs_ci2.cpython-35.pyc and b/CoLo-AT/localization_algos/__pycache__/ekf_gs_ci2.cpython-35.pyc differ
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 8fcbaef524ac506c9b9676683c55297759c8b32a..87b4e002316795055a7b4197a473a3c2f164b637 100644
Binary files a/CoLo-AT/localization_algos/__pycache__/ekf_gs_ci2.cpython-36.pyc and b/CoLo-AT/localization_algos/__pycache__/ekf_gs_ci2.cpython-36.pyc differ
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 dfff1580319cd69bccc411af302e0a2a4aeb2dd0..6843e8adf7a54bbc8527d351585099c800e71b27 100644
Binary files a/CoLo-AT/localization_algos/__pycache__/ekf_ls_bda.cpython-36.pyc and b/CoLo-AT/localization_algos/__pycache__/ekf_ls_bda.cpython-36.pyc differ
diff --git a/CoLo-AT/localization_algos/__pycache__/ekf_ls_ci.cpython-36.pyc b/CoLo-AT/localization_algos/__pycache__/ekf_ls_ci.cpython-36.pyc
index 7bbf05027bcebec06b2ffaf2f49d45c423207ea6..8f679589595ce4259c225d0622f73a6b0385245e 100644
Binary files a/CoLo-AT/localization_algos/__pycache__/ekf_ls_ci.cpython-36.pyc and b/CoLo-AT/localization_algos/__pycache__/ekf_ls_ci.cpython-36.pyc differ
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
new file mode 100644
index 0000000000000000000000000000000000000000..0011e92cb63c4fc5e20457ee0cf17255617a39e5
Binary files /dev/null and b/CoLo-AT/localization_algos/__pycache__/gs_ci_bound.cpython-36.pyc differ
diff --git a/CoLo-AT/localization_algos/__pycache__/localization_algo_framework.cpython-35.pyc b/CoLo-AT/localization_algos/__pycache__/localization_algo_framework.cpython-35.pyc
index c70caf19a44a99759548f9b65aac709c0097fd76..88d837a62b2ef777eda88089d67bdb36db91cf81 100644
Binary files a/CoLo-AT/localization_algos/__pycache__/localization_algo_framework.cpython-35.pyc and b/CoLo-AT/localization_algos/__pycache__/localization_algo_framework.cpython-35.pyc differ
diff --git a/CoLo-AT/localization_algos/__pycache__/localization_algo_framework.cpython-36.pyc b/CoLo-AT/localization_algos/__pycache__/localization_algo_framework.cpython-36.pyc
index eec902bc7e08e4b527973ba0b2a34ecf567d64a3..0bca44984a733081df2ca92b4174ffa27ef07b52 100644
Binary files a/CoLo-AT/localization_algos/__pycache__/localization_algo_framework.cpython-36.pyc and b/CoLo-AT/localization_algos/__pycache__/localization_algo_framework.cpython-36.pyc differ
diff --git a/CoLo-AT/localization_algos/ekf_gs_ci2.py b/CoLo-AT/localization_algos/ekf_gs_ci2.py
index 5743b3fd332172fcf35da58acb01d5f7a8effba7..19d7cadd0b6d571de4a6b9e63ae6950ced29b2d1 100644
--- a/CoLo-AT/localization_algos/ekf_gs_ci2.py
+++ b/CoLo-AT/localization_algos/ekf_gs_ci2.py
@@ -53,8 +53,8 @@ class EKF_GS_CI2(ekf_algo_framework):
 	def absolute_obser_update(self, robot_data, sensor_data):
 		[s, orinetations, sigma_s, index] = robot_data
 		[measurement_data, sensor_covariance] = sensor_data
-		
 		sigma_ob = sensor_covariance
+		
 		num_robots = int(len(s)/2)
 		self_theta = orinetations[index]
 
diff --git a/CoLo-AT/localization_algos/ekf_ls_ci.py b/CoLo-AT/localization_algos/ekf_ls_ci.py
index fe396468252612ed20b838524c8dc6fbf0f9f63b..cfe89cdc573141203a19b937443a38ab7001992b 100644
--- a/CoLo-AT/localization_algos/ekf_ls_ci.py
+++ b/CoLo-AT/localization_algos/ekf_ls_ci.py
@@ -40,8 +40,8 @@ class EKF_LS_CI(ekf_algo_framework):
 		s[i+1,0] = s[i+1,0] + sin(self_theta)*v*delta_t #y
 
 		var_u_v = sigma_odo[0,0]
-		sigma_s[i:i+2, i:i+2] = sigma_s[i:i+2, i:i+2]+ delta_t*delta_t*rot_mtx(self_theta)*matrix([[var_u_v, 0],[0, 0]])*rot_mtx(self_theta).T
-
+		#sigma_s[i:i+2, i:i+2] = sigma_s[i:i+2, i:i+2]+ delta_t*delta_t*rot_mtx(self_theta)*matrix([[var_u_v, 0],[0, 0]])*rot_mtx(self_theta).T
+		sigma_s[i:i+2, i:i+2] = sigma_s[i:i+2, i:i+2]+ delta_t*delta_t*rot_mtx(self_theta)*sigma_odo*rot_mtx(self_theta).T
 		return [s, orinetations, sigma_s]
 
 
@@ -78,8 +78,6 @@ class EKF_LS_CI(ekf_algo_framework):
 		z_hat = rot_mtx(self_theta).getT()*(np.matrix([delta_x, delta_y]).getT())  # shifted to robot frame
 
 
-
-
 		sigma_z = rot_mtx(bearing) * sigma_ob * rot_mtx(bearing).getT() 
 		sigma_invention = H * local_sigma * H.getT()  + sigma_z
 		kalman_gain = local_sigma*H.getT()*sigma_invention.getI()
diff --git a/CoLo-AT/localization_algos/gs_ci_bound.py b/CoLo-AT/localization_algos/gs_ci_bound.py
index 74e482c0b35a179d6fda78b7fb1512de9f406183..da3a82097d2c3bd74131201efc44ea3827bb96f0 100644
--- a/CoLo-AT/localization_algos/gs_ci_bound.py
+++ b/CoLo-AT/localization_algos/gs_ci_bound.py
@@ -1,67 +1,60 @@
 import numpy as np
 from numpy import matrix
 from math import cos, sin, atan2, sqrt
+from localization_algo_framework import ekf_algo_framework
 
 def rot_mtx(theta):
 	return matrix([[cos(theta), -sin(theta)], [sin(theta), cos(theta)]])
 
-class gs_ci_bound():
+class GS_CI_Bound(ekf_algo_framework):
 	def __init__(self, algo_name):
 		self.algo_name = algo_name
-		self.d_max = 4.5 # max measurement distance 
+		self.d_max = 2 # max measurement distance 
 		self.d_var = 0.2
 		self.bearing_var = 0.2
-		self.var_v = 0.5
+		self.var_v = 0.1
 
-	def state_veriance_init(self, num_robots):
+	def state_variance_init(self, num_robots):
 		return 0.01*np.matrix(np.identity(2*num_robots), dtype = float)
 
-	def algo_update(self, robot_data, update_type, sensor_data):
-		print 'in th algo update'
-		#return [s, orinetations, sigma_s]
-		[s, odo_freq, th_sigma_s, index] = robot_data
-		[measurement_data, sensor_covariance] = sensor_data
-		
-		if update_type == 'propagation update':
-			print 'th bound propagation'
-			return self.propagation_update(s, th_sigma_s, sensor_covariance, index, odo_freq)
-		elif update_type == 'landmark observation update':
-			return self.absolute_obser_update(s, th_sigma_s, index)
-		elif update_type == 'relative observation update':
-			obser_index = measurement_data[0]
-			return self.relative_obser_update(s, th_sigma_s, index, obser_index)
-		elif update_type == 'communication':
-			return self.communication(s, th_sigma_s, index, measurement_data)
-		else:
-			print "invalid update"
-
+	def calculate_trace_state_variance(self, robot_data):
+		[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
 
-	def calculate_trace_state_variance(self, state_variance, robot_index):
-		#j = robot_index*2
-		#return np.trace(state_variance[j:j+1, j:j+1])
-		return np.trace(state_variance)
+	#def propagation_update(self, s, th_sigma_s, sigma_odo, index, odo_freq):
+	def propagation_update(self, robot_data, sensor_data):
+		[s, orinetations, sigma_s, index] = robot_data
+		[measurement_data, sensor_covariance] = sensor_data
+		sigma_odo = sensor_covariance
 
-	def propagation_update(self, s, th_sigma_s, sigma_odo, index, odo_freq):
-		num_robots = len(s)/2
+		num_robots = int(len(s)/2)
 		i = 2*index
-		delta_t = 1/odo_freq
+		#delta_t = 1/odo_freq
+		delta_t = measurement_data[0]
 
 		for j in range(num_robots):
 			jj = 2*j
 
 		if j==index:
-			th_sigma_s[jj:jj+2, jj:jj+2] += sigma_odo[0,0]*np.identity(2)*delta_t*delta_t
+			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
-			th_sigma_s[jj:jj+2, jj:jj+2] += var_v*np.identity(2)*delta_t*delta_t
-		print 'bound'
-		print np.trace(state_variance)
-		return th_sigma_s
+			sigma_s[jj:jj+2, jj:jj+2] += var_v*np.identity(2)*delta_t*delta_t
+		
+		#return th_sigma_s
+		return [s, orinetations, sigma_s]
+
 
+	#def absolute_obser_update(self, s, th_sigma_s, index):
+	def absolute_obser_update(self, robot_data, sensor_data):
+		[s, orinetations, sigma_s, index] = robot_data
+		[measurement_data, sensor_covariance] = sensor_data
+		sigma_ob = sensor_covariance
 
-	def absolute_obser_update(self, s, th_sigma_s, index):
-		num_robots = len(s)/2
+		num_robots = int(len(s)/2)
 		i = 2*index
 		H_i = np.matrix(np.zeros((2,2*num_robots)))
 		H_i[0, i] = -1
@@ -71,22 +64,25 @@ class gs_ci_bound():
 		var_dis = self.d_var
 		var_phi = self.bearing_var
 
-		#sigma_th_z = np.matrix(max(sigma_d, d_max*d_max*sigma_bearing)*np.identity(2)) #sigme_Ri
-		#th_sigma_s = (th_sigma_s.getI()+H_i.getT()*sigma_th_z.getI()*H_i).getI()
-
 		sigma_th_z =  np.matrix(max(var_dis, d_max*d_max*var_phi)*np.identity(2))
-		th_sigma_s = (th_sigma_s.getI() + H_i.getT() * sigma_th_z.getI() * H_i).getI()
+		sigma_s = (sigma_s.getI() + H_i.getT() * sigma_th_z.getI() * H_i).getI()
 
-		return th_sigma_s
+		return [s, orinetations, sigma_s]
 
 
-	def relative_obser_update(self, s, th_sigma_s, index, obser_index):
+	#def relative_obser_update(self, s, th_sigma_s, index, obser_index):
 	#i obser j 
+	def relative_obser_update(self, robot_data, sensor_data):
+		#when robot i observes robot j 
+		[s, orinetations, sigma_s, index] = robot_data
+		[measurement_data, sensor_covariance] = sensor_data
+		sigma_ob = sensor_covariance
 
-		i = 2*index
-		j = obser_index * 2 
+		num_robots = int(len(s)/2)
 
-		num_robots = len(s)/2
+		i = 2*index
+		obser_index = measurement_data[0] 
+		j = obser_index * 2 	
 
 		H_ij  = np.matrix(np.zeros((2,2*num_robots)))
 		H_ij[0, i] = -1
@@ -99,43 +95,19 @@ class gs_ci_bound():
 		var_phi = self.bearing_var
 
 		sigma_th_z =  np.matrix(max(var_dis, d_max*d_max*var_phi)*np.identity(2))
-		th_sigma_s = (th_sigma_s.getI() + H_ij.getT() * sigma_th_z.getI() * H_ij).getI()
-		return th_sigma_s
-
-
-	def communication(self, s, th_sigma_s, index, measurement_data):
-		
-		e = 0.5
-		'''
-		sender_th_sigma_s = measurement_data
-		rec_th_sigma_s = th_sigma_s
-		sig_inv = e*rec_th_sigma_s.getI() + (1-e)*sender_th_sigma_s.getI()
-		th_sigma_s = sig_inv.getI()
-		
-		'''
-		'''
-		i = 1*2
-		j = 2*2  
+		sigma_s = (sigma_s.getI() + H_ij.getT() * sigma_th_z.getI() * H_ij).getI()
+		return [s, orinetations, sigma_s]
 
-		num_robots = len(s)/2
 
-		H_ij  = np.matrix(np.zeros((2,2*num_robots)))
-		H_ij[0, i] = -1
-		H_ij[1, i+1] = -1
-		H_ij[0, j] = 1
-		H_ij[1, j+1] = 1
-		
+	#def communication(self, s, th_sigma_s, index, measurement_data):
+	def communication(self, robot_data, sensor_data):
+		[s, orinetations, sigma_s, index] = robot_data
+		[comm_data, comm_variance] = sensor_data
+		[sender_idx, comm_robot_s, comm_robot_sigma_s]=comm_data
 
-		d_max = self.d_max
-		sigma_d = self.d_var
-		sigma_bearing = self.bearing_var
 
-		sigma_th_z = np.matrix(max(sigma_d, d_max*d_max*sigma_bearing)*np.identity(2)) #sigme_Ri
-		sig_inv = e*th_sigma_s.getI() + (1-e)*(th_sigma_s.getI()+H_ij.getT()*sigma_th_z.getI()*H_ij)
-		th_sigma_s = sig_inv.getI()
-		'''
+		e = 0.8
 		
-		comm_robot_th_sigma = measurement_data
-		th_sigma_s = ( e*th_sigma_s.getI() + (1-e)*comm_robot_th_sigma.getI()).getI()		# from TK's gs-ci
+		sigma_s = ( e*sigma_s.getI() + (1-e)*comm_robot_sigma_s.getI()).getI()		# from TK's gs-ci
 
-		return th_sigma_s
\ No newline at end of file
+		return [s, orinetations, sigma_s]
diff --git a/CoLo-AT/requests/__pycache__/request_response.cpython-35.pyc b/CoLo-AT/requests/__pycache__/request_response.cpython-35.pyc
index e79d4a633a8d51d0b273c790f2ee29e6e9bbfe70..9d75bf28fb5aff3b1f711a9b3852a24b87ffa9ee 100644
Binary files a/CoLo-AT/requests/__pycache__/request_response.cpython-35.pyc and b/CoLo-AT/requests/__pycache__/request_response.cpython-35.pyc differ
diff --git a/CoLo-AT/requests/__pycache__/request_response.cpython-36.pyc b/CoLo-AT/requests/__pycache__/request_response.cpython-36.pyc
index 02de2f22087bd952cd1f47b84adff5254474fbc2..02f0b15864eb7b70ac13122aa853f571e3175e7e 100644
Binary files a/CoLo-AT/requests/__pycache__/request_response.cpython-36.pyc and b/CoLo-AT/requests/__pycache__/request_response.cpython-36.pyc differ
diff --git a/CoLo-AT/robots/__pycache__/__init__.cpython-35.pyc b/CoLo-AT/robots/__pycache__/__init__.cpython-35.pyc
index fde83e0bb0008574e83485b2e7a81e1b926fc965..333254c8ae1a8772b63d1ba9930e6ca381710fe3 100644
Binary files a/CoLo-AT/robots/__pycache__/__init__.cpython-35.pyc and b/CoLo-AT/robots/__pycache__/__init__.cpython-35.pyc differ
diff --git a/CoLo-AT/robots/__pycache__/__init__.cpython-36.pyc b/CoLo-AT/robots/__pycache__/__init__.cpython-36.pyc
index 9fbfa1b359d1539e86fc883a14c1eca9b609c242..3e4279038eff40af456ec8a9a6ad13d41851a75e 100644
Binary files a/CoLo-AT/robots/__pycache__/__init__.cpython-36.pyc and b/CoLo-AT/robots/__pycache__/__init__.cpython-36.pyc differ
diff --git a/CoLo-AT/robots/__pycache__/robot_centralized.cpython-35.pyc b/CoLo-AT/robots/__pycache__/robot_centralized.cpython-35.pyc
index 2923475fb218f4636ecca0048cd1f783bbc77218..40aceca93c112a831eba9eadc798941cd70d2513 100644
Binary files a/CoLo-AT/robots/__pycache__/robot_centralized.cpython-35.pyc and b/CoLo-AT/robots/__pycache__/robot_centralized.cpython-35.pyc differ
diff --git a/CoLo-AT/robots/__pycache__/robot_centralized.cpython-36.pyc b/CoLo-AT/robots/__pycache__/robot_centralized.cpython-36.pyc
index f398e784201849b2ada4d3786ab8e9f91f15f080..4fb83e19970af4b54c068338068033b446c1d1c9 100644
Binary files a/CoLo-AT/robots/__pycache__/robot_centralized.cpython-36.pyc and b/CoLo-AT/robots/__pycache__/robot_centralized.cpython-36.pyc differ
diff --git a/CoLo-AT/robots/__pycache__/robot_distributive.cpython-35.pyc b/CoLo-AT/robots/__pycache__/robot_distributive.cpython-35.pyc
index 1900e20db14dbc6e249b365145032c41259d6c67..401aa4cd4e7808a28610b693484913699ac3c43e 100644
Binary files a/CoLo-AT/robots/__pycache__/robot_distributive.cpython-35.pyc and b/CoLo-AT/robots/__pycache__/robot_distributive.cpython-35.pyc differ
diff --git a/CoLo-AT/robots/__pycache__/robot_distributive.cpython-36.pyc b/CoLo-AT/robots/__pycache__/robot_distributive.cpython-36.pyc
index da90b600c29a7f15a8efa73b8285c7ec01ba6880..5bb557ca470f7cead2cc371006431c89563455b5 100644
Binary files a/CoLo-AT/robots/__pycache__/robot_distributive.cpython-36.pyc and b/CoLo-AT/robots/__pycache__/robot_distributive.cpython-36.pyc differ
diff --git a/CoLo-AT/robots/__pycache__/robot_parameters.cpython-35.pyc b/CoLo-AT/robots/__pycache__/robot_parameters.cpython-35.pyc
index 74164906cd1d1220b0a92c38542c179e50aed113..4c471e33be11b51867fdac09f03a41b7f20ceb8a 100644
Binary files a/CoLo-AT/robots/__pycache__/robot_parameters.cpython-35.pyc and b/CoLo-AT/robots/__pycache__/robot_parameters.cpython-35.pyc differ
diff --git a/CoLo-AT/robots/__pycache__/robot_parameters.cpython-36.pyc b/CoLo-AT/robots/__pycache__/robot_parameters.cpython-36.pyc
index 5c0a10a0b85351858e365c063ea53d687f40cbba..f3b63698f4f2e7abe941a8abd88bd6650ccf3129 100644
Binary files a/CoLo-AT/robots/__pycache__/robot_parameters.cpython-36.pyc and b/CoLo-AT/robots/__pycache__/robot_parameters.cpython-36.pyc differ
diff --git a/CoLo-AT/robots/__pycache__/robot_system.cpython-35.pyc b/CoLo-AT/robots/__pycache__/robot_system.cpython-35.pyc
index 25d23386e6336389cfb87686ae89bd28cf844cda..85a4a486ad21a86b2e443ecf78b4c9641d077723 100644
Binary files a/CoLo-AT/robots/__pycache__/robot_system.cpython-35.pyc and b/CoLo-AT/robots/__pycache__/robot_system.cpython-35.pyc differ
diff --git a/CoLo-AT/robots/__pycache__/robot_system.cpython-36.pyc b/CoLo-AT/robots/__pycache__/robot_system.cpython-36.pyc
index fdf4fa1b6761803dabb7c8be296bda7f1920a661..a3749f65089c47a4d5adccc0f77e5a142a6440b3 100644
Binary files a/CoLo-AT/robots/__pycache__/robot_system.cpython-36.pyc and b/CoLo-AT/robots/__pycache__/robot_system.cpython-36.pyc differ
diff --git a/CoLo-AT/simulation_process/__pycache__/__init__.cpython-35.pyc b/CoLo-AT/simulation_process/__pycache__/__init__.cpython-35.pyc
index 1f0f986567d17783310f451baffb6572a4c29fd9..971d47f21061cba8146af7e9127921a36a4e4ad6 100644
Binary files a/CoLo-AT/simulation_process/__pycache__/__init__.cpython-35.pyc and b/CoLo-AT/simulation_process/__pycache__/__init__.cpython-35.pyc differ
diff --git a/CoLo-AT/simulation_process/__pycache__/__init__.cpython-36.pyc b/CoLo-AT/simulation_process/__pycache__/__init__.cpython-36.pyc
index 9911a68bb6d5909124222a8960179c2e0a77f33f..69554d904b9048111013c5e978a58d4a14d3ee19 100644
Binary files a/CoLo-AT/simulation_process/__pycache__/__init__.cpython-36.pyc and b/CoLo-AT/simulation_process/__pycache__/__init__.cpython-36.pyc differ
diff --git a/CoLo-AT/simulation_process/__pycache__/sim_manager.cpython-35.pyc b/CoLo-AT/simulation_process/__pycache__/sim_manager.cpython-35.pyc
index d388f62ec168a34b8884ffdd9db950c6475c06b3..019e67c982d57ed0600d4481d0dfbe282cbd1f2e 100644
Binary files a/CoLo-AT/simulation_process/__pycache__/sim_manager.cpython-35.pyc and b/CoLo-AT/simulation_process/__pycache__/sim_manager.cpython-35.pyc differ
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 2abcfecd1515e8497a8c7f92566c428ba0bfdf5e..16eb67c30e1e3d7f4b2e61a5c101b65f43765efa 100644
Binary files a/CoLo-AT/simulation_process/__pycache__/sim_manager.cpython-36.pyc and b/CoLo-AT/simulation_process/__pycache__/sim_manager.cpython-36.pyc differ
diff --git a/CoLo-AT/simulation_process/__pycache__/state_recorder.cpython-35.pyc b/CoLo-AT/simulation_process/__pycache__/state_recorder.cpython-35.pyc
index 0fcd11cf4edee175cfe5045297dadb820276eb77..74722abe96c6d241dd00ed16acf1fa8b595bc26b 100644
Binary files a/CoLo-AT/simulation_process/__pycache__/state_recorder.cpython-35.pyc and b/CoLo-AT/simulation_process/__pycache__/state_recorder.cpython-35.pyc differ
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 18718dff2454bc9ce43b6931a97894a27132023f..85c0e77429d59df4555496f0556e72434261e905 100644
Binary files a/CoLo-AT/simulation_process/__pycache__/state_recorder.cpython-36.pyc and b/CoLo-AT/simulation_process/__pycache__/state_recorder.cpython-36.pyc differ
diff --git a/CoLo-AT/simulation_process/state_recorder.py b/CoLo-AT/simulation_process/state_recorder.py
index 01028dfc1c335bd983fe79c2cb127311487cdcc4..9a40f1473d162d7d86538578fb72de231307a2c4 100644
--- a/CoLo-AT/simulation_process/state_recorder.py
+++ b/CoLo-AT/simulation_process/state_recorder.py
@@ -10,9 +10,10 @@ import matplotlib.pyplot as plt
 
 class StatesRecorder():
 	"""docstring for ClassName"""
-	def __init__(self, name, dataset_labels):
+	def __init__(self, name, dataset_labels, state_var_only = False ):
 		self.name = name
 		self.dataset_labels = dataset_labels
+		self.state_var_only = state_var_only
 		self.recorded_data = {}
 		self.data_in_time_order = []
 		self.updata_type_in_time_order = []
@@ -41,6 +42,10 @@ class StatesRecorder():
 			self.trace_sigma_s_arr[label].append(initial_trace_state_var)
 			self.updata_type_arr[label].append('ini')
 			self.updata_type_in_time_order.append('ini')
+	
+	def get_name(self):
+		return self.name
+
 	def get_dataset_labels(self):
 		return self.dataset_labels
 			
@@ -58,9 +63,14 @@ class StatesRecorder():
 		gt_x_pos = gt['x_pos']
 		gt_y_pos = gt['y_pos']
 		robot_label = self.dataset_labels[robot_idx]
-		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] 
+		
+		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] 
+		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] 
 		
 		if(trace_state_var<0):
 			print('TIME: ', time+self.start_time)
@@ -72,7 +82,7 @@ class StatesRecorder():
 			print(updata_type)
 			print('>1 m loc err: ',recorded_dataline)
 			print(req.get_message())
-		
+
 		#print(recorded_dataline)
 		self.data_in_time_order.append(recorded_dataline)
 		self.updata_type_in_time_order.append(updata_type)