diff --git a/launch/rosbag.launch b/launch/rosbag.launch
index bea54c2..0337983 100644
--- a/launch/rosbag.launch
+++ b/launch/rosbag.launch
@@ -8,13 +8,38 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -22,12 +47,30 @@
-
-
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -40,30 +83,23 @@
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
@@ -71,10 +107,10 @@
-
-
+
+
-
+
-
+
@@ -97,142 +133,124 @@
-
+
-
+
["camera_left"]
["points_seen_left"]
- ["blinkers_seen_back"]
- ["adaptive_logging_back"]
+ ["blinkers_seen_left"]
+ ["adaptive_logging_left"]
-
+
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
+
-
-
-
+
+
+ [$(arg id1), $(arg id2), $(arg id3), $(arg id4), $(arg id5), $(arg id6), $(arg id7), $(arg id8), $(arg id9), $(arg id10), $(arg id11), $(arg id12), $(arg id13), $(arg id14), $(arg id15), $(arg id16), $(arg id17), $(arg id18), $(arg id19), $(arg id20), $(arg id21)]
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
["camera_left"]
["points_seen_left"]
- ["blinkers_seen_back"]
- ["estimated_framerate_back"]
- ["ami_logging_back"]
- ["ami_all_seq_info_back"]
+ ["blinkers_seen_left"]
+ ["estimated_framerate_left"]
-
-
+ ["ami_logging_left"]
+ ["ami_all_seq_info_left"]
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- [$(arg id1), $(arg id2), $(arg id3), $(arg id4), $(arg id5), $(arg id6), $(arg id7), $(arg id8), $(arg id9), $(arg id10), $(arg id11), $(arg id12)]
-
-
-
+
+
+
+
-
-
-
-
+
+
+
- ["blinkers_seen_back"]
- ["estimated_framerate_back"]
- ["$(arg uav_name)/uvcam_back"]
+
+
-
-
+
- ["default", "default", "default"]
+
+
-
-
-
+
-
-
-
-
+
-
-
diff --git a/scripts/.tmuxinator.yml b/scripts/.tmuxinator.yml
index 3ce198b..1685c88 100644
--- a/scripts/.tmuxinator.yml
+++ b/scripts/.tmuxinator.yml
@@ -1,7 +1,7 @@
name: simulation
root: ./
startup_window: launch
-pre_window: UAV_NAME=uav7
+pre_window: UAV_NAME=uav36
windows:
- core:
layout: even-vertical
@@ -10,16 +10,17 @@ windows:
- launch:
layout: even-vertical
panes:
- - waitForRos; roslaunch uvdar_core rosbag.launch uav_name:=uav7 use_4DHT:=false debug:=false
+ - waitForRos; roslaunch uvdar_core rosbag.launch uav_name:=uav36 use_4DHT:=false debug:=false
# - kf:
# layout: even-vertical
# panes:
# - waitForRos; roslaunch uvdar_core uvdar_kf.launch UAV_NAME:=uav39
#publish_visualization:=false max_zeros_consecutive:=3 max_ones_consecutive:=3 allowed_BER_per_seq:=1 gui:=true
- - rqtviz:
+ - record:
layout: even-vertical
panes:
- # - waitForRos; sleep 3; rosbag record -O ~/Desktop/MRS_Master_Project/rosbags/good_sequence/diff_power_18m_th150_topics.bag /uav7/uvdar_bluefox/left/image_raw /uav7/uvdar/points_seen_left /uav7/uvdar/blinkers_seen_back /uav7/uvdar/ami_all_seq_info_back
+ # - waitForOffBoard; rosbag record -O ~/Desktop/MRS_Master_Project/rosbags/good_sequence/diff_power_18m_th150_topics.bag /uav7/uvdar_bluefox/left/image_raw /uav7/uvdar/points_seen_left /uav7/uvdar/blinkers_seen_back /uav7/uvdar/ami_all_seq_info_back
+ - waitForRos; waitForOffBoard; ./record.sh
#- rosbag record -O rosbags/first/omta_38.bag -e "(.*)_camp"
# - rosbag record -O rosbags/first/omta_39.bag -e "(.*)_camp"
# - rosbag record -O rosbags/first/4dht_38.bag -e "(.*)_camp"
@@ -27,8 +28,6 @@ windows:
# - rosbag record -O rosbags/second/omta_1.bag -e "(.*)_camp"
# - rosbag record -O rosbags/second/omta_2.bag -e "(.*)_camp"
# - rosbag record -O rosbags/third/omta.bag -e "(.*)_camp"
- - waitForCompile; roscore;
- - waitForRos; sleep 3; rqt_image_view
- play:
layout: even-vertical
panes:
@@ -36,14 +35,13 @@ windows:
# - waitForRos; sleep 3; rosbag play --clock ~/experiments/20_04/two_tx/two_tx/rx/occlusion_1/rx.bag
# - waitForRos; sleep 3; rosbag play --clock ~/experiments/20_04/two_tx/two_tx/rx/occlusion_2/rx.bag
# - waitForRos; rosbag play --clock ~/experiments/20_04/tumult/tumult/rx/rx.bag
- - waitForRos; sleep 3; rosbag play --clock ~/Desktop/MRS_Master_Project/experiments/diff_power_5m_0615.bag
-
- # - waitForRos; sleep 3; rosbag play --clock ~/experiments/19_04/demo_first/rx1/all_three/rx1.bag
-
- - topics:
+ - waitForRos; sleep 3; rosbag play --clock ~/bag_files/datasets_08_2024/uav36_rosbags_rx/marlon/71_2024_08_20_14_35_41variant3/_2024-08-20-14-37-28.bag
+ - rqt:
layout: even-vertical
panes:
- - waitForRos; sleep 3; rostopic echo /uav7/uvdar/ami_all_seq_info_back
+
+ # - waitForRos; sleep 3; rqt_image_view
+ - waitForRos; sleep 3; rostopic echo /uav36/uvdar/blinkers_seen_left
# - waitForCompile; cd ~/uvdar_rosbag/tracking/uav7/22_2021_04_27_09_11_19_L12/ ; rosbag play --clock -s 30 _2021-04-27-09-11-56.bag
# - trajectory:
diff --git a/scripts/Processing_evaluation_distance.ipynb b/scripts/Processing_evaluation_distance.ipynb
index 3d5de6c..38dba1a 100644
--- a/scripts/Processing_evaluation_distance.ipynb
+++ b/scripts/Processing_evaluation_distance.ipynb
@@ -4,7 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Processing the raw csv"
+ "## 1. Processing the raw csv"
]
},
{
@@ -295,12 +295,12 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Processing raw csv v2"
+ "# Processing processed csv v2"
]
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": 7,
"metadata": {},
"outputs": [
{
@@ -325,166 +325,200 @@
"
\n",
" | \n",
" timestamp | \n",
- " uav38_distance_x | \n",
- " uav38_distance_y | \n",
- " uav38_distance_z | \n",
+ " uav36_distance_x | \n",
+ " uav36_distance_y | \n",
+ " uav36_distance_z | \n",
" uav39_distance_x | \n",
" uav39_distance_y | \n",
" uav39_distance_z | \n",
+ " uav40_distance_x | \n",
+ " uav40_distance_y | \n",
+ " uav40_distance_z | \n",
" value | \n",
" point_x | \n",
" point_y | \n",
- " relative_distance_y | \n",
+ " uav39_relative_distance_y | \n",
+ " uav40_relative_distance_y | \n",
" num_points | \n",
" error_count | \n",
- " signal_3 | \n",
" signal_2 | \n",
" signal_1 | \n",
- " signal_0 | \n",
- " nearest_distance | \n",
"
\n",
" \n",
" \n",
" \n",
- " 781 | \n",
- " 1.713638e+09 | \n",
- " -63.810145 | \n",
- " -2.106754 | \n",
- " 0.001549 | \n",
- " -67.615333 | \n",
- " -1.917332 | \n",
- " 0.226842 | \n",
- " [-2.0] | \n",
- " [509.0] | \n",
- " [268.0] | \n",
- " 11.917332 | \n",
- " 1 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
+ " 1376 | \n",
+ " 1.724156e+09 | \n",
+ " -77.141969 | \n",
+ " -0.520357 | \n",
+ " 0.366521 | \n",
+ " -68.875040 | \n",
+ " 0.460243 | \n",
+ " 0.338301 | \n",
+ " -64.877955 | \n",
+ " -5.683457 | \n",
+ " 0.501308 | \n",
+ " [-2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.... | \n",
+ " [348.0, 597.0, 425.0, 601.0, 585.0, 590.0, 365... | \n",
+ " [105.0, 161.0, 162.0, 191.0, 195.0, 197.0, 230... | \n",
+ " 0.980600 | \n",
+ " 5.163101 | \n",
+ " 9 | \n",
+ " 9 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 1377 | \n",
+ " 1.724156e+09 | \n",
+ " -77.141969 | \n",
+ " -0.520357 | \n",
+ " 0.366521 | \n",
+ " -68.875040 | \n",
+ " 0.460243 | \n",
+ " 0.338301 | \n",
+ " -64.877955 | \n",
+ " -5.683457 | \n",
+ " 0.501308 | \n",
+ " [-2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.... | \n",
+ " [348.0, 598.0, 425.0, 601.0, 586.0, 591.0, 365... | \n",
+ " [105.0, 162.0, 162.0, 191.0, 196.0, 196.0, 230... | \n",
+ " 0.980600 | \n",
+ " 5.163101 | \n",
" 10 | \n",
- "
\n",
- " \n",
- " 786 | \n",
- " 1.713638e+09 | \n",
- " -63.810564 | \n",
- " -2.106765 | \n",
- " 0.001536 | \n",
- " -67.615170 | \n",
- " -1.916776 | \n",
- " 0.226822 | \n",
- " [-2.0] | \n",
- " [509.0] | \n",
- " [268.0] | \n",
- " 11.916776 | \n",
- " 1 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
" 10 | \n",
- "
\n",
- " \n",
- " 791 | \n",
- " 1.713638e+09 | \n",
- " -63.811156 | \n",
- " -2.106827 | \n",
- " 0.001780 | \n",
- " -67.614996 | \n",
- " -1.916427 | \n",
- " 0.226781 | \n",
- " [-2.0] | \n",
- " [509.0] | \n",
- " [266.0] | \n",
- " 11.916427 | \n",
- " 1 | \n",
- " 1 | \n",
" 0 | \n",
" 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 10 | \n",
"
\n",
" \n",
- " 794 | \n",
- " 1.713638e+09 | \n",
- " -63.811449 | \n",
- " -2.106932 | \n",
- " 0.002102 | \n",
- " -67.614923 | \n",
- " -1.916191 | \n",
- " 0.235643 | \n",
- " [-2.0] | \n",
- " [509.0] | \n",
- " [265.0] | \n",
- " 11.916191 | \n",
- " 1 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
+ " 1378 | \n",
+ " 1.724156e+09 | \n",
+ " -77.141969 | \n",
+ " -0.520357 | \n",
+ " 0.366521 | \n",
+ " -68.875040 | \n",
+ " 0.460243 | \n",
+ " 0.338301 | \n",
+ " -64.877955 | \n",
+ " -5.683457 | \n",
+ " 0.501308 | \n",
+ " [-2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.... | \n",
+ " [348.0, 599.0, 426.0, 586.0, 592.0, 365.0, 226... | \n",
+ " [105.0, 162.0, 162.0, 195.0, 196.0, 230.0, 255... | \n",
+ " 0.980600 | \n",
+ " 5.163101 | \n",
+ " 9 | \n",
+ " 9 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 1383 | \n",
+ " 1.724156e+09 | \n",
+ " -77.141969 | \n",
+ " -0.520357 | \n",
+ " 0.366521 | \n",
+ " -68.877275 | \n",
+ " 0.462433 | \n",
+ " 0.332170 | \n",
+ " -64.878810 | \n",
+ " -5.682561 | \n",
+ " 0.506219 | \n",
+ " [-2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.... | \n",
+ " [348.0, 599.0, 426.0, 586.0, 592.0, 366.0, 227... | \n",
+ " [105.0, 162.0, 161.0, 195.0, 196.0, 230.0, 255... | \n",
+ " 0.982790 | \n",
+ " 5.162204 | \n",
+ " 10 | \n",
+ " 10 | \n",
" 0 | \n",
" 0 | \n",
- " 10 | \n",
"
\n",
" \n",
- " 799 | \n",
- " 1.713638e+09 | \n",
- " -63.820574 | \n",
- " -2.106548 | \n",
- " 0.003619 | \n",
- " -67.614726 | \n",
- " -1.915763 | \n",
- " 0.231350 | \n",
- " [-2.0] | \n",
- " [509.0] | \n",
- " [265.0] | \n",
- " 11.915763 | \n",
- " 1 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
+ " 1393 | \n",
+ " 1.724156e+09 | \n",
+ " -77.143600 | \n",
+ " -0.516343 | \n",
+ " 0.382294 | \n",
+ " -68.879600 | \n",
+ " 0.464704 | \n",
+ " 0.337649 | \n",
+ " -64.879362 | \n",
+ " -5.681900 | \n",
+ " 0.509828 | \n",
+ " [-2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.... | \n",
+ " [348.0, 600.0, 427.0, 587.0, 592.0, 366.0, 227... | \n",
+ " [105.0, 162.0, 162.0, 195.0, 196.0, 229.0, 255... | \n",
+ " 0.981047 | \n",
+ " 5.165557 | \n",
+ " 12 | \n",
+ " 12 | \n",
" 0 | \n",
" 0 | \n",
- " 10 | \n",
"
\n",
" \n",
"\n",
""
],
"text/plain": [
- " timestamp uav38_distance_x uav38_distance_y uav38_distance_z \\\n",
- "781 1.713638e+09 -63.810145 -2.106754 0.001549 \n",
- "786 1.713638e+09 -63.810564 -2.106765 0.001536 \n",
- "791 1.713638e+09 -63.811156 -2.106827 0.001780 \n",
- "794 1.713638e+09 -63.811449 -2.106932 0.002102 \n",
- "799 1.713638e+09 -63.820574 -2.106548 0.003619 \n",
+ " timestamp uav36_distance_x uav36_distance_y uav36_distance_z \\\n",
+ "1376 1.724156e+09 -77.141969 -0.520357 0.366521 \n",
+ "1377 1.724156e+09 -77.141969 -0.520357 0.366521 \n",
+ "1378 1.724156e+09 -77.141969 -0.520357 0.366521 \n",
+ "1383 1.724156e+09 -77.141969 -0.520357 0.366521 \n",
+ "1393 1.724156e+09 -77.143600 -0.516343 0.382294 \n",
+ "\n",
+ " uav39_distance_x uav39_distance_y uav39_distance_z uav40_distance_x \\\n",
+ "1376 -68.875040 0.460243 0.338301 -64.877955 \n",
+ "1377 -68.875040 0.460243 0.338301 -64.877955 \n",
+ "1378 -68.875040 0.460243 0.338301 -64.877955 \n",
+ "1383 -68.877275 0.462433 0.332170 -64.878810 \n",
+ "1393 -68.879600 0.464704 0.337649 -64.879362 \n",
+ "\n",
+ " uav40_distance_y uav40_distance_z \\\n",
+ "1376 -5.683457 0.501308 \n",
+ "1377 -5.683457 0.501308 \n",
+ "1378 -5.683457 0.501308 \n",
+ "1383 -5.682561 0.506219 \n",
+ "1393 -5.681900 0.509828 \n",
+ "\n",
+ " value \\\n",
+ "1376 [-2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.... \n",
+ "1377 [-2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.... \n",
+ "1378 [-2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.... \n",
+ "1383 [-2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.... \n",
+ "1393 [-2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.... \n",
"\n",
- " uav39_distance_x uav39_distance_y uav39_distance_z value point_x \\\n",
- "781 -67.615333 -1.917332 0.226842 [-2.0] [509.0] \n",
- "786 -67.615170 -1.916776 0.226822 [-2.0] [509.0] \n",
- "791 -67.614996 -1.916427 0.226781 [-2.0] [509.0] \n",
- "794 -67.614923 -1.916191 0.235643 [-2.0] [509.0] \n",
- "799 -67.614726 -1.915763 0.231350 [-2.0] [509.0] \n",
+ " point_x \\\n",
+ "1376 [348.0, 597.0, 425.0, 601.0, 585.0, 590.0, 365... \n",
+ "1377 [348.0, 598.0, 425.0, 601.0, 586.0, 591.0, 365... \n",
+ "1378 [348.0, 599.0, 426.0, 586.0, 592.0, 365.0, 226... \n",
+ "1383 [348.0, 599.0, 426.0, 586.0, 592.0, 366.0, 227... \n",
+ "1393 [348.0, 600.0, 427.0, 587.0, 592.0, 366.0, 227... \n",
"\n",
- " point_y relative_distance_y num_points error_count signal_3 \\\n",
- "781 [268.0] 11.917332 1 1 0 \n",
- "786 [268.0] 11.916776 1 1 0 \n",
- "791 [266.0] 11.916427 1 1 0 \n",
- "794 [265.0] 11.916191 1 1 0 \n",
- "799 [265.0] 11.915763 1 1 0 \n",
+ " point_y \\\n",
+ "1376 [105.0, 161.0, 162.0, 191.0, 195.0, 197.0, 230... \n",
+ "1377 [105.0, 162.0, 162.0, 191.0, 196.0, 196.0, 230... \n",
+ "1378 [105.0, 162.0, 162.0, 195.0, 196.0, 230.0, 255... \n",
+ "1383 [105.0, 162.0, 161.0, 195.0, 196.0, 230.0, 255... \n",
+ "1393 [105.0, 162.0, 162.0, 195.0, 196.0, 229.0, 255... \n",
"\n",
- " signal_2 signal_1 signal_0 nearest_distance \n",
- "781 0 0 0 10 \n",
- "786 0 0 0 10 \n",
- "791 0 0 0 10 \n",
- "794 0 0 0 10 \n",
- "799 0 0 0 10 "
+ " uav39_relative_distance_y uav40_relative_distance_y num_points \\\n",
+ "1376 0.980600 5.163101 9 \n",
+ "1377 0.980600 5.163101 10 \n",
+ "1378 0.980600 5.163101 9 \n",
+ "1383 0.982790 5.162204 10 \n",
+ "1393 0.981047 5.165557 12 \n",
+ "\n",
+ " error_count signal_2 signal_1 \n",
+ "1376 9 0 0 \n",
+ "1377 10 0 0 \n",
+ "1378 9 0 0 \n",
+ "1383 10 0 0 \n",
+ "1393 12 0 0 "
]
},
- "execution_count": 3,
+ "execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
@@ -496,11 +530,12 @@
"import ast\n",
"\n",
"# Experiment name\n",
- "name_experiment = 'kl_exp1'\n",
+ "name_experiment = 'variant1_th40'\n",
+ "subset_rx = 'rx1_s1'\n",
"\n",
"# Paths\n",
- "input_csv_path = os.path.expanduser('~/Desktop/MRS_Master_Project/rosbags/rw/raw_csv_v2/' + name_experiment + '.csv')\n",
- "cleaned_file_path = os.path.expanduser('~/Desktop/MRS_Master_Project/rosbags/rw/processed_csv_2/' + name_experiment + '_processed.csv')\n",
+ "input_csv_path = os.path.expanduser('~/Desktop/MRS_Master_Project/paper/raw_csv/' + name_experiment + '.csv')\n",
+ "cleaned_file_path = os.path.expanduser('~/Desktop/MRS_Master_Project/paper/processed_csv/' + name_experiment + '_'+ subset_rx +'_processed.csv')\n",
"\n",
"# Read data\n",
"data = pd.read_csv(input_csv_path)\n",
@@ -519,6 +554,8 @@
"# Define center area of the image\n",
"image_height, image_width = 480, 752\n",
"center_x_min, center_x_max = 0.2 * image_width, 0.8 * image_width\n",
+ "#center_x_min, center_x_max = 190, 310\n",
+ "#center_x_min, center_x_max = 390, 510\n",
"center_y_min, center_y_max = 0.2 * image_height, 0.8 * image_height\n",
"\n",
"# Function to filter points in the center of the image\n",
@@ -543,8 +580,9 @@
"\n",
"\n",
"# Fill missing values for UAV distances\n",
- "uav_fields = ['uav38_distance_x', 'uav38_distance_y', 'uav38_distance_z', \n",
- " 'uav39_distance_x', 'uav39_distance_y', 'uav39_distance_z']\n",
+ "uav_fields = ['uav36_distance_x', 'uav36_distance_y', 'uav36_distance_z', \n",
+ " 'uav39_distance_x', 'uav39_distance_y', 'uav39_distance_z',\n",
+ " 'uav40_distance_x', 'uav40_distance_y', 'uav40_distance_z']\n",
"\n",
"for field in uav_fields:\n",
" data[field] = data[field].fillna(method='ffill')\n",
@@ -554,8 +592,9 @@
"data = data[data['value'].str.len() > 0]\n",
"\n",
"# Calculate relative distance_y\n",
- "#data['relative_distance_y'] = np.abs(data['uav38_distance_y'] - data['uav39_distance_y'])\n",
- "data['relative_distance_y'] = np.abs(data['uav39_distance_y'] - 10)\n",
+ "data['uav39_relative_distance_y'] = np.abs(data['uav39_distance_y'] - data['uav36_distance_y'])\n",
+ "data['uav40_relative_distance_y'] = np.abs(data['uav40_distance_y'] - data['uav36_distance_y'])\n",
+ "#data['relative_distance_y'] = np.abs(data['uav39_distance_y'] - 10)\n",
"\n",
"# Calculate number of points\n",
"data['num_points'] = data['value'].apply(len)\n",
@@ -564,7 +603,7 @@
"def calculate_error_rate(values):\n",
" error_count = 0\n",
" for value in values:\n",
- " if value not in [0.0, 1.0, 2.0, 3.0]:\n",
+ " if value not in [1.0, 2.0]:\n",
" error_count += 1\n",
" return error_count\n",
"\n",
@@ -584,14 +623,15 @@
" return 1 if 0.0 in values else 0\n",
"\n",
"# Apply signal checks\n",
- "data['signal_3'] = data['value'].apply(check_signal_3)\n",
+ "#data['signal_3'] = data['value'].apply(check_signal_3)\n",
"data['signal_2'] = data['value'].apply(check_signal_2)\n",
"data['signal_1'] = data['value'].apply(check_signal_1)\n",
- "data['signal_0'] = data['value'].apply(check_signal_0)\n",
+ "#data['signal_0'] = data['value'].apply(check_signal_0)\n",
"\n",
"# Assign nearest distance\n",
- "specified_distances = np.array([5, 10, 15, 20, 25, 30])\n",
- "data['nearest_distance'] = specified_distances[np.abs(specified_distances[:, np.newaxis] - data['relative_distance_y'].values).argmin(axis=0)]\n",
+ "specified_distances = np.array([5, 10])\n",
+ "#-data['nearest_distance'] = specified_distances[np.abs(specified_distances[:, np.newaxis] - data['relative_distance_y'].values).argmin(axis=0)]\n",
+ "#data['nearest_distance'] = specified_distances[np.abs(specified_distances[:, np.newaxis] - data['uav39_relative_distance_y'].values).argmin(axis=0)]\n",
"\n",
"# Save processed data\n",
"data.to_csv(cleaned_file_path, index=False)\n",
@@ -605,7 +645,7 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
@@ -615,44 +655,136 @@
"import ast"
]
},
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Processing of multiple UAVs\n"
- ]
- },
{
"cell_type": "code",
- "execution_count": 64,
+ "execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "1000\n",
- "3062\n",
- "2098\n",
- "2099\n",
- "2091\n",
- "3435\n"
+ "Optimal Threshold based on Combined Error Rate: 40\n",
+ "Optimal Threshold based on Max Error Rate: 40\n"
]
}
],
"source": [
- "cleaned_file_path = os.path.expanduser('~/Desktop/MRS_Master_Project/rosbags/rw/processed_csv_2/kl_exp1_processed.csv')\n",
- "specified_distances = np.array([5, 10, 15, 20, 25, 30])\n",
+ "import os\n",
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
"\n",
+ "# Define the file paths and thresholds\n",
+ "file_paths = [\n",
+ " '/home/rivermar/Desktop/MRS_Master_Project/paper/processed_csv_automation_dynamic/motiv_dynamic_th40_processed.csv',\n",
+ " '/home/rivermar/Desktop/MRS_Master_Project/paper/processed_csv_automation_dynamic/motiv_dynamic_th60_processed.csv',\n",
+ " '/home/rivermar/Desktop/MRS_Master_Project/paper/processed_csv_automation_dynamic/motiv_dynamic_th80_processed.csv',\n",
+ " '/home/rivermar/Desktop/MRS_Master_Project/paper/processed_csv_automation_dynamic/motiv_dynamic_th100_processed.csv',\n",
+ " '/home/rivermar/Desktop/MRS_Master_Project/paper/processed_csv_automation_dynamic/motiv_dynamic_th120_processed.csv',\n",
+ " '/home/rivermar/Desktop/MRS_Master_Project/paper/processed_csv_automation_dynamic/motiv_dynamic_th160_processed.csv',\n",
+ " '/home/rivermar/Desktop/MRS_Master_Project/paper/processed_csv_automation_dynamic/motiv_dynamic_th200_processed.csv'\n",
+ "]\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "thresholds = [40, 60, 80, 100, 120, 160, 200]\n",
+ "\n",
+ "# Initialize a dataframe to hold the summarized data\n",
+ "summary_data = {\n",
+ " 'Threshold': [],\n",
+ " 'Total Errors Signal 1': [],\n",
+ " 'Total Errors Signal 2': [],\n",
+ " 'Total Instances Signal 1': [],\n",
+ " 'Total Instances Signal 2': [],\n",
+ " 'Error Rate Signal 1': [],\n",
+ " 'Error Rate Signal 2': [],\n",
+ " 'Percentage Fully Present Signal 1': [],\n",
+ " 'Percentage Fully Present Signal 2': [],\n",
+ " 'Combined Error Rate': [],\n",
+ " 'Max Error Rate': [],\n",
+ " 'Error Rate Difference (S2 - S1)': [],\n",
+ " 'Relative Error Rate Difference (%)': []\n",
+ "}\n",
+ "\n",
+ "# Loop through the files and calculate the required metrics\n",
+ "for path, threshold in zip(file_paths, thresholds):\n",
+ " # Load the data\n",
+ " df = pd.read_csv(path)\n",
+ " \n",
+ " # Calculate total errors for each signal\n",
+ " total_errors_signal_1 = df['num_errors_signal_1'].sum()\n",
+ " total_errors_signal_2 = df['num_errors_signal_2'].sum()\n",
+ "\n",
+ " # Calculate total instances signal present\n",
+ " total_signal_1 = df['num_points_signal_1'].sum()\n",
+ " total_signal_2 = df['num_points_signal_2'].sum()\n",
+ "\n",
+ " # Calculate error rates\n",
+ " error_rate_signal_1 = total_errors_signal_1 / total_signal_1 if total_signal_1 != 0 else 0\n",
+ " error_rate_signal_2 = total_errors_signal_2 / total_signal_2 if total_signal_2 != 0 else 0\n",
+ "\n",
+ " # Calculate percentage fully present based on number of errors\n",
+ " total_entries = len(df)\n",
+ " fully_present_signal_1 = (df['num_errors_signal_1'] == 0).sum() / total_entries * 100\n",
+ " fully_present_signal_2 = (df['num_errors_signal_2'] == 0).sum() / total_entries * 100\n",
+ "\n",
+ " # Append the data to the summary\n",
+ " summary_data['Threshold'].append(threshold)\n",
+ " summary_data['Total Errors Signal 1'].append(total_errors_signal_1)\n",
+ " summary_data['Total Errors Signal 2'].append(total_errors_signal_2)\n",
+ " summary_data['Total Instances Signal 1'].append(total_signal_1)\n",
+ " summary_data['Total Instances Signal 2'].append(total_signal_2)\n",
+ " summary_data['Error Rate Signal 1'].append(error_rate_signal_1)\n",
+ " summary_data['Error Rate Signal 2'].append(error_rate_signal_2)\n",
+ " summary_data['Percentage Fully Present Signal 1'].append(fully_present_signal_1)\n",
+ " summary_data['Percentage Fully Present Signal 2'].append(fully_present_signal_2)\n",
+ "\n",
+ "# After looping, calculate performance differences and optimization metrics\n",
+ "for i in range(len(summary_data['Threshold'])):\n",
+ " error_rate_diff = summary_data['Error Rate Signal 2'][i] - summary_data['Error Rate Signal 1'][i]\n",
+ " relative_error_diff = (error_rate_diff / summary_data['Error Rate Signal 1'][i]) * 100 if summary_data['Error Rate Signal 1'][i] != 0 else 0\n",
+ " combined_error_rate = summary_data['Error Rate Signal 1'][i] + summary_data['Error Rate Signal 2'][i]\n",
+ " max_error_rate = max(summary_data['Error Rate Signal 1'][i], summary_data['Error Rate Signal 2'][i])\n",
+ " \n",
+ " summary_data['Error Rate Difference (S2 - S1)'].append(error_rate_diff)\n",
+ " summary_data['Relative Error Rate Difference (%)'].append(relative_error_diff)\n",
+ " summary_data['Combined Error Rate'].append(combined_error_rate)\n",
+ " summary_data['Max Error Rate'].append(max_error_rate)\n",
"\n",
+ "# Convert summary data to DataFrame\n",
+ "df_summary = pd.DataFrame(summary_data)\n",
"\n",
- "data = pd.read_csv(cleaned_file_path)\n",
+ "# Find the optimal threshold based on combined error rate and max error rate\n",
+ "optimal_combined_threshold = df_summary.loc[df_summary['Combined Error Rate'].idxmin(), 'Threshold']\n",
+ "optimal_max_threshold = df_summary.loc[df_summary['Max Error Rate'].idxmin(), 'Threshold']\n",
"\n",
- "#Take after the 6712th row\n",
- "#data = data.iloc[376:13954]\n",
+ "# Save the summary to a CSV file\n",
+ "df_summary.to_csv('threshold_analysis_summary_dynamic.csv', index=False)\n",
"\n",
+ "# Output the optimal thresholds\n",
+ "print(f'Optimal Threshold based on Combined Error Rate: {optimal_combined_threshold}')\n",
+ "print(f'Optimal Threshold based on Max Error Rate: {optimal_max_threshold}')\n",
"\n",
- "indices_5 = data[data['nearest_distance'] == 5].index\n",
+ "# Optionally, you can include the plotting code here for visualization if desired"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Processing of multiple UAVs\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "\"\"\" indices_5 = data[data['nearest_distance'] == 5].index\n",
"\n",
"indices_10 = data[data['nearest_distance'] == 10].index\n",
"\n",
@@ -671,9 +803,40 @@
"print(len(indices_20))\n",
"print(len(indices_25))\n",
"print(len(indices_30))\n",
+ " \"\"\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "11666\n"
+ ]
+ }
+ ],
+ "source": [
+ "variant1_th40_rx1 = os.path.expanduser('~/Desktop/MRS_Master_Project/paper/processed_csv_automation/variant1_th40_rx1_s1_processed.csv')\n",
+ "data_variant01_th40_rx1 = pd.read_csv(variant1_th40_rx1)\n",
+ "data_variant01_th40_rx1 = data.iloc[4997:20240]\n",
+ "\n",
+ "variant1_th40_rx2 = os.path.expanduser('~/Desktop/MRS_Master_Project/paper/processed_csv_automation/variant1_th40_rx2_s2_processed.csv')\n",
+ "data_variant01_th40_rx2 = pd.read_csv(variant1_th40_rx2)\n",
+ "data_variant01_th40_rx2 = data.iloc[4997:16663]\n",
+ "\n",
+ "variant1_th60_rx1 = os.path.expanduser('~/Desktop/MRS_Master_Project/paper/processed_csv_automation/variant1_th60_rx1_s1_processed.csv')\n",
+ "data_variant01_th60_rx1 = pd.read_csv(variant1_th60_rx1)\n",
+ "data_variant01_th60_rx1 = data.iloc[4997:20240]\n",
"\n",
+ "variant1_th60_rx2 = os.path.expanduser('~/Desktop/MRS_Master_Project/paper/processed_csv_automation/variant1_th60_rx2_s2_processed.csv')\n",
+ "data_variant01_th60_rx2 = pd.read_csv(variant1_th60_rx2)\n",
+ "data_variant01_th60_rx2 = data.iloc[4997:16663]\n",
"\n",
- "data_kl_exp1 = data"
+ "print(len(data_variant01_th60_rx2))\n"
]
},
{
diff --git a/scripts/bag_file_mapping.csv b/scripts/bag_file_mapping.csv
new file mode 100644
index 0000000..3711da3
--- /dev/null
+++ b/scripts/bag_file_mapping.csv
@@ -0,0 +1,7 @@
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant03/variant03_v2_th40.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/78_2024_08_20_14_35_48variant3/_2024-08-20-14-37-28.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/39_2024_08_20_14_35_56variant3/_2024-08-20-14-37-28.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant03/variant03_v2_th60.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/78_2024_08_20_14_35_48variant3/_2024-08-20-14-37-28.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/39_2024_08_20_14_35_56variant3/_2024-08-20-14-37-28.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant03/variant03_v2_th80.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/78_2024_08_20_14_35_48variant3/_2024-08-20-14-37-28.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/39_2024_08_20_14_35_56variant3/_2024-08-20-14-37-28.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant03/variant03_v2_th100.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/78_2024_08_20_14_35_48variant3/_2024-08-20-14-37-28.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/39_2024_08_20_14_35_56variant3/_2024-08-20-14-37-28.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant03/variant03_v2_th120.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/78_2024_08_20_14_35_48variant3/_2024-08-20-14-37-28.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/39_2024_08_20_14_35_56variant3/_2024-08-20-14-37-28.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant03/variant03_v2_th160.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/78_2024_08_20_14_35_48variant3/_2024-08-20-14-37-28.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/39_2024_08_20_14_35_56variant3/_2024-08-20-14-37-28.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant03/variant03_v2_th200.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/78_2024_08_20_14_35_48variant3/_2024-08-20-14-37-28.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/39_2024_08_20_14_35_56variant3/_2024-08-20-14-37-28.bag
diff --git a/scripts/batch_csv_processing.sh b/scripts/batch_csv_processing.sh
new file mode 100755
index 0000000..d115728
--- /dev/null
+++ b/scripts/batch_csv_processing.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+# Directories
+raw_csv_dir=~/Desktop/MRS_Master_Project/paper/new_raw_csv
+processed_csv_dir=~/Desktop/MRS_Master_Project/paper/processed_csv_automation
+
+# Make sure the processed_csv directory exists
+mkdir -p "$processed_csv_dir"
+
+# Loop over all CSV files in the raw_csv directory
+for filepath in "$raw_csv_dir"/*.csv; do
+ # Get the filename without extension
+ filename=$(basename -- "$filepath")
+ extension="${filename##*.}"
+ name_experiment="${filename%.*}"
+
+ echo "Processing $name_experiment"
+
+ # First subset: rx1_s1
+ subset_rx='rx1_s1'
+ center_x_min=190
+ center_x_max=310
+
+ # Run the Python script
+ python processing_raw_csv.py --name_experiment "$name_experiment" --subset_rx "$subset_rx" --center_x_min "$center_x_min" --center_x_max "$center_x_max"
+
+ # Second subset: rx2_s2
+ subset_rx='rx2_s2'
+ center_x_min=390
+ center_x_max=510
+
+ # Run the Python script
+ python processing_raw_csv.py --name_experiment "$name_experiment" --subset_rx "$subset_rx" --center_x_min "$center_x_min" --center_x_max "$center_x_max"
+
+done
diff --git a/scripts/csv b/scripts/csv
new file mode 100644
index 0000000..e69de29
diff --git a/scripts/extract_all.sh b/scripts/extract_all.sh
new file mode 100755
index 0000000..b9041d6
--- /dev/null
+++ b/scripts/extract_all.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+# Mapping file path
+mapping_file="file_mapping_dynamic.csv"
+
+# Output directory for CSV files
+output_csv_dir=~/Desktop/MRS_Master_Project/paper/dynamic_raw_csv
+
+# Make sure the output directory exists
+mkdir -p "$output_csv_dir"
+
+# Read the mapping file line by line
+while IFS=, read -r rx_bag tx1_bag tx2_bag; do
+ # Skip header line if present
+ if [[ $rx_bag == "rx_bag_path" ]]; then
+ continue
+ fi
+
+ if [ -z "$rx_bag" ] || [ -z "$tx1_bag" ] || [ -z "$tx2_bag" ]; then
+ echo "Incomplete mapping: $rx_bag, $tx1_bag, $tx2_bag"
+ continue
+ fi
+
+ # Get the name_experiment from rx_bag filename
+ rx_bag_filename=$(basename "$rx_bag")
+ name_experiment="${rx_bag_filename%.*}" # Remove .bag extension
+ echo "Processing experiment: $name_experiment"
+
+ # Output CSV file path
+ output_csv="$output_csv_dir/${name_experiment}.csv"
+
+ # Run the Python script
+ python new_extract_data.py --name_experiment "$name_experiment" --rx_bag "$rx_bag" --tx1_bag "$tx1_bag" --tx2_bag "$tx2_bag" --output_csv "$output_csv"
+
+done < "$mapping_file"
diff --git a/scripts/extract_data.py b/scripts/extract_data.py
new file mode 100755
index 0000000..c6f9924
--- /dev/null
+++ b/scripts/extract_data.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+import rosbag
+import csv
+import os
+import argparse
+
+# Parse command-line arguments
+parser = argparse.ArgumentParser(description='Extract data from ROS bags and save to CSV.')
+parser.add_argument('--name_experiment', type=str, required=True, help='Name of the experiment')
+parser.add_argument('--rx_bag', type=str, required=True, help='Path to RX bag file')
+parser.add_argument('--tx1_bag', type=str, required=True, help='Path to TX1 bag file')
+parser.add_argument('--tx2_bag', type=str, required=True, help='Path to TX2 bag file')
+parser.add_argument('--output_csv', type=str, required=True, help='Path to output CSV file')
+
+args = parser.parse_args()
+
+name_experiment = args.name_experiment
+output_csv = args.output_csv
+
+bag_files = [
+ args.rx_bag,
+ args.tx1_bag,
+ args.tx2_bag,
+]
+
+topics = [
+ '/uav36/uvdar/blinkers_seen_left',
+ '/uav36/estimation_manager/odom_main',
+ '/uav39/estimation_manager/odom_main',
+ '/uav40/estimation_manager/odom_main'
+]
+
+combined_data = []
+
+for bag_path in bag_files:
+ with rosbag.Bag(bag_path, 'r') as bag:
+ data = []
+ for topic, msg, t in bag.read_messages(topics=topics):
+ entry = {
+ 'timestamp': t.to_sec(),
+ 'uav36_distance_x': None,
+ 'uav36_distance_y': None,
+ 'uav36_distance_z': None,
+ 'uav39_distance_x': None,
+ 'uav39_distance_y': None,
+ 'uav39_distance_z': None,
+ 'uav40_distance_x': None,
+ 'uav40_distance_y': None,
+ 'uav40_distance_z': None,
+ 'value': None,
+ 'point_x': None,
+ 'point_y': None
+ }
+ if topic == '/uav36/uvdar/blinkers_seen_left':
+ entry['value'] = [point.value for point in msg.points]
+ entry['point_x'] = [point.x for point in msg.points]
+ entry['point_y'] = [point.y for point in msg.points]
+ elif topic == '/uav36/estimation_manager/odom_main':
+ entry['uav36_distance_x'] = msg.pose.pose.position.x
+ entry['uav36_distance_y'] = msg.pose.pose.position.y
+ entry['uav36_distance_z'] = msg.pose.pose.position.z
+ elif topic == '/uav39/estimation_manager/odom_main':
+ entry['uav39_distance_x'] = msg.pose.pose.position.x
+ entry['uav39_distance_y'] = msg.pose.pose.position.y
+ entry['uav39_distance_z'] = msg.pose.pose.position.z
+ elif topic == '/uav40/estimation_manager/odom_main':
+ entry['uav40_distance_x'] = msg.pose.pose.position.x
+ entry['uav40_distance_y'] = msg.pose.pose.position.y
+ entry['uav40_distance_z'] = msg.pose.pose.position.z
+
+ data.append(entry)
+ combined_data.extend(data)
+
+# Sort combined data by timestamp to align the entries
+combined_data.sort(key=lambda x: x['timestamp'])
+
+# Write to CSV
+with open(output_csv, 'w', newline='') as csvfile:
+ fieldnames = [
+ 'timestamp',
+ 'uav36_distance_x', 'uav36_distance_y', 'uav36_distance_z',
+ 'uav39_distance_x', 'uav39_distance_y', 'uav39_distance_z',
+ 'uav40_distance_x', 'uav40_distance_y', 'uav40_distance_z',
+ 'value', 'point_x', 'point_y'
+ ]
+ writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
+ writer.writeheader()
+ for entry in combined_data:
+ writer.writerow(entry)
+
+print(f"Data extracted and combined from multiple bag files and saved to {output_csv}")
diff --git a/scripts/extracting_evaluation_distance.py b/scripts/extracting_evaluation_distance.py
index c64466c..f5bbc67 100755
--- a/scripts/extracting_evaluation_distance.py
+++ b/scripts/extracting_evaluation_distance.py
@@ -1,65 +1,25 @@
- #!/usr/bin/env python
+#!/usr/bin/env python
import rosbag
import csv
import os
+name_experiment = 'variant1_th60'
+# name_file_uav38 = 'uav38_'+name_experiment
+# name_file_uav39 = 'uav39_'+name_experiment
-#bag_path = os.path.expanduser('~/Desktop/MRS_Master_Project/rosbags/simulation/test_standard_topics_3.bag')
-"""
-
-primary_bag_path = os.path.expanduser('~/bag_files/marlon_experiments_temesvar/day3/day3/uav_38_standard_exp3/uav38_standard_exp3.bag')
-secondary_bag_path = os.path.expanduser('~/bag_files/marlon_experiments_temesvar/day3/day3/uav39_standard_exp3/uav39_standard_exp3.bag') """
-
-
-
-""" distance_y_list = []
-
-with rosbag.Bag(secondary_bag_path, 'r') as bag:
- for topic, msg, t in bag.read_messages(topics=['/uav39/control_manager/control_reference']):
- distance_y_list.append(msg.pose.pose.position.y)
-
-
-#Print size of distance_y_list
-print(len(distance_y_list))
-
-combined_data = []
-index = 0
-with rosbag.Bag(primary_bag_path, 'r') as bag:
- for topic, msg, t in bag.read_messages(topics=['/uav38/uvdar/blinkers_seen_left', '/uav38/uvdar/blinkers_seen_right']):
- timestamp = t.to_sec()
- distance_x = distance_y_list[index] if index < len(distance_y_list) else None
- entry = {'timestamp': timestamp, 'distance_y': distance_x, 'value': None}
- if topic in ['/uav38/uvdar/blinkers_seen_left', '/uav38/uvdar/blinkers_seen_right']:
- entry['value'] = [point.value for point in msg.points]
- combined_data.append(entry)
- index += 1 """
-
-
-name_experiment = 'kl_exp1'
-name_file_uav38 = 'uav38_'+name_experiment
-name_file_uav39 = 'uav39_'+name_experiment
-
-output_csv = os.path.expanduser('~/Desktop/MRS_Master_Project/rosbags/rw/raw_csv_v2/'+name_experiment+'.csv')
-
+output_csv = os.path.expanduser('~/Desktop/MRS_Master_Project/paper/raw_csv/'+name_experiment+'.csv')
bag_files = [
#os.path.expanduser('~/bag_files/marlon_experiments_temesvar/day3/day3/'+name_file_uav38+'/'+name_file_uav38+'.bag'),
- os.path.expanduser('~/bag_files/marlon_experiments_temesvar/uav38_kl_first/uav38_kl_first.bag'),
- os.path.expanduser('~/bag_files/marlon_experiments_temesvar/uav39_kl_first/uav39_kl_first.bag'),
- #os.path.expanduser('~/bag_files/marlon_experiments_temesvar/day3/day3/'+name_file_uav39+'/'+name_file_uav39+'.bag'),
-
- #os.path.expanduser('~/Desktop/MRS_Master_Project/rosbags/simulation/static_standard_topics_8m.bag'),
- #os.path.expanduser('~/Desktop/MRS_Master_Project/rosbags/simulation/static_standard_topics_11m.bag'),
- #os.path.expanduser('~/Desktop/MRS_Master_Project/rosbags/simulation/static_standard_topics_14m.bag'),
- #os.path.expanduser('~/Desktop/MRS_Master_Project/rosbags/simulation/static_standard_topics_17m.bag'),
- #os.path.expanduser('~/Desktop/MRS_Master_Project/rosbags/simulation/static_standard_topics_20m.bag'),
+ #RX
+ os.path.expanduser('~/bag_files/paper_rosbags/new_launchfile/variant01_v2_th60.bag'),
+ #TX1
+ os.path.expanduser('~/bag_files/datasets_08_2024/uav39_rosbags/76_2024_08_20_14_02_27variant1/_2024-08-20-14-14-09.bag'),
+ #TX2
+ os.path.expanduser('~/bag_files/datasets_08_2024/uav40_rosbags_tx/37_2024_08_20_14_02_31variant1/_2024-08-20-14-14-10.bag'),
]
-#output_csv = os.path.expanduser('~/Desktop/MRS_Master_Project/rosbags/simulation/standard_test_3.csv')
-
-#output_csv = os.path.expanduser('~/Desktop/MRS_Master_Project/rosbags/rw/raw_csv/otsu_exp1.csv')
-
-topics = ['/uav38/uvdar/blinkers_seen_left','/uav38/estimation_manager/odom_main','/uav39/estimation_manager/odom_main']
+topics = ['/uav36/uvdar/blinkers_seen_left','/uav36/estimation_manager/odom_main','/uav39/estimation_manager/odom_main', '/uav40/estimation_manager/odom_main']
combined_data = []
@@ -68,21 +28,28 @@
with rosbag.Bag(bag_path, 'r') as bag:
data = []
for topic, msg, t in bag.read_messages(topics=topics):
- entry = {'timestamp': t.to_sec(), 'uav38_distance_y': None, 'uav39_distance_y':None, 'value': None, 'point_x': None, 'point_y': None}
- if topic in ['/uav38/uvdar/blinkers_seen_left']:
+ entry = {'timestamp': t.to_sec(), 'uav36_distance_x': None, 'uav36_distance_y':None, 'uav36_distance_z':None,
+ 'uav39_distance_x': None, 'uav39_distance_y':None, 'uav39_distance_z':None,
+ 'uav40_distance_x': None, 'uav40_distance_y':None, 'uav40_distance_z':None,
+ 'value': None, 'point_x': None, 'point_y': None}
+ if topic in ['/uav36/uvdar/blinkers_seen_left']:
#entry['value'] = msg.points[0].value if msg.points else None
#Take all the values
entry['value'] = [point.value for point in msg.points]
entry['point_x'] = [point.x for point in msg.points]
entry['point_y'] = [point.y for point in msg.points]
- elif topic == '/uav38/estimation_manager/odom_main':
- entry['uav38_distance_x'] = msg.pose.pose.position.x
- entry['uav38_distance_y'] = msg.pose.pose.position.y
- entry['uav38_distance_z'] = msg.pose.pose.position.z
+ elif topic == '/uav36/estimation_manager/odom_main':
+ entry['uav36_distance_x'] = msg.pose.pose.position.x
+ entry['uav36_distance_y'] = msg.pose.pose.position.y
+ entry['uav36_distance_z'] = msg.pose.pose.position.z
elif topic == '/uav39/estimation_manager/odom_main':
entry['uav39_distance_x'] = msg.pose.pose.position.x
entry['uav39_distance_y'] = msg.pose.pose.position.y
entry['uav39_distance_z'] = msg.pose.pose.position.z
+ elif topic == '/uav40/estimation_manager/odom_main':
+ entry['uav40_distance_x'] = msg.pose.pose.position.x
+ entry['uav40_distance_y'] = msg.pose.pose.position.y
+ entry['uav40_distance_z'] = msg.pose.pose.position.z
data.append(entry)
combined_data.extend(data)
@@ -91,11 +58,11 @@
combined_data.sort(key=lambda x: x['timestamp'])
with open(output_csv, 'w', newline='') as csvfile:
- fieldnames = ['timestamp', 'uav38_distance_x', 'uav38_distance_y', 'uav38_distance_z', 'uav39_distance_x', 'uav39_distance_y', 'uav39_distance_z', 'value', 'point_x', 'point_y']
+ fieldnames = ['timestamp', 'uav36_distance_x', 'uav36_distance_y', 'uav36_distance_z', 'uav39_distance_x', 'uav39_distance_y', 'uav39_distance_z', 'uav40_distance_x', 'uav40_distance_y', 'uav40_distance_z', 'value', 'point_x', 'point_y']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for entry in combined_data:
writer.writerow(entry)
-print(f"Data extracted and combined from multiple bag files and saved to {output_csv}")
\ No newline at end of file
+print(f"Data extracted and combined from multiple bag files and saved to {output_csv}")
diff --git a/scripts/file_mapping_dynamic.csv b/scripts/file_mapping_dynamic.csv
new file mode 100644
index 0000000..b13b94d
--- /dev/null
+++ b/scripts/file_mapping_dynamic.csv
@@ -0,0 +1,7 @@
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/motiv/motiv_dynamic_th40.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/79_2024_08_20_14_47_03motivation_movement/_2024-08-20-14-51-35.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/40_2024_08_20_14_47_20motivation_movement/_2024-08-20-14-51-34.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/motiv/motiv_dynamic_th60.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/79_2024_08_20_14_47_03motivation_movement/_2024-08-20-14-51-35.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/40_2024_08_20_14_47_20motivation_movement/_2024-08-20-14-51-34.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/motiv/motiv_dynamic_th80.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/79_2024_08_20_14_47_03motivation_movement/_2024-08-20-14-51-35.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/40_2024_08_20_14_47_20motivation_movement/_2024-08-20-14-51-34.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/motiv/motiv_dynamic_th100.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/79_2024_08_20_14_47_03motivation_movement/_2024-08-20-14-51-35.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/40_2024_08_20_14_47_20motivation_movement/_2024-08-20-14-51-34.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/motiv/motiv_dynamic_th120.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/79_2024_08_20_14_47_03motivation_movement/_2024-08-20-14-51-35.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/40_2024_08_20_14_47_20motivation_movement/_2024-08-20-14-51-34.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/motiv/motiv_dynamic_th160.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/79_2024_08_20_14_47_03motivation_movement/_2024-08-20-14-51-35.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/40_2024_08_20_14_47_20motivation_movement/_2024-08-20-14-51-34.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/motiv/motiv_dynamic_th200.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/79_2024_08_20_14_47_03motivation_movement/_2024-08-20-14-51-35.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/40_2024_08_20_14_47_20motivation_movement/_2024-08-20-14-51-34.bag
diff --git a/scripts/file_mapping_variant01.csv b/scripts/file_mapping_variant01.csv
new file mode 100644
index 0000000..491839c
--- /dev/null
+++ b/scripts/file_mapping_variant01.csv
@@ -0,0 +1,7 @@
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/varian01/variant01_v2_th40.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/76_2024_08_20_14_02_27variant1/_2024-08-20-14-14-09.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/37_2024_08_20_14_02_31variant1/_2024-08-20-14-14-10.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/varian01/variant01_v2_th60.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/76_2024_08_20_14_02_27variant1/_2024-08-20-14-14-09.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/37_2024_08_20_14_02_31variant1/_2024-08-20-14-14-10.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/varian01/variant01_v2_th80.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/76_2024_08_20_14_02_27variant1/_2024-08-20-14-14-09.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/37_2024_08_20_14_02_31variant1/_2024-08-20-14-14-10.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/varian01/variant01_v2_th100.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/76_2024_08_20_14_02_27variant1/_2024-08-20-14-14-09.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/37_2024_08_20_14_02_31variant1/_2024-08-20-14-14-10.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/varian01/variant01_v2_th120.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/76_2024_08_20_14_02_27variant1/_2024-08-20-14-14-09.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/37_2024_08_20_14_02_31variant1/_2024-08-20-14-14-10.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/varian01/variant01_v2_th160.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/76_2024_08_20_14_02_27variant1/_2024-08-20-14-14-09.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/37_2024_08_20_14_02_31variant1/_2024-08-20-14-14-10.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/varian01/variant01_v2_th200.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/76_2024_08_20_14_02_27variant1/_2024-08-20-14-14-09.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/37_2024_08_20_14_02_31variant1/_2024-08-20-14-14-10.bag
diff --git a/scripts/file_mapping_variant02.csv b/scripts/file_mapping_variant02.csv
new file mode 100644
index 0000000..cee5ebc
--- /dev/null
+++ b/scripts/file_mapping_variant02.csv
@@ -0,0 +1,7 @@
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant02/variant02_v2_th40.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/77_2024_08_20_14_22_02variant2/_2024-08-20-14-23-37.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/38_2024_08_20_14_22_15variant2/_2024-08-20-14-23-36.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant02/variant02_v2_th60.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/77_2024_08_20_14_22_02variant2/_2024-08-20-14-23-37.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/38_2024_08_20_14_22_15variant2/_2024-08-20-14-23-36.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant02/variant02_v2_th80.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/77_2024_08_20_14_22_02variant2/_2024-08-20-14-23-37.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/38_2024_08_20_14_22_15variant2/_2024-08-20-14-23-36.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant02/variant02_v2_th100.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/77_2024_08_20_14_22_02variant2/_2024-08-20-14-23-37.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/38_2024_08_20_14_22_15variant2/_2024-08-20-14-23-36.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant02/variant02_v2_th120.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/77_2024_08_20_14_22_02variant2/_2024-08-20-14-23-37.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/38_2024_08_20_14_22_15variant2/_2024-08-20-14-23-36.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant02/variant02_v2_th160.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/77_2024_08_20_14_22_02variant2/_2024-08-20-14-23-37.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/38_2024_08_20_14_22_15variant2/_2024-08-20-14-23-36.bag
+/home/rivermar/bag_files/paper_rosbags/new_launchfile/variant02/variant02_v2_th200.bag,/home/rivermar/bag_files/datasets_08_2024/uav39_rosbags/77_2024_08_20_14_22_02variant2/_2024-08-20-14-23-37.bag,/home/rivermar/bag_files/datasets_08_2024/uav40_rosbags_tx/38_2024_08_20_14_22_15variant2/_2024-08-20-14-23-36.bag
diff --git a/scripts/new_extract_data.py b/scripts/new_extract_data.py
new file mode 100755
index 0000000..b702955
--- /dev/null
+++ b/scripts/new_extract_data.py
@@ -0,0 +1,117 @@
+#!/usr/bin/env python
+import rosbag
+import pandas as pd
+import os
+import argparse
+
+# Parse command-line arguments
+parser = argparse.ArgumentParser(description='Extract data from ROS bags and save to CSV.')
+parser.add_argument('--name_experiment', type=str, required=True, help='Name of the experiment')
+parser.add_argument('--rx_bag', type=str, required=True, help='Path to RX bag file')
+parser.add_argument('--tx1_bag', type=str, required=True, help='Path to TX1 bag file')
+parser.add_argument('--tx2_bag', type=str, required=True, help='Path to TX2 bag file')
+parser.add_argument('--output_csv', type=str, required=True, help='Path to output CSV file')
+
+args = parser.parse_args()
+
+name_experiment = args.name_experiment
+output_csv = args.output_csv
+
+# Read blinkers data from uav36 bag
+blinkers_msgs = []
+
+with rosbag.Bag(args.rx_bag, 'r') as bag:
+ for topic, msg, t in bag.read_messages(topics=['/uav36/uvdar/blinkers_seen_left']):
+ timestamp = t.to_sec()
+ entry = {
+ 'timestamp': timestamp,
+ 'value': [point.value for point in msg.points],
+ 'point_x': [point.x for point in msg.points],
+ 'point_y': [point.y for point in msg.points]
+ }
+ blinkers_msgs.append(entry)
+
+# Convert to DataFrame
+blinkers_df = pd.DataFrame(blinkers_msgs)
+blinkers_df.sort_values('timestamp', inplace=True)
+
+# Aggregate duplicate timestamps by summing the lists
+blinkers_df = blinkers_df.groupby('timestamp').agg({
+ 'value': 'sum',
+ 'point_x': 'sum',
+ 'point_y': 'sum'
+}).reset_index()
+
+# Set timestamp as index
+blinkers_df.set_index('timestamp', inplace=True)
+
+# Get the first blinkers timestamp
+first_blinkers_timestamp = blinkers_df.index.min()
+
+# Function to read odom data, adjust timestamps, and set timestamp as index
+def read_odom_data(bag_path, topic_name, prefix, offset):
+ msgs = []
+ with rosbag.Bag(bag_path, 'r') as bag:
+ for topic, msg, t in bag.read_messages(topics=[topic_name]):
+ timestamp = t.to_sec() + offset
+ entry = {
+ 'timestamp': timestamp,
+ f'{prefix}_distance_x': msg.pose.pose.position.x,
+ f'{prefix}_distance_y': msg.pose.pose.position.y,
+ f'{prefix}_distance_z': msg.pose.pose.position.z
+ }
+ msgs.append(entry)
+ df = pd.DataFrame(msgs)
+ df.sort_values('timestamp', inplace=True)
+ df.set_index('timestamp', inplace=True)
+ # Remove duplicate timestamps
+ df = df[~df.index.duplicated(keep='first')]
+ return df
+
+# Calculate offsets
+def get_first_timestamp(bag_path, topic_name):
+ with rosbag.Bag(bag_path, 'r') as bag:
+ for topic, msg, t in bag.read_messages(topics=[topic_name]):
+ return t.to_sec()
+ return None
+
+first_uav36_odom_timestamp = get_first_timestamp(args.rx_bag, '/uav36/estimation_manager/odom_main')
+first_uav39_odom_timestamp = get_first_timestamp(args.tx1_bag, '/uav39/estimation_manager/odom_main')
+first_uav40_odom_timestamp = get_first_timestamp(args.tx2_bag, '/uav40/estimation_manager/odom_main')
+
+# Calculate offsets
+offset_uav36 = first_blinkers_timestamp - first_uav36_odom_timestamp
+offset_uav39 = first_blinkers_timestamp - first_uav39_odom_timestamp
+offset_uav40 = first_blinkers_timestamp - first_uav40_odom_timestamp
+
+# Read odom data and adjust timestamps
+uav36_odom_df = read_odom_data(args.rx_bag, '/uav36/estimation_manager/odom_main', 'uav36', offset_uav36)
+uav39_odom_df = read_odom_data(args.tx1_bag, '/uav39/estimation_manager/odom_main', 'uav39', offset_uav39)
+uav40_odom_df = read_odom_data(args.tx2_bag, '/uav40/estimation_manager/odom_main', 'uav40', offset_uav40)
+
+# Align position data to blinkers timestamps using reindex with method='nearest'
+def align_to_blinkers(blinkers_index, odom_df, tolerance):
+ # Reindex odom data to blinkers timestamps
+ aligned_df = odom_df.reindex(index=blinkers_index, method='nearest', tolerance=tolerance)
+ return aligned_df
+
+tolerance = 0.1 # 100 milliseconds
+
+# Align position data
+uav36_aligned = align_to_blinkers(blinkers_df.index, uav36_odom_df, tolerance)
+uav39_aligned = align_to_blinkers(blinkers_df.index, uav39_odom_df, tolerance)
+uav40_aligned = align_to_blinkers(blinkers_df.index, uav40_odom_df, tolerance)
+
+# Combine all data into one DataFrame
+merged_df = pd.concat([blinkers_df, uav36_aligned, uav39_aligned, uav40_aligned], axis=1)
+
+# Drop any rows with NaN values (if positions couldn't be matched within tolerance)
+merged_df.dropna(inplace=True)
+
+# Reset index to have timestamp as a column
+merged_df.reset_index(inplace=True)
+
+# Save to CSV
+merged_df.to_csv(output_csv, index=False)
+
+print(f"Data extracted and combined from multiple bag files and saved to {output_csv}")
diff --git a/scripts/new_processing_raw_csv.py b/scripts/new_processing_raw_csv.py
new file mode 100755
index 0000000..87358fc
--- /dev/null
+++ b/scripts/new_processing_raw_csv.py
@@ -0,0 +1,180 @@
+import pandas as pd
+import os
+import numpy as np
+import ast
+import argparse
+
+# Parse command-line arguments
+parser = argparse.ArgumentParser(description='Process CSV data')
+parser.add_argument('--name_experiment', type=str, required=True, help='Name of the experiment (without .csv)')
+parser.add_argument('--variant', type=int, required=True, help='Variant number (e.g., 1, 2, or 3)')
+args = parser.parse_args()
+
+# Experiment name and variant
+name_experiment = args.name_experiment # e.g., 'variant1_th40'
+variant = args.variant # e.g., 1
+
+# Paths
+input_csv_path = os.path.expanduser('~/Desktop/MRS_Master_Project/paper/new_raw_csv/' + name_experiment + '.csv')
+cleaned_file_path = os.path.expanduser('~/Desktop/MRS_Master_Project/paper/processed_csv_automation_v2/' + name_experiment + '_processed.csv')
+
+# Read data
+data = pd.read_csv(input_csv_path)
+
+# Convert 'value', 'point_x', 'point_y' from string representation of lists to actual lists
+data['value'] = data['value'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else [])
+data['point_x'] = data['point_x'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else [])
+data['point_y'] = data['point_y'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else [])
+
+# Ensure the fields are lists
+def ensure_list(x):
+ return x if isinstance(x, list) else []
+
+data['value'] = data['value'].apply(ensure_list)
+data['point_x'] = data['point_x'].apply(ensure_list)
+data['point_y'] = data['point_y'].apply(ensure_list)
+
+# Define target positions for each variant
+variants = {
+ 1: {
+ 'uav36': {'x': -55, 'y': 10, 'z': 5},
+ 'uav39': {'x': -58, 'y': 15, 'z': 5},
+ 'uav40': {'x': -53, 'y': 20, 'z': 5}
+ },
+ 2: {
+ 'uav36': {'x': -55, 'y': 10, 'z': 5},
+ 'uav39': {'x': -58, 'y': 17, 'z': 5},
+ 'uav40': {'x': -53, 'y': 24, 'z': 5}
+ },
+ 3: {
+ 'uav36': {'x': -55, 'y': 10, 'z': 5},
+ 'uav39': {'x': -58, 'y': 24, 'z': 5},
+ 'uav40': {'x': -53, 'y': 38, 'z': 5}
+ }
+}
+
+# Get target positions for the specified variant
+try:
+ target_positions = variants[variant]
+except KeyError:
+ raise ValueError(f"Variant {variant} is not defined.")
+
+# Define tolerance (in meters)
+position_tolerance = 0.5 # Adjust as needed
+
+# Function to check if UAV is at its target position within tolerance
+def is_uav_at_position(uav_x, uav_y, uav_z, target_x, target_y, target_z, tolerance):
+ return (abs(uav_x - target_x) <= tolerance and
+ abs(uav_y - target_y) <= tolerance and
+ abs(uav_z - target_z) <= tolerance)
+
+# Apply the position filter to the data
+def position_filter(row):
+ uav36_at_pos = is_uav_at_position(
+ row['uav36_distance_x'], row['uav36_distance_y'], row['uav36_distance_z'],
+ target_positions['uav36']['x'], target_positions['uav36']['y'], target_positions['uav36']['z'],
+ position_tolerance
+ )
+ uav39_at_pos = is_uav_at_position(
+ row['uav39_distance_x'], row['uav39_distance_y'], row['uav39_distance_z'],
+ target_positions['uav39']['x'], target_positions['uav39']['y'], target_positions['uav39']['z'],
+ position_tolerance
+ )
+ uav40_at_pos = is_uav_at_position(
+ row['uav40_distance_x'], row['uav40_distance_y'], row['uav40_distance_z'],
+ target_positions['uav40']['x'], target_positions['uav40']['y'], target_positions['uav40']['z'],
+ position_tolerance
+ )
+ return uav36_at_pos and uav39_at_pos and uav40_at_pos
+
+# Apply the filter
+data = data[data.apply(position_filter, axis=1)]
+
+# Proceed with the rest of the processing
+# Define signal regions and expected values
+signals = [
+ {
+ 'signal_name': 'signal_1',
+ 'expected_value': 1.0,
+ 'center_x_min': 190,
+ 'center_x_max': 380
+ },
+ {
+ 'signal_name': 'signal_2',
+ 'expected_value': 2.0,
+ 'center_x_min': 390,
+ 'center_x_max': 600
+ }
+]
+
+# Initialize columns for counts and occurrences
+for signal in signals:
+ signal_name = signal['signal_name']
+ data[f'num_points_{signal_name}'] = 0
+ data[f'num_errors_{signal_name}'] = 0
+ data[f'{signal_name}_present'] = 0
+
+# Function to process each row
+def process_row(row):
+ values = row['value']
+ point_x = row['point_x']
+ point_y = row['point_y']
+
+ # Initialize counters for each signal
+ counts = {}
+ for signal in signals:
+ signal_name = signal['signal_name']
+ counts[signal_name] = {
+ 'num_points': 0,
+ 'num_errors': 0,
+ 'present': 0
+ }
+
+ # Process each point
+ for v, x, y in zip(values, point_x, point_y):
+ for signal in signals:
+ signal_name = signal['signal_name']
+ expected_value = signal['expected_value']
+ center_x_min = signal['center_x_min']
+ center_x_max = signal['center_x_max']
+ center_y_min = 0.2 * 480 # image_height = 480
+ center_y_max = 0.8 * 480
+
+ if center_x_min <= x <= center_x_max and center_y_min <= y <= center_y_max:
+ counts[signal_name]['num_points'] += 1
+ if v != expected_value:
+ counts[signal_name]['num_errors'] += 1
+ else:
+ counts[signal_name]['present'] = 1 # Signal is present
+
+ # Assign counts to the row
+ for signal in signals:
+ signal_name = signal['signal_name']
+ row[f'num_points_{signal_name}'] = counts[signal_name]['num_points']
+ row[f'num_errors_{signal_name}'] = counts[signal_name]['num_errors']
+ row[f'{signal_name}_present'] = counts[signal_name]['present']
+
+ return row
+
+# Apply the processing to each row
+data = data.apply(process_row, axis=1)
+
+# Remove rows where there are no points for any signal
+data = data[(data['num_points_signal_1'] > 0) | (data['num_points_signal_2'] > 0)]
+
+# Check for missing values in UAV distance fields
+uav_fields = [
+ 'uav36_distance_x', 'uav36_distance_y', 'uav36_distance_z',
+ 'uav39_distance_x', 'uav39_distance_y', 'uav39_distance_z',
+ 'uav40_distance_x', 'uav40_distance_y', 'uav40_distance_z'
+]
+
+# Drop rows with missing values in UAV fields
+data.dropna(subset=uav_fields, inplace=True)
+
+# Calculate relative distance_y
+data['uav39_relative_distance_y'] = np.abs(data['uav39_distance_y'] - data['uav36_distance_y'])
+data['uav40_relative_distance_y'] = np.abs(data['uav40_distance_y'] - data['uav36_distance_y'])
+
+# Save processed data
+data.to_csv(cleaned_file_path, index=False)
diff --git a/scripts/new_processing_raw_csv_dynamic.py b/scripts/new_processing_raw_csv_dynamic.py
new file mode 100755
index 0000000..7f3cc8f
--- /dev/null
+++ b/scripts/new_processing_raw_csv_dynamic.py
@@ -0,0 +1,182 @@
+import pandas as pd
+import os
+import numpy as np
+import ast
+import argparse
+
+# Parse command-line arguments
+parser = argparse.ArgumentParser(description='Process CSV data')
+parser.add_argument('--name_experiment', type=str, required=True, help='Name of the experiment (without .csv)')
+# parser.add_argument('--variant', type=int, required=True, help='Variant number (e.g., 1, 2, or 3)')
+args = parser.parse_args()
+
+# Experiment name and variant
+name_experiment = args.name_experiment # e.g., 'variant1_th40'
+# variant = args.variant # e.g., 1
+
+# Paths
+input_csv_path = os.path.expanduser('~/Desktop/MRS_Master_Project/paper/dynamic_raw_csv/' + name_experiment + '.csv')
+cleaned_file_path = os.path.expanduser('~/Desktop/MRS_Master_Project/paper/processed_csv_automation_dynamic/' + name_experiment + '_processed.csv')
+
+# Read data
+data = pd.read_csv(input_csv_path)
+
+# Convert 'value', 'point_x', 'point_y' from string representation of lists to actual lists
+data['value'] = data['value'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else [])
+data['point_x'] = data['point_x'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else [])
+data['point_y'] = data['point_y'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else [])
+
+# Ensure the fields are lists
+def ensure_list(x):
+ return x if isinstance(x, list) else []
+
+data['value'] = data['value'].apply(ensure_list)
+data['point_x'] = data['point_x'].apply(ensure_list)
+data['point_y'] = data['point_y'].apply(ensure_list)
+
+# # Define target positions for each variant
+# variants = {
+# 1: {
+# 'uav36': {'x': -55, 'y': 10, 'z': 5},
+# 'uav39': {'x': -58, 'y': 15, 'z': 5},
+# 'uav40': {'x': -53, 'y': 20, 'z': 5}
+# },
+# 2: {
+# 'uav36': {'x': -55, 'y': 10, 'z': 5},
+# 'uav39': {'x': -58, 'y': 17, 'z': 5},
+# 'uav40': {'x': -53, 'y': 24, 'z': 5}
+# },
+# 3: {
+# 'uav36': {'x': -55, 'y': 10, 'z': 5},
+# 'uav39': {'x': -58, 'y': 24, 'z': 5},
+# 'uav40': {'x': -53, 'y': 38, 'z': 5}
+# }
+# }
+
+# # Get target positions for the specified variant
+# try:
+# target_positions = variants[variant]
+# except KeyError:
+# raise ValueError(f"Variant {variant} is not defined.")
+
+target_position_uav36 = {'x': -55, 'y': 10, 'z': 5}
+
+# Define tolerance (in meters)
+position_tolerance = 0.5 # Adjust as needed
+
+# Function to check if UAV is at its target position within tolerance
+def is_uav_at_position(uav_x, uav_y, uav_z, target_x, target_y, target_z, tolerance):
+ return (abs(uav_x - target_x) <= tolerance and
+ abs(uav_y - target_y) <= tolerance and
+ abs(uav_z - target_z) <= tolerance)
+
+# Apply the position filter to the data
+def position_filter(row):
+
+ uav36_at_pos = is_uav_at_position(
+ row['uav36_distance_x'], row['uav36_distance_y'], row['uav36_distance_z'],
+ target_position_uav36['x'], target_position_uav36['y'], target_position_uav36['z'],
+ position_tolerance
+ )
+ uav39_in_range = (
+ -63.5 <= row['uav39_distance_x'] <= -57.5 and
+ 14.5 <= row['uav39_distance_y'] <= 25.5
+ )
+
+ uav40_in_range = (
+ -53.5 <= row['uav40_distance_x'] <= -47.5 and # Allowing a small tolerance around -53.0
+ 19.5 <= row['uav40_distance_y'] <= 30.5
+ )
+
+ return uav36_at_pos and uav39_in_range and uav40_in_range
+# Apply the filter
+data = data[data.apply(position_filter, axis=1)]
+
+# Proceed with the rest of the processing
+# Define signal regions and expected values
+signals = [
+ {
+ 'signal_name': 'signal_1',
+ 'expected_value': 1.0,
+ 'center_x_min': 190,
+ 'center_x_max': 380
+ },
+ {
+ 'signal_name': 'signal_2',
+ 'expected_value': 2.0,
+ 'center_x_min': 390,
+ 'center_x_max': 600
+ }
+]
+
+# Initialize columns for counts and occurrences
+for signal in signals:
+ signal_name = signal['signal_name']
+ data[f'num_points_{signal_name}'] = 0
+ data[f'num_errors_{signal_name}'] = 0
+ data[f'{signal_name}_present'] = 0
+
+# Function to process each row
+def process_row(row):
+ values = row['value']
+ point_x = row['point_x']
+ point_y = row['point_y']
+
+ # Initialize counters for each signal
+ counts = {}
+ for signal in signals:
+ signal_name = signal['signal_name']
+ counts[signal_name] = {
+ 'num_points': 0,
+ 'num_errors': 0,
+ 'present': 0
+ }
+
+ # Process each point
+ for v, x, y in zip(values, point_x, point_y):
+ for signal in signals:
+ signal_name = signal['signal_name']
+ expected_value = signal['expected_value']
+ center_x_min = signal['center_x_min']
+ center_x_max = signal['center_x_max']
+ center_y_min = 0.2 * 480 # image_height = 480
+ center_y_max = 0.8 * 480
+
+ if center_x_min <= x <= center_x_max and center_y_min <= y <= center_y_max:
+ counts[signal_name]['num_points'] += 1
+ if v != expected_value:
+ counts[signal_name]['num_errors'] += 1
+ else:
+ counts[signal_name]['present'] = 1 # Signal is present
+
+ # Assign counts to the row
+ for signal in signals:
+ signal_name = signal['signal_name']
+ row[f'num_points_{signal_name}'] = counts[signal_name]['num_points']
+ row[f'num_errors_{signal_name}'] = counts[signal_name]['num_errors']
+ row[f'{signal_name}_present'] = counts[signal_name]['present']
+
+ return row
+
+# Apply the processing to each row
+data = data.apply(process_row, axis=1)
+
+# Remove rows where there are no points for any signal
+data = data[(data['num_points_signal_1'] > 0) | (data['num_points_signal_2'] > 0)]
+
+# Check for missing values in UAV distance fields
+uav_fields = [
+ 'uav36_distance_x', 'uav36_distance_y', 'uav36_distance_z',
+ 'uav39_distance_x', 'uav39_distance_y', 'uav39_distance_z',
+ 'uav40_distance_x', 'uav40_distance_y', 'uav40_distance_z'
+]
+
+# Drop rows with missing values in UAV fields
+data.dropna(subset=uav_fields, inplace=True)
+
+# Calculate relative distance_y
+data['uav39_relative_distance_y'] = np.abs(data['uav39_distance_y'] - data['uav36_distance_y'])
+data['uav40_relative_distance_y'] = np.abs(data['uav40_distance_y'] - data['uav36_distance_y'])
+
+# Save processed data
+data.to_csv(cleaned_file_path, index=False)
diff --git a/scripts/process_all.sh b/scripts/process_all.sh
new file mode 100755
index 0000000..5a122df
--- /dev/null
+++ b/scripts/process_all.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+# Directories
+raw_csv_dir=~/Desktop/MRS_Master_Project/paper/new_raw_csv
+processed_csv_dir=~/Desktop/MRS_Master_Project/paper/processed_csv_automation_v2
+
+# Make sure the processed_csv directory exists
+mkdir -p "$processed_csv_dir"
+
+# Loop over all CSV files in the raw_csv directory
+for filepath in "$raw_csv_dir"/*.csv; do
+ # Get the filename without extension
+ filename=$(basename -- "$filepath")
+ extension="${filename##*.}"
+ name_experiment="${filename%.*}"
+
+ echo "Processing $name_experiment"
+
+ # Extract the variant number from the experiment name
+ # Assuming the filename starts with 'variant' followed by the variant number
+ if [[ "$name_experiment" =~ variant([0-9]+)_ ]]; then
+ variant="${BASH_REMATCH[1]}"
+ echo "Variant number extracted: $variant"
+ else
+ echo "Variant number not found in $name_experiment. Skipping..."
+ continue
+ fi
+
+ # Run the Python script with the variant number
+ python new_processing_raw_csv.py --name_experiment "$name_experiment" --variant "$variant"
+
+done
diff --git a/scripts/process_dynamic.sh b/scripts/process_dynamic.sh
new file mode 100755
index 0000000..3e91200
--- /dev/null
+++ b/scripts/process_dynamic.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+# Directories
+raw_csv_dir=~/Desktop/MRS_Master_Project/paper/dynamic_raw_csv
+processed_csv_dir=~/Desktop/MRS_Master_Project/paper/processed_csv_automation_dynamic
+
+# Make sure the processed_csv directory exists
+mkdir -p "$processed_csv_dir"
+
+# Loop over all CSV files in the raw_csv directory
+for filepath in "$raw_csv_dir"/*.csv; do
+ # Get the filename without extension
+ filename=$(basename -- "$filepath")
+ extension="${filename##*.}"
+ name_experiment="${filename%.*}"
+
+ echo "Processing $name_experiment"
+
+ # Run the Python script
+ python new_processing_raw_csv_dynamic.py --name_experiment "$name_experiment"
+
+done
diff --git a/scripts/processing_raw_csv.py b/scripts/processing_raw_csv.py
new file mode 100755
index 0000000..92d140b
--- /dev/null
+++ b/scripts/processing_raw_csv.py
@@ -0,0 +1,102 @@
+import pandas as pd
+import os
+import numpy as np
+import ast
+import argparse
+
+# Parse command-line arguments
+parser = argparse.ArgumentParser(description='Process CSV data')
+parser.add_argument('--name_experiment', type=str, required=True, help='Name of the experiment (without .csv)')
+parser.add_argument('--subset_rx', type=str, required=True, help='Subset name (e.g., rx1_s1)')
+parser.add_argument('--center_x_min', type=float, required=True, help='Minimum x value for center region')
+parser.add_argument('--center_x_max', type=float, required=True, help='Maximum x value for center region')
+args = parser.parse_args()
+
+# Experiment name
+name_experiment = args.name_experiment # e.g., 'variant1_th40'
+subset_rx = args.subset_rx # e.g., 'rx1_s1'
+
+# Paths
+input_csv_path = os.path.expanduser('~/Desktop/MRS_Master_Project/paper/new_raw_csv/' + name_experiment + '.csv')
+cleaned_file_path = os.path.expanduser('~/Desktop/MRS_Master_Project/paper/processed_csv_automation/' + name_experiment + '_'+ subset_rx +'_processed.csv')
+
+# Read data
+data = pd.read_csv(input_csv_path)
+
+# Convert 'value', 'point_x', 'point_y' from string representation of lists to actual lists
+data['value'] = data['value'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else [])
+data['point_x'] = data['point_x'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else [])
+data['point_y'] = data['point_y'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else [])
+
+# Ensure the fields are lists
+def ensure_list(x):
+ return x if isinstance(x, list) else []
+
+data['value'] = data['value'].apply(ensure_list)
+data['point_x'] = data['point_x'].apply(ensure_list)
+data['point_y'] = data['point_y'].apply(ensure_list)
+
+# Define center area of the image
+image_height, image_width = 480, 752
+center_x_min, center_x_max = args.center_x_min, args.center_x_max
+center_y_min, center_y_max = 0.2 * image_height, 0.8 * image_height
+
+# Function to filter points in the center of the image
+def filter_center_points(values, point_x, point_y):
+ filtered_values, filtered_point_x, filtered_point_y = [], [], []
+ for v, x, y in zip(values, point_x, point_y):
+ if center_x_min <= x <= center_x_max and center_y_min <= y <= center_y_max:
+ filtered_values.append(v)
+ filtered_point_x.append(x)
+ filtered_point_y.append(y)
+ return filtered_values, filtered_point_x, filtered_point_y
+
+# Apply filtering to each row
+filtered_results = data.apply(
+ lambda row: filter_center_points(row['value'], row['point_x'], row['point_y']), axis=1
+)
+
+# Update the DataFrame with filtered results
+data['value'] = filtered_results.apply(lambda x: x[0])
+data['point_x'] = filtered_results.apply(lambda x: x[1])
+data['point_y'] = filtered_results.apply(lambda x: x[2])
+
+# Remove rows where 'value' is empty after filtering
+data = data[data['value'].str.len() > 0]
+
+# Check for missing values in UAV distance fields
+uav_fields = [
+ 'uav36_distance_x', 'uav36_distance_y', 'uav36_distance_z',
+ 'uav39_distance_x', 'uav39_distance_y', 'uav39_distance_z',
+ 'uav40_distance_x', 'uav40_distance_y', 'uav40_distance_z'
+]
+
+# Drop rows with missing values in UAV fields
+data.dropna(subset=uav_fields, inplace=True)
+
+# Calculate relative distance_y
+data['uav39_relative_distance_y'] = np.abs(data['uav39_distance_y'] - data['uav36_distance_y'])
+data['uav40_relative_distance_y'] = np.abs(data['uav40_distance_y'] - data['uav36_distance_y'])
+
+# Calculate number of points
+data['num_points'] = data['value'].apply(len)
+
+# Error rate calculation
+def calculate_error_rate(values):
+ return sum(1 for value in values if value not in [1.0, 2.0])
+
+data['error_count'] = data['value'].apply(calculate_error_rate)
+
+# Signal occurrence functions
+def check_signal_2(values):
+ return 1 if 2.0 in values else 0
+
+def check_signal_1(values):
+ return 1 if 1.0 in values else 0
+
+# Apply signal checks
+data['signal_2'] = data['value'].apply(check_signal_2)
+data['signal_1'] = data['value'].apply(check_signal_1)
+
+# Save processed data
+data.to_csv(cleaned_file_path, index=False)
diff --git a/scripts/record.sh b/scripts/record.sh
index b8c8dee..784a02d 100755
--- a/scripts/record.sh
+++ b/scripts/record.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-path="/home/\$(optenv USER mrs)/bag_files/latest/"
+path="/home/\$(optenv USER mrs)/bag_files/paper_rosbags/"
# By default, we record everything.
# Except for this list of EXCLUDED topics:
@@ -17,9 +17,10 @@ exclude=(
# or just a CRASH.
# Every topic containing "compressed"
+'(.*)uvdar_blink_visualization(.*)'
'(.*)compressed(.*)'
# Every topic containing "image_raw"
-# '(.*)image_raw(.*)'
+ '(.*)image_raw(.*)'
# Every topic containing "theora"
'(.*)theora(.*)'
# Every topic containing "h264"
diff --git a/scripts/rosbag b/scripts/rosbag
new file mode 100644
index 0000000..e69de29
diff --git a/scripts/test_rosbag.yml b/scripts/test_rosbag.yml
index 3ce198b..1685c88 100644
--- a/scripts/test_rosbag.yml
+++ b/scripts/test_rosbag.yml
@@ -1,7 +1,7 @@
name: simulation
root: ./
startup_window: launch
-pre_window: UAV_NAME=uav7
+pre_window: UAV_NAME=uav36
windows:
- core:
layout: even-vertical
@@ -10,16 +10,17 @@ windows:
- launch:
layout: even-vertical
panes:
- - waitForRos; roslaunch uvdar_core rosbag.launch uav_name:=uav7 use_4DHT:=false debug:=false
+ - waitForRos; roslaunch uvdar_core rosbag.launch uav_name:=uav36 use_4DHT:=false debug:=false
# - kf:
# layout: even-vertical
# panes:
# - waitForRos; roslaunch uvdar_core uvdar_kf.launch UAV_NAME:=uav39
#publish_visualization:=false max_zeros_consecutive:=3 max_ones_consecutive:=3 allowed_BER_per_seq:=1 gui:=true
- - rqtviz:
+ - record:
layout: even-vertical
panes:
- # - waitForRos; sleep 3; rosbag record -O ~/Desktop/MRS_Master_Project/rosbags/good_sequence/diff_power_18m_th150_topics.bag /uav7/uvdar_bluefox/left/image_raw /uav7/uvdar/points_seen_left /uav7/uvdar/blinkers_seen_back /uav7/uvdar/ami_all_seq_info_back
+ # - waitForOffBoard; rosbag record -O ~/Desktop/MRS_Master_Project/rosbags/good_sequence/diff_power_18m_th150_topics.bag /uav7/uvdar_bluefox/left/image_raw /uav7/uvdar/points_seen_left /uav7/uvdar/blinkers_seen_back /uav7/uvdar/ami_all_seq_info_back
+ - waitForRos; waitForOffBoard; ./record.sh
#- rosbag record -O rosbags/first/omta_38.bag -e "(.*)_camp"
# - rosbag record -O rosbags/first/omta_39.bag -e "(.*)_camp"
# - rosbag record -O rosbags/first/4dht_38.bag -e "(.*)_camp"
@@ -27,8 +28,6 @@ windows:
# - rosbag record -O rosbags/second/omta_1.bag -e "(.*)_camp"
# - rosbag record -O rosbags/second/omta_2.bag -e "(.*)_camp"
# - rosbag record -O rosbags/third/omta.bag -e "(.*)_camp"
- - waitForCompile; roscore;
- - waitForRos; sleep 3; rqt_image_view
- play:
layout: even-vertical
panes:
@@ -36,14 +35,13 @@ windows:
# - waitForRos; sleep 3; rosbag play --clock ~/experiments/20_04/two_tx/two_tx/rx/occlusion_1/rx.bag
# - waitForRos; sleep 3; rosbag play --clock ~/experiments/20_04/two_tx/two_tx/rx/occlusion_2/rx.bag
# - waitForRos; rosbag play --clock ~/experiments/20_04/tumult/tumult/rx/rx.bag
- - waitForRos; sleep 3; rosbag play --clock ~/Desktop/MRS_Master_Project/experiments/diff_power_5m_0615.bag
-
- # - waitForRos; sleep 3; rosbag play --clock ~/experiments/19_04/demo_first/rx1/all_three/rx1.bag
-
- - topics:
+ - waitForRos; sleep 3; rosbag play --clock ~/bag_files/datasets_08_2024/uav36_rosbags_rx/marlon/71_2024_08_20_14_35_41variant3/_2024-08-20-14-37-28.bag
+ - rqt:
layout: even-vertical
panes:
- - waitForRos; sleep 3; rostopic echo /uav7/uvdar/ami_all_seq_info_back
+
+ # - waitForRos; sleep 3; rqt_image_view
+ - waitForRos; sleep 3; rostopic echo /uav36/uvdar/blinkers_seen_left
# - waitForCompile; cd ~/uvdar_rosbag/tracking/uav7/22_2021_04_27_09_11_19_L12/ ; rosbag play --clock -s 30 _2021-04-27-09-11-56.bag
# - trajectory:
diff --git a/scripts/threshold_analysis_summary.csv b/scripts/threshold_analysis_summary.csv
new file mode 100644
index 0000000..b399dfd
--- /dev/null
+++ b/scripts/threshold_analysis_summary.csv
@@ -0,0 +1,8 @@
+Threshold,Total Errors Signal 1,Total Errors Signal 2,Total Instances Signal 1 Present,Total Instances Signal 2 Present,Error Rate Signal 1,Error Rate Signal 2,Percentage Fully Present Signal 1,Percentage Fully Present Signal 2,Combined Error Rate,Max Error Rate,Error Rate Difference (S2 - S1),Relative Error Rate Difference (%)
+40,3564,3637,14133,14461,0.2521757588622373,0.2515040453633912,92.22929109322254,90.93741885224617,0.5036798042256285,0.2521757588622373,-0.0006717134988460938,-0.2663671963858542
+60,3422,3429,14203,14539,0.24093501372949377,0.2358484077309306,92.34614385873799,91.56712542196831,0.4767834214604244,0.24093501372949377,-0.005086605998563171,-2.11119418461697
+80,3338,3216,14227,14622,0.23462430589723765,0.2199425523184243,92.54545454545455,91.81818181818183,0.45456685821566195,0.23462430589723765,-0.01468175357881335,-6.2575586628453435
+100,3265,3253,14259,14691,0.22897818921382987,0.2214280852222449,92.72727272727272,90.66233766233766,0.4504062744360748,0.22897818921382987,-0.0075501039915849555,-3.297302689617454
+120,3176,4481,14275,14771,0.22248686514886165,0.30336470110351366,92.96753246753246,82.27272727272728,0.5258515662523753,0.30336470110351366,0.080877835954652,36.35173514649425
+160,3067,8499,14341,14837,0.2138623526950701,0.5728246950192087,93.05753994025197,59.702558773866734,0.7866870477142789,0.5728246950192087,0.35896234232413865,167.84737369646143
+200,2894,11749,14421,14855,0.2006795645239581,0.7909121507909794,93.27272727272728,43.922077922077925,0.9915917153149375,0.7909121507909794,0.5902325862670214,294.1169359556571
diff --git a/scripts/threshold_analysis_summary_dynamic.csv b/scripts/threshold_analysis_summary_dynamic.csv
new file mode 100644
index 0000000..8b4b7f3
--- /dev/null
+++ b/scripts/threshold_analysis_summary_dynamic.csv
@@ -0,0 +1,8 @@
+Threshold,Total Errors Signal 1,Total Errors Signal 2,Total Instances Signal 1,Total Instances Signal 2,Error Rate Signal 1,Error Rate Signal 2,Percentage Fully Present Signal 1,Percentage Fully Present Signal 2,Combined Error Rate,Max Error Rate,Error Rate Difference (S2 - S1),Relative Error Rate Difference (%)
+40,5459,6075,41561,49654,0.13134910132094993,0.12234663874008136,81.90344239582224,78.83406160076734,0.2536957400610313,0.13134910132094993,-0.009002462580868564,-6.853844061613453
+60,5865,6670,40949,48679,0.14322694082883586,0.13702007025616797,80.87743882720707,74.50684488519995,0.2802470110850038,0.14322694082883586,-0.0062068705726678886,-4.333591527368753
+80,5801,7356,41138,48538,0.1410131751665127,0.15155136181960527,81.13774060372097,70.29113720443944,0.29256453698611795,0.15155136181960527,0.010538186653092557,7.473192941474256
+100,5867,8810,41397,49102,0.1417252457907578,0.17942242678505968,81.48442888216881,64.47556899570269,0.32114767257581744,0.17942242678505968,0.03769718099430189,26.598776233528465
+120,6006,10847,41127,49084,0.14603545116346925,0.2209885094939288,81.00493447232981,55.106913567145966,0.36702396065739806,0.2209885094939288,0.07495305833045954,51.32524858402946
+160,7079,15456,40637,48792,0.1742008514408052,0.31677324151500247,76.0448792938424,38.34414548548335,0.49097409295580763,0.31677324151500247,0.14257239007419728,81.84368152910234
+200,8293,18374,35090,42667,0.23633513821601596,0.4306372606464012,68.11576652942601,22.808186001453137,0.6669723988624171,0.4306372606464012,0.19430212243038522,82.2146566511783
diff --git a/scripts/threshold_analysis_summary_variant01.csv b/scripts/threshold_analysis_summary_variant01.csv
new file mode 100644
index 0000000..95b833e
--- /dev/null
+++ b/scripts/threshold_analysis_summary_variant01.csv
@@ -0,0 +1,8 @@
+Threshold,Total Errors Signal 1,Total Errors Signal 2,Total Instances Signal 1,Total Instances Signal 2,Error Rate Signal 1,Error Rate Signal 2,Percentage Fully Present Signal 1,Percentage Fully Present Signal 2,Combined Error Rate,Max Error Rate,Error Rate Difference (S2 - S1),Relative Error Rate Difference (%)
+40,3564,3637,45856,46383,0.0777215631542219,0.07841234935213333,92.22929109322254,90.93741885224617,0.15613391250635522,0.07841234935213333,0.0006907861979114222,0.8887960687830015
+60,3422,3429,45853,46404,0.07462979521514405,0.0738944918541505,92.34614385873799,91.56712542196831,0.14852428706929455,0.07462979521514405,-0.0007353033609935472,-0.985267826172914
+80,3338,3216,45851,46401,0.07280102942138666,0.06930885110234693,92.54545454545455,91.81818181818183,0.14210988052373358,0.07280102942138666,-0.0034921783190397376,-4.796880410613872
+100,3265,3253,45865,46381,0.07118717976670665,0.0701364782993036,92.72727272727272,90.66233766233766,0.14132365806601024,0.07118717976670665,-0.001050701467403048,-1.4759700705188603
+120,3176,4481,45851,46382,0.0692678458485093,0.09661075417187702,92.96753246753246,82.27272727272728,0.16587860002038632,0.09661075417187702,0.02734290832336772,39.474171584846765
+160,3067,8499,45856,46424,0.06688328681088625,0.18307341030501464,93.05753994025197,59.702558773866734,0.2499566971159009,0.18307341030501464,0.1161901234941284,173.72071414889965
+200,2894,11749,45845,46460,0.06312574980913949,0.2528842014636246,93.27272727272728,43.922077922077925,0.3160099512727641,0.2528842014636246,0.18975845165448513,300.6038775431884
diff --git a/scripts/threshold_analysis_summary_variant02.csv b/scripts/threshold_analysis_summary_variant02.csv
new file mode 100644
index 0000000..d6d7404
--- /dev/null
+++ b/scripts/threshold_analysis_summary_variant02.csv
@@ -0,0 +1,8 @@
+Threshold,Total Errors Signal 1,Total Errors Signal 2,Total Instances Signal 1,Total Instances Signal 2,Error Rate Signal 1,Error Rate Signal 2,Percentage Fully Present Signal 1,Percentage Fully Present Signal 2,Combined Error Rate,Max Error Rate,Error Rate Difference (S2 - S1),Relative Error Rate Difference (%)
+40,3651,4179,48506,48061,0.07526903888178782,0.08695199850190383,92.44750092103648,87.31425764460272,0.16222103738369165,0.08695199850190383,0.011682959620116007,15.521600639094688
+60,3575,6403,48517,48336,0.0736855122946596,0.1324685534591195,92.47820213680463,73.68905808670023,0.2061540657537791,0.1324685534591195,0.05878304116445991,79.77557505387698
+80,3434,7987,48500,48077,0.0708041237113402,0.1661293341930653,92.73475403795369,63.10876374132531,0.2369334579044055,0.1661293341930653,0.0953252104817251,134.6322862074452
+100,3281,10824,48500,48041,0.06764948453608248,0.22530754980121145,92.95100085963404,50.362274346064105,0.2929570343372939,0.22530754980121145,0.157658065265129,233.05139181221443
+120,3147,13276,48503,48064,0.06488258458239697,0.2762150466045273,93.16548971446116,40.55879643844028,0.34109763118692427,0.2762150466045273,0.2113324620221303,325.71523372924645
+160,2819,18607,48305,48139,0.058358347997101746,0.3865265169612996,93.59572639076508,23.369765442711532,0.44488486495840135,0.3865265169612996,0.3281681689641978,562.3328627816807
+200,2731,25055,48513,48047,0.056294189186403644,0.5214685620330094,93.69397028122314,10.106840230873143,0.577762751219413,0.5214685620330094,0.46517437284660573,826.3275118970116
diff --git a/scripts/threshold_analysis_summary_variant03.csv b/scripts/threshold_analysis_summary_variant03.csv
new file mode 100644
index 0000000..1314c8e
--- /dev/null
+++ b/scripts/threshold_analysis_summary_variant03.csv
@@ -0,0 +1,8 @@
+Threshold,Total Errors Signal 1,Total Errors Signal 2,Total Instances Signal 1,Total Instances Signal 2,Error Rate Signal 1,Error Rate Signal 2,Percentage Fully Present Signal 1,Percentage Fully Present Signal 2,Combined Error Rate,Max Error Rate,Error Rate Difference (S2 - S1),Relative Error Rate Difference (%)
+40,14718,17244,47099,30423,0.3124907110554364,0.5668080070998915,25.806661462399166,12.59432734842571,0.879298718155328,0.5668080070998915,0.25431729604445513,81.38395384153955
+60,11785,12408,32907,20228,0.3581304889537181,0.6134071583943049,15.20346646571213,15.4577995478523,0.9715376473480231,0.6134071583943049,0.25527666944058686,71.28035096547637
+80,20746,18473,47592,28309,0.43591359892418896,0.6525486594369282,7.773368893514604,19.573277824757692,1.0884622583611172,0.6525486594369282,0.21663506051273923,49.696788778185116
+100,22762,17325,47349,25903,0.4807282096770787,0.6688414469366483,5.698302218174722,27.21004358290509,1.149569656613727,0.6688414469366483,0.18811323725956958,39.130892149210794
+120,15316,9470,29903,12090,0.5121894124335351,0.7832919768403639,5.905752753977969,24.388004895960833,1.295481389273899,0.7832919768403639,0.2711025644068288,52.93013830933273
+160,27009,13829,46645,14385,0.5790331225211706,0.9613486270420577,3.629976580796253,10.174342961228207,1.5403817495632284,0.9613486270420577,0.38231550452088714,66.0265345195186
+200,30877,10514,46463,10564,0.6645502873253987,0.9952669443392654,2.0295322968841476,31.65289793794315,1.6598172316646642,0.9952669443392654,0.33071665701386677,49.7654825107209