From 4a36c626a1b6a1f0c14d028a9cd446a85288cec7 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 13 May 2024 11:09:40 +0200 Subject: [PATCH] New stats added in 1.0.321 fw --- CaSSAndRA/app.py | 2 +- CaSSAndRA/src/backend/data/appdata.py | 2 +- CaSSAndRA/src/backend/data/datatodf.py | 15 ++++++ CaSSAndRA/src/backend/data/saveddata.py | 53 ++++++++++++++++++ CaSSAndRA/src/components/state/stats.py | 71 ++++++++++++++++++++++--- 5 files changed, 133 insertions(+), 10 deletions(-) diff --git a/CaSSAndRA/app.py b/CaSSAndRA/app.py index 6f1c6b8..07d98e9 100755 --- a/CaSSAndRA/app.py +++ b/CaSSAndRA/app.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -#Version:0.110.1 Fix issue in encrypted http mode +#Version:0.111.0 New stats added in 1.0.321 fw # package imports import os import sys diff --git a/CaSSAndRA/src/backend/data/appdata.py b/CaSSAndRA/src/backend/data/appdata.py index 33b835c..28c637e 100644 --- a/CaSSAndRA/src/backend/data/appdata.py +++ b/CaSSAndRA/src/backend/data/appdata.py @@ -1,4 +1,4 @@ import logging logger = logging.getLogger(__name__) -version = '0.110.1' \ No newline at end of file +version = '0.111.0' \ No newline at end of file diff --git a/CaSSAndRA/src/backend/data/datatodf.py b/CaSSAndRA/src/backend/data/datatodf.py index 02180ce..20be9d2 100644 --- a/CaSSAndRA/src/backend/data/datatodf.py +++ b/CaSSAndRA/src/backend/data/datatodf.py @@ -103,6 +103,12 @@ def add_stats_to_df_from_mqtt(data: dict) -> None: 'temp_min':data['temp_min'], 'temp_min':data['temp_min'], 'duration_mow_motor_recovery': 0, + 'counter_lift_triggered': 0, + 'counter_gps_no_speed_triggered': 0, + 'counter_tof_triggered': 0, + 'counter_diff_imu_wheel_yaw_speed_triggered': 0, + 'counter_imu_no_rotation_triggered': 0, + 'counter_rotation_timeout_triggered': 0, 'timestamp': str(datetime.now())} stats_to_df = pd.DataFrame(data=stats_to_df, index=[0]) roverdata.stats = pd.concat([roverdata.stats, stats_to_df], ignore_index=True) @@ -179,6 +185,9 @@ def add_stats_to_df(data: str) -> None: #handle old AT+T strings (older then 1.0.3XX) if len(data_list) < 25: data_list.append('0') + #handle old AT+T strings (older then 1.0.321) + if len(data_list) < 31: + data_list.extend(['0', '0', '0', '0', '0', '0']) data_list = [float(x) if '.' in x else int(x) for x in data_list] data_list.append(str(datetime.now())) stats_to_df = pd.DataFrame([data_list]) @@ -208,6 +217,12 @@ def add_stats_to_df(data: str) -> None: 'counter_bumper_triggered', 'counter_gps_motion_timeout', 'duration_mow_motor_recovery', + 'counter_lift_triggered', + 'counter_gps_no_speed_triggered', + 'counter_tof_triggered', + 'counter_diff_imu_wheel_yaw_speed_triggered', + 'counter_imu_no_rotation_triggered', + 'counter_rotation_timeout_triggered', 'timestamp' ] roverdata.stats = pd.concat([roverdata.stats, stats_to_df], ignore_index=True) diff --git a/CaSSAndRA/src/backend/data/saveddata.py b/CaSSAndRA/src/backend/data/saveddata.py index 613b779..9d8e956 100644 --- a/CaSSAndRA/src/backend/data/saveddata.py +++ b/CaSSAndRA/src/backend/data/saveddata.py @@ -74,6 +74,18 @@ def read(measure_file_paths) -> None: roverdata.stats = pd.read_pickle(measure_file_paths.stats) if not 'duration_mow_motor_recovery' in roverdata.stats: roverdata.stats['duration_mow_motor_recovery'] = 0 + if not 'counter_lift_triggered' in roverdata.stats.columns: + roverdata.stats['counter_lift_triggered'] = 0 + if not 'counter_gps_no_speed_triggered' in roverdata.stats.columns: + roverdata.stats['counter_gps_no_speed_triggered'] = 0 + if not 'counter_tof_triggered' in roverdata.stats.columns: + roverdata.stats['counter_tof_triggered'] = 0 + if not 'counter_diff_imu_wheel_yaw_speed_triggered' in roverdata.stats.columns: + roverdata.stats['counter_diff_imu_wheel_yaw_speed_triggered'] = 0 + if not 'counter_imu_no_rotation_triggered' in roverdata.stats.columns: + roverdata.stats['counter_imu_no_rotation_triggered'] = 0 + if not 'counter_rotation_timeout_triggered' in roverdata.stats.columns: + roverdata.stats['counter_rotation_timeout_triggered'] = 0 logger.info('Backend: Statistics data are loaded successfully') if roverdata.stats.empty: logger.warning('stats.pickle is empty, create a default data frame') @@ -102,8 +114,15 @@ def read(measure_file_paths) -> None: "temp_min":{"0":0}, "temp_max":{"0":0}, "duration_mow_motor_recovery":{"0":0}, + "counter_lift_triggered":{"0":0}, + "counter_gps_no_speed_triggered":{"0":0}, + "counter_tof_triggered":{"0":0}, + "counter_diff_imu_wheel_yaw_speed_triggered":{"0":0}, + "counter_imu_no_rotation_triggered":{"0":0}, + "counter_rotation_timeout_triggered":{"0":0}, "timestamp":{"0":str(datetime.now())}} roverdata.stats = pd.DataFrame(data=stats) + logger.info('Backend: Statistics data are loaded successfully') except: logger.warning('Backend: Failed to load statistics data, create a default data frame') stats = {"duration_idle":{"0":0}, @@ -131,6 +150,12 @@ def read(measure_file_paths) -> None: "temp_min":{"0":0}, "temp_max":{"0":0}, "duration_mow_motor_recovery":{"0":0}, + "counter_lift_triggered":{"0":0}, + "counter_gps_no_speed_triggered":{"0":0}, + "counter_tof_triggered":{"0":0}, + "counter_diff_imu_wheel_yaw_speed_triggered":{"0":0}, + "counter_imu_no_rotation_triggered":{"0":0}, + "counter_rotation_timeout_triggered":{"0":0}, "timestamp":{"0":str(datetime.now())}} roverdata.stats = pd.DataFrame(data=stats) @@ -158,6 +183,20 @@ def read(measure_file_paths) -> None: #Try to read Calced from Stats Data from file try: roverdata.calced_from_stats = pd.read_pickle(measure_file_paths.calcedstats) + if not 'duration_mow_motor_recovery' in roverdata.calced_from_stats.columns: + roverdata.calced_from_stats['duration_mow_motor_recovery'] = 0 + if not 'counter_lift_triggered' in roverdata.calced_from_stats.columns: + roverdata.calced_from_stats['counter_lift_triggered'] = 0 + if not 'counter_gps_no_speed_triggered' in roverdata.calced_from_stats.columns: + roverdata.calced_from_stats['counter_gps_no_speed_triggered'] = 0 + if not 'counter_tof_triggered' in roverdata.calced_from_stats.columns: + roverdata.calced_from_stats['counter_tof_triggered'] = 0 + if not 'counter_diff_imu_wheel_yaw_speed_triggered' in roverdata.calced_from_stats.columns: + roverdata.calced_from_stats['counter_diff_imu_wheel_yaw_speed_triggered'] = 0 + if not 'counter_imu_no_rotation_triggered' in roverdata.calced_from_stats.columns: + roverdata.calced_from_stats['counter_imu_no_rotation_triggered'] = 0 + if not 'counter_rotation_timeout_triggered' in roverdata.calced_from_stats.columns: + roverdata.calced_from_stats['counter_rotation_timeout_triggered'] = 0 logger.info('Backend: Calced data from stats are loaded successfully') if roverdata.calced_from_stats.empty: logger.warning('calcedstats.pickle is empty, create a default data frame') @@ -185,6 +224,13 @@ def read(measure_file_paths) -> None: "reset_cause":{"0":0}, "temp_min":{"0":0}, "temp_max":{"0":0}, + "duration_mow_motor_recovery":{"0":0}, + "counter_lift_triggered":{"0":0}, + "counter_gps_no_speed_triggered":{"0":0}, + "counter_tof_triggered":{"0":0}, + "counter_diff_imu_wheel_yaw_speed_triggered":{"0":0}, + "counter_imu_no_rotation_triggered":{"0":0}, + "counter_rotation_timeout_triggered":{"0":0}, "timestamp":{"0":str(datetime.now())}} roverdata.calced_from_stats = pd.DataFrame(data=calced_from_stats) except: @@ -213,6 +259,13 @@ def read(measure_file_paths) -> None: "reset_cause":{"0":0}, "temp_min":{"0":0}, "temp_max":{"0":0}, + "duration_mow_motor_recovery":{"0":0}, + "counter_lift_triggered":{"0":0}, + "counter_gps_no_speed_triggered":{"0":0}, + "counter_tof_triggered":{"0":0}, + "counter_diff_imu_wheel_yaw_speed_triggered":{"0":0}, + "counter_imu_no_rotation_triggered":{"0":0}, + "counter_rotation_timeout_triggered":{"0":0}, "timestamp":{"0":str(datetime.now())}} roverdata.calced_from_stats = pd.DataFrame(data=calced_from_stats) diff --git a/CaSSAndRA/src/components/state/stats.py b/CaSSAndRA/src/components/state/stats.py index 2b23bd8..7b21447 100755 --- a/CaSSAndRA/src/components/state/stats.py +++ b/CaSSAndRA/src/components/state/stats.py @@ -46,23 +46,62 @@ html.P('bumper', style={"margin-bottom":"0.25rem"}), html.Small(id="counter_bumper_triggered_range") ]), + dbc.ListGroupItem([ + html.P('lift', style={"margin-bottom":"0.25rem"}), + html.Small(id="counter_lift_triggered_range") + ]), + dbc.ListGroupItem([ + html.P('sonar', style={"margin-bottom":"0.25rem"}), + html.Small(id="counter_sonar_triggered_range") + ]), + dbc.ListGroupItem([ + html.P('tof', style={"margin-bottom":"0.25rem"}), + html.Small(id="counter_tof_triggered_range") + ]), + dbc.ListGroupItem([ + html.P('timeout', style={"margin-bottom":"0.25rem"}), + html.Small(id="counter_rotation_timeout_triggered_range") + ]), + ], + horizontal=True, + className="mb-2", + style={"justify-content":"", "margin-left":"1rem", "margin-right":"1rem", "flex-shrink":"1"}, + ), + dbc.ListGroup( + [ dbc.ListGroupItem([ html.P('imu', style={"margin-bottom":"0.25rem"}), html.Small(id="counter_imu_triggered_range") ]), + dbc.ListGroupItem([ + html.P('imu yaw speed', style={"margin-bottom":"0.25rem"}), + html.Small(id="counter_diff_imu_wheel_yaw_speed_triggered_range") + ]), + dbc.ListGroupItem([ + html.P('imu rotation', style={"margin-bottom":"0.25rem"}), + html.Small(id="counter_imu_no_rotation_triggered_range") + ]), + ], + horizontal=True, + className="mb-2", + style={"justify-content":"", "margin-left":"1rem", "margin-right":"1rem", "flex-shrink":"1"}, + ), + dbc.ListGroup( + [ dbc.ListGroupItem([ html.P('gps', style={"margin-bottom":"0.25rem"}), html.Small(id="counter_gps_motion_timeout_range") ]), dbc.ListGroupItem([ - html.P('sonar', style={"margin-bottom":"0.25rem"}), - html.Small(id="counter_sonar_triggered_range") + html.P('gps no speed', style={"margin-bottom":"0.25rem"}), + html.Small(id="counter_gps_no_speed_triggered_range") ]), ], horizontal=True, className="mb-2", style={"justify-content":"", "margin-left":"1rem", "margin-right":"1rem", "flex-shrink":"1"}, ), + dbc.Label('Recoveries', style={"margin-top":"0.5rem", "padding":"0", "margin-left":"1.5rem", "margin-bottom":"0.25rem"}), dbc.ListGroup( [ @@ -120,6 +159,12 @@ Output("counter_gps_jumps_range", 'children'), Output("counter_gps_chk", 'children'), Output("time_max_dgps_age_range", 'children'), + Output("counter_lift_triggered_range", 'children'), + Output("counter_tof_triggered_range", 'children'), + Output("counter_rotation_timeout_triggered_range", 'children'), + Output("counter_diff_imu_wheel_yaw_speed_triggered_range", 'children'), + Output("counter_imu_no_rotation_triggered_range", 'children'), + Output("counter_gps_no_speed_triggered_range", 'children'), ], [ #Input(ids.INTERVAL, 'n_intervals'), @@ -170,16 +215,26 @@ def update_stats(#n_intervals: int, counter_float_recoveries_range = int(calced_stats_filtered['counter_float_recoveries'].sum()) mow_traveled_range = round(calced_stats_filtered['distance_mow_traveled'].sum()/1000, 2) time_max_dgps_age_range = round(stats_filtered['time_max_dpgs_age'].max(), 2) - counter_imu_triggered_range = int(calced_stats_filtered['counter_imu_triggered'].sum()) counter_gps_chk_sum_errors_range = int(calced_stats_filtered['counter_gps_chk_sum_errors'].sum()) counter_dgps_chk_sum_errors_range = int(calced_stats_filtered['counter_dgps_chk_sum_errors'].sum()) time_max_cycle_range = round(stats_filtered['time_max_cycle'].max(), 2) counter_invalid_recoveries_range = int(calced_stats_filtered['counter_invalid_recoveries'].sum()) - counter_obstacles_range = int(calced_stats_filtered['counter_obstacles'].sum()) counter_gps_jumps_range = int(calced_stats_filtered['counter_gps_jumps'].sum()) - counter_sonar_triggered_range = int(calced_stats_filtered['counter_sonar_triggered'].sum()) + + #Obstacles + counter_obstacles_range = int(calced_stats_filtered['counter_obstacles'].sum()) counter_bumper_triggered_range = int(calced_stats_filtered['counter_bumper_triggered'].sum()) - counter_gps_motion_timeout_range = int(calced_stats_filtered['counter_gps_motion_timeout'].sum()) - + counter_lift_triggered_range = int(calced_stats_filtered['counter_lift_triggered'].sum()) + counter_sonar_triggered_range = int(calced_stats_filtered['counter_sonar_triggered'].sum()) + counter_tof_triggered_range = int(calced_stats_filtered['counter_tof_triggered'].sum()) + counter_rotation_timeout_triggered_range= int(calced_stats_filtered['counter_rotation_timeout_triggered'].sum()) + counter_imu_triggered_range = int(calced_stats_filtered['counter_imu_triggered'].sum()) + counter_diff_imu_wheel_yaw_speed_triggered_range = int(calced_stats_filtered['counter_diff_imu_wheel_yaw_speed_triggered'].sum()) + counter_imu_no_rotation_triggered_range = int(calced_stats_filtered['counter_imu_no_rotation_triggered'].sum()) + counter_gps_motion_timeout_range = int(calced_stats_filtered['counter_gps_motion_timeout'].sum()) + counter_gps_no_speed_triggered_range = int(calced_stats_filtered['counter_gps_no_speed_triggered'].sum()) + + return f'{mow_traveled_range} km', counter_obstacles_range, f'{time_max_cycle_range} s', counter_bumper_triggered_range, counter_imu_triggered_range, counter_gps_motion_timeout_range, counter_sonar_triggered_range, \ - counter_invalid_recoveries_range, counter_float_recoveries_range, counter_gps_jumps_range, f'{counter_gps_chk_sum_errors_range} gps / {counter_dgps_chk_sum_errors_range} dgps',f'{time_max_dgps_age_range} s' + counter_invalid_recoveries_range, counter_float_recoveries_range, counter_gps_jumps_range, f'{counter_gps_chk_sum_errors_range} gps / {counter_dgps_chk_sum_errors_range} dgps',f'{time_max_dgps_age_range} s', \ + counter_lift_triggered_range, counter_tof_triggered_range, counter_rotation_timeout_triggered_range, counter_diff_imu_wheel_yaw_speed_triggered_range, counter_imu_no_rotation_triggered_range, counter_gps_no_speed_triggered_range