From 77e483c1ef1dac857b0de3895ea02dfa62588fba Mon Sep 17 00:00:00 2001 From: kaatr Date: Mon, 7 Jul 2025 14:20:58 +0300 Subject: [PATCH 1/3] Use symlog instead of log axis (to avoid hiding values near 0) --- python/cli/diagnose/sensors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/cli/diagnose/sensors.py b/python/cli/diagnose/sensors.py index b536e64..eb4b27a 100644 --- a/python/cli/diagnose/sensors.py +++ b/python/cli/diagnose/sensors.py @@ -152,7 +152,7 @@ def toPercent(value): plottype="scatter", xLabel="Time (s)", yLabel="Time diff (ms)", - yScale="log" if dataGaps > 0 else None, + yScale="symlog" if dataGaps > 0 else None, s=10, **plotArgs)) From 65f0c5e34da0a8c657f954cfcea518e954e0f283 Mon Sep 17 00:00:00 2001 From: kaatr Date: Mon, 7 Jul 2025 15:15:30 +0300 Subject: [PATCH 2/3] Add isOptionalSensor flag to timestamp check --- python/cli/diagnose/sensors.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/python/cli/diagnose/sensors.py b/python/cli/diagnose/sensors.py index eb4b27a..87f1522 100644 --- a/python/cli/diagnose/sensors.py +++ b/python/cli/diagnose/sensors.py @@ -103,7 +103,8 @@ def analyzeTimestamps( minFrequencyHz, maxFrequencyHz, plotArgs, - allowDataGaps=False): + allowDataGaps=False, + isOptionalSensor=False): WARNING_RELATIVE_DELTA_TIME = 0.2 DATA_GAP_RELATIVE_DELTA_TIME = 10 MIN_DATA_GAP_SECONDS = 0.25 @@ -168,7 +169,7 @@ def toPercent(value): ) if dataGaps > 0 and not allowDataGaps: - self.__addIssue(DiagnosisLevel.ERROR, + self.__addIssue(DiagnosisLevel.WARNING if isOptionalSensor else DiagnosisLevel.ERROR, f"Found {dataGaps} gaps in the data longer than {SECONDS_TO_MILLISECONDS*thresholdDataGap:.1f}ms.") if badDeltaTimes > MAX_BAD_DELTA_TIME_RATIO * total and not allowDataGaps: @@ -180,12 +181,12 @@ def toPercent(value): frequency = 1.0 / medianDeltaTime if minFrequencyHz is not None and frequency < minFrequencyHz: - self.__addIssue(DiagnosisLevel.ERROR, + self.__addIssue(DiagnosisLevel.WARNING if isOptionalSensor else DiagnosisLevel.ERROR, f"Minimum required frequency is {minFrequencyHz:.1f}Hz but data is {frequency:.1f}Hz" ) if maxFrequencyHz is not None and frequency > maxFrequencyHz: - self.__addIssue(DiagnosisLevel.ERROR, + self.__addIssue(DiagnosisLevel.WARNING if isOptionalSensor else DiagnosisLevel.ERROR, f"Maximum allowed frequency is {maxFrequencyHz:.1f}Hz but data is {frequency:.1f}Hz" ) @@ -572,7 +573,8 @@ def diagnoseMagnetometer(data, output): MAGN_MAX_FREQUENCY_HZ, plotArgs={ "title": "Magnetometer time diff" - }) + }, + isOptionalSensor=True) status.analyzeSignalDuplicateValues(signal) status.analyzeSignalUnit( signal, @@ -622,7 +624,8 @@ def diagnoseBarometer(data, output): BARO_MAX_FREQUENCY_HZ, plotArgs={ "title": "Barometer time diff" - }) + }, + isOptionalSensor=True) status.analyzeSignalDuplicateValues(signal, BARO_DUPLICATE_VALUE_THRESHOLD) status.analyzeSignalUnit( signal, @@ -670,7 +673,8 @@ def diagnoseGps(data, output): plotArgs={ "title": "GPS time diff" }, - allowDataGaps=True) + allowDataGaps=True, + isOptionalSensor=True) status.analyzeSignalDuplicateValues(signal) output["gps"] = { From 9fa43e8cade29b3b60aa3f11c875968859be98b2 Mon Sep 17 00:00:00 2001 From: kaatr Date: Mon, 7 Jul 2025 15:20:06 +0300 Subject: [PATCH 3/3] Simplify IMU noise check --- python/cli/diagnose/sensors.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/python/cli/diagnose/sensors.py b/python/cli/diagnose/sensors.py index 87f1522..0f1e347 100644 --- a/python/cli/diagnose/sensors.py +++ b/python/cli/diagnose/sensors.py @@ -234,16 +234,15 @@ def analyzeSignalNoise( signal, timestamps, samplingRate, - cutoffFrequency, noiseThreshold, sensorName, measurementUnit): WINDOW_SIZE_SECONDS = 1.0 count = np.shape(timestamps)[0] windowSize = int(WINDOW_SIZE_SECONDS * samplingRate) + cutoffFrequency = samplingRate / 4.0 if windowSize <= 0: return if count < windowSize: return - if cutoffFrequency >= 2.0 * samplingRate: return def highpass(signal, fs, cutoff, order=3): from scipy.signal import butter, filtfilt @@ -429,7 +428,6 @@ def diagnoseAccelerometer(data, output): ACC_MIN_FREQUENCY_HZ = 50.0 ACC_MAX_FREQUENCY_HZ = 1e4 ACC_NOISE_THRESHOLD = 2.5 # m/s² - ACC_CUTOFF_FREQUENCY_HZ = 50.0 ACC_UNIT_CHECK_THRESHOLD = 200.0 # m/s² sensor = data["accelerometer"] @@ -448,7 +446,6 @@ def diagnoseAccelerometer(data, output): return samplingRate = computeSamplingRate(deltaTimes) - cutoffThreshold = min(samplingRate / 4.0, ACC_CUTOFF_FREQUENCY_HZ) status = Status() status.analyzeTimestamps( @@ -471,7 +468,6 @@ def diagnoseAccelerometer(data, output): signal, timestamps, samplingRate, - cutoffThreshold, ACC_NOISE_THRESHOLD, sensorName="Accelerometer", measurementUnit="m/s²")