Ejemplo n.º 1
0
    def calc_high_freq_delta_velocity_statistics(
            self, imu_metrics: dict, estimator_status_data: dict) -> None:
        """
        calculates the statistics for the high frequency delta velocity metric
        :param estimator_status_data:
        :return:
        """
        # max high frequency delta velocity
        imu_high_freq_delta_velocity_max = self.add_statistic(
            CheckStatisticType.IMU_HIGH_FREQ_DELTA_VELOCITY_MAX,
            statistic_instance=0)
        imu_high_freq_delta_velocity_max.value = float(
            calculate_stat_from_signal(
                estimator_status_data,
                "estimator_status",
                "vibe[2]",
                self._in_air_detector_no_ground_effects,
                np.amax,
            ))
        imu_high_freq_delta_velocity_max.thresholds.warning = (
            thresholds.imu_high_freq_delta_velocity_warning_max())

        # avg high frequency delta velocity
        imu_high_freq_delta_velocity_avg = self.add_statistic(
            CheckStatisticType.IMU_HIGH_FREQ_DELTA_VELOCITY_AVG,
            statistic_instance=0)
        imu_high_freq_delta_velocity_avg.value = float(0.0)

        if imu_high_freq_delta_velocity_max.value > 0.0:
            imu_high_freq_delta_velocity_avg.value = float(
                calculate_stat_from_signal(
                    estimator_status_data,
                    "estimator_status",
                    "vibe[2]",
                    self._in_air_detector_no_ground_effects,
                    np.mean,
                ))

        # windowed avg high frequency delta velocity
        imu_high_freq_delta_velocity_windowed_avg = self.add_statistic(
            CheckStatisticType.IMU_HIGH_FREQ_DELTA_VELOCITY_WINDOWED_AVG,
            statistic_instance=0,
        )
        imu_high_freq_delta_velocity_windowed_avg.value = float(
            max([
                np.max(signal)
                for _, signal in imu_metrics["imu_hfdvel_windowed_mean"]
            ]))
        imu_high_freq_delta_velocity_windowed_avg.thresholds.warning = (
            thresholds.imu_high_freq_delta_velocity_warning_rolling_avg())
    def calc_innovation_statistics(self) -> None:
        """
        :return:
        """
        innovation_metrics = self.calc_innovation_metrics()

        for i, innov_fail_name in enumerate(self._innov_fail_names):
            innov_stats_fail_pct = self.add_statistic(
                CheckStatisticType.FAIL_RATIO_PCT, statistic_instance=i)

            innov_stats_fail_pct.value = float(
                calculate_stat_from_signal(
                    self._innov_flags, 'estimator_status', innov_fail_name,
                    self._in_air_detector_no_ground_effects,
                    lambda x: 100.0 * np.mean(x > 0.5)))
            innov_stats_fail_pct.thresholds.failure = thresholds.ecl_innovation_failure_pct(
                self._check_id)

            innov_stats_fail_windowed_pct = self.add_statistic(
                CheckStatisticType.FAIL_RATIO_WINDOWED_PCT,
                statistic_instance=i)

            innov_stats_fail_windowed_pct.value = float(
                max([
                    np.max(metric) for _, metric in innovation_metrics[
                        '{:s}_windowed_mean'.format(innov_fail_name)]
                ]))
Ejemplo n.º 3
0
    def calc_coning_statistics(self, imu_metrics: dict,
                               estimator_status_data: dict) -> None:
        """
        calculates the statistics for the coning metric
        :param estimator_status_data:
        :return:
        """
        # max coning
        imu_coning_max = self.add_statistic(CheckStatisticType.IMU_CONING_MAX,
                                            statistic_instance=0)
        imu_coning_max.value = float(
            calculate_stat_from_signal(
                estimator_status_data,
                "estimator_status",
                "vibe[0]",
                self._in_air_detector_no_ground_effects,
                np.amax,
            ))
        imu_coning_max.thresholds.warning = thresholds.imu_coning_warning_max()

        # avg coning
        imu_coning_avg = self.add_statistic(CheckStatisticType.IMU_CONING_AVG,
                                            statistic_instance=0)
        imu_coning_avg.value = float(0.0)

        if imu_coning_max.value > 0.0:
            imu_coning_avg.value = float(
                calculate_stat_from_signal(
                    estimator_status_data,
                    "estimator_status",
                    "vibe[0]",
                    self._in_air_detector_no_ground_effects,
                    np.mean,
                ))

        # windowed avg coning
        imu_coning_windowed_avg = self.add_statistic(
            CheckStatisticType.IMU_CONING_WINDOWED_AVG, statistic_instance=0)
        imu_coning_windowed_avg.value = float(
            max([
                np.max(signal)
                for _, signal in imu_metrics["imu_coning_windowed_mean"]
            ]))
        imu_coning_windowed_avg.thresholds.warning = (
            thresholds.imu_coning_warning_rolling_avg())
Ejemplo n.º 4
0
    def calc_high_freq_delta_angle_statistics(
            self, imu_metrics: dict, estimator_status_data: dict) -> None:
        """
        calculates the statistics for the high frequency delta angle metric
        :param estimator_status_data:
        :return:
        """
        # max high frequency delta angle
        imu_high_freq_delta_angle_max = self.add_statistic(
            CheckStatisticType.IMU_HIGH_FREQ_DELTA_ANGLE_MAX)
        imu_high_freq_delta_angle_max.value = float(
            calculate_stat_from_signal(estimator_status_data,
                                       'estimator_status', 'vibe[1]',
                                       self._in_air_detector_no_ground_effects,
                                       np.amax))
        imu_high_freq_delta_angle_max.thresholds.warning = \
            thresholds.imu_high_freq_delta_angle_warning_max()

        # avg high frequency delta angle
        imu_high_freq_delta_angle_avg = self.add_statistic(
            CheckStatisticType.IMU_HIGH_FREQ_DELTA_ANGLE_AVG)
        imu_high_freq_delta_angle_avg.value = float(0.0)

        if imu_high_freq_delta_angle_max.value > 0.0:
            imu_high_freq_delta_angle_avg.value = float(
                calculate_stat_from_signal(
                    estimator_status_data, 'estimator_status', 'vibe[1]',
                    self._in_air_detector_no_ground_effects, np.mean))
        imu_high_freq_delta_angle_avg.thresholds.warning = \
            thresholds.imu_high_freq_delta_angle_warning_avg()

        # windowed avg high frequency delta angle
        imu_high_freq_delta_angle_windowed_avg = self.add_statistic(
            CheckStatisticType.IMU_HIGH_FREQ_DELTA_ANGLE_WINDOWED_AVG)
        imu_high_freq_delta_angle_windowed_avg.value = float(
            max([
                np.max(signal)
                for _, signal in imu_metrics['imu_hfdang_windowed_mean']
            ]))
    def calc_estimator_statistics(self) -> None:
        """
        :return:
        """

        if self._test_ratio_name is None:
            return

        estimator_status_data = self.ulog.get_dataset('estimator_status').data
        estimator_status_metrics = self.calc_estimator_status_metrics()

        innov_red_pct = self.add_statistic(
            CheckStatisticType.INNOVATION_RED_PCT, statistic_instance=0)
        innov_red_pct.value = float(
            calculate_stat_from_signal(
                estimator_status_data, 'estimator_status',
                self._test_ratio_name, self._in_air_detector,
                lambda x: 100.0 * np.mean(x > params.ecl_red_thresh())))

        #TODO: remove subtraction of innov_red_pct and tune parameters
        innov_amber_pct = self.add_statistic(
            CheckStatisticType.INNOVATION_AMBER_PCT, statistic_instance=0)
        innov_amber_pct.value = float(
            calculate_stat_from_signal(
                estimator_status_data, 'estimator_status',
                self._test_ratio_name, self._in_air_detector, lambda x: 100.0 *
                np.mean(x > params.ecl_amb_thresh()))) - innov_red_pct.value
        innov_amber_pct.thresholds.warning = thresholds.ecl_amber_warning_pct(
            self._check_id)
        innov_amber_pct.thresholds.failure = thresholds.ecl_amber_failure_pct(
            self._check_id)

        innov_red_windowed_pct = self.add_statistic(
            CheckStatisticType.INNOVATION_RED_WINDOWED_PCT,
            statistic_instance=0)
        innov_red_windowed_pct.value = float(
            max([
                np.max(metric) for _, metric in estimator_status_metrics[
                    '{:s}_percentage_red_windowed'.format(self._check_id)]
            ]))

        innov_amber_windowed_pct = self.add_statistic(
            CheckStatisticType.INNOVATION_AMBER_WINDOWED_PCT,
            statistic_instance=0)
        innov_amber_windowed_pct.value = float(
            max([
                np.max(metric) for _, metric in estimator_status_metrics[
                    '{:s}_percentage_amber_windowed'.format(self._check_id)]
            ]))

        # the max and mean ratio of samples above / below std dev
        test_ratio_max = self.add_statistic(
            CheckStatisticType.ESTIMATOR_FAILURE_MAX, statistic_instance=0)
        test_ratio_max.value = float(
            calculate_stat_from_signal(estimator_status_data,
                                       'estimator_status',
                                       self._test_ratio_name,
                                       self._in_air_detector, np.amax))

        test_ratio_avg = self.add_statistic(
            CheckStatisticType.ESTIMATOR_FAILURE_AVG, statistic_instance=0)
        test_ratio_avg.value = float(0.0)

        if test_ratio_max.value > 0.0:
            test_ratio_avg.value = float(
                calculate_stat_from_signal(estimator_status_data,
                                           'estimator_status',
                                           self._test_ratio_name,
                                           self._in_air_detector, np.mean))

        test_ratio_windowed_avg = self.add_statistic(
            CheckStatisticType.ESTIMATOR_FAILURE_WINDOWED_AVG,
            statistic_instance=0)

        test_ratio_windowed_avg.value = float(
            max([
                float(np.mean(metric))
                for _, metric in estimator_status_metrics[
                    '{:s}_test_windowed_mean'.format(self._check_id)]
            ]))
Ejemplo n.º 6
0
    def calc_statistics(self) -> None:
        """
        :return:
        """
        imu_metrics = self.calculate_metrics()
        estimator_states_data = self.ulog.get_dataset(
            self._estimator_states_msg).data

        # summarize biases from all six possible states
        imu_state_metrics = dict()
        for signal in [
                "states[10]",
                "states[11]",
                "states[12]",
                "states[13]",
                "states[14]",
                "states[15]",
        ]:
            imu_state_metrics["{:s}_windowed_mean".format(signal)] = float(
                max([
                    np.max(phase) for _, phase in imu_metrics[
                        "{:s}_windowed_mean".format(signal)]
                ]))

        # delta angle bias windowed
        imu_delta_angle_bias_avg = self.add_statistic(
            CheckStatisticType.IMU_DELTA_ANGLE_BIAS_AVG, statistic_instance=0)

        imu_delta_angle_bias_avg.value = float(
            np.sqrt(
                np.sum([
                    np.square(
                        calculate_stat_from_signal(
                            estimator_states_data,
                            self._estimator_states_msg,
                            signal,
                            self._in_air_detector_no_ground_effects,
                            np.median,
                        ))
                    for signal in ["states[10]", "states[11]", "states[12]"]
                ])))
        imu_delta_angle_bias_avg.thresholds.warning = (
            thresholds.imu_delta_angle_bias_warning_avg())

        # delta angle bias windowed
        imu_delta_angle_bias_windowed_avg = self.add_statistic(
            CheckStatisticType.IMU_DELTA_ANGLE_BIAS_WINDOWED_AVG,
            statistic_instance=0)

        imu_delta_angle_bias_windowed_avg.value = float(
            np.sqrt(
                np.sum([
                    np.square(imu_state_metrics[signal]) for signal in [
                        "states[10]_windowed_mean",
                        "states[11]_windowed_mean",
                        "states[12]_windowed_mean",
                    ]
                ])))

        # delta velocity bias
        imu_delta_velocity_bias_avg = self.add_statistic(
            CheckStatisticType.IMU_DELTA_VELOCITY_BIAS_AVG,
            statistic_instance=0)

        imu_delta_velocity_bias_avg.value = float(
            np.sqrt(
                np.sum([
                    np.square(
                        calculate_stat_from_signal(
                            estimator_states_data,
                            self._estimator_states_msg,
                            signal,
                            self._in_air_detector_no_ground_effects,
                            np.median,
                        ))
                    for signal in ["states[13]", "states[14]", "states[15]"]
                ])))
        imu_delta_velocity_bias_avg.thresholds.warning = (
            thresholds.imu_delta_velocity_bias_warning_avg())

        # delta velocity bias windowed
        imu_delta_velocity_bias_windowed_avg = self.add_statistic(
            CheckStatisticType.IMU_DELTA_VELOCITY_BIAS_WINDOWED_AVG,
            statistic_instance=0,
        )

        imu_delta_velocity_bias_windowed_avg.value = float(
            np.sqrt(
                np.sum([
                    np.square(imu_state_metrics[signal]) for signal in [
                        "states[13]_windowed_mean",
                        "states[14]_windowed_mean",
                        "states[15]_windowed_mean",
                    ]
                ])))
Ejemplo n.º 7
0
    def calc_statistics(self) -> None:
        """
        :return:
        """
        imu_metrics = self.calculate_metrics()

        output_tracking_error_msg = get_output_tracking_error_message(
            self.ulog)
        output_tracking_error_data = self.ulog.get_dataset(
            output_tracking_error_msg).data

        # observed angle error statistic average
        imu_observed_angle_error_avg = self.add_statistic(
            CheckStatisticType.IMU_OBSERVED_ANGLE_ERROR_AVG,
            statistic_instance=0)
        imu_observed_angle_error_avg.value = float(
            calculate_stat_from_signal(
                output_tracking_error_data,
                output_tracking_error_msg,
                "output_tracking_error[0]",
                self._in_air_detector_no_ground_effects,
                np.median,
            ))
        imu_observed_angle_error_avg.thresholds.warning = (
            thresholds.imu_observed_angle_error_warning_avg())

        # observed angle error statistic average windowed
        imu_observed_angle_error_windowed_avg = self.add_statistic(
            CheckStatisticType.IMU_OBSERVED_ANGLE_ERROR_WINDOWED_AVG,
            statistic_instance=0,
        )

        imu_observed_angle_error_windowed_avg.value = float(
            max([
                metric.max() for _, metric in
                imu_metrics["output_obs_ang_err_median_windowed_mean"]
            ]))

        # observed velocity error statistic average
        imu_observed_velocity_error_avg = self.add_statistic(
            CheckStatisticType.IMU_OBSERVED_VELOCITY_ERROR_AVG,
            statistic_instance=0)
        imu_observed_velocity_error_avg.value = float(
            calculate_stat_from_signal(
                output_tracking_error_data,
                output_tracking_error_msg,
                "output_tracking_error[1]",
                self._in_air_detector_no_ground_effects,
                np.median,
            ))
        imu_observed_velocity_error_avg.thresholds.warning = (
            thresholds.imu_observed_velocity_error_warning_avg())

        # observed velocity error statistic average windowed
        imu_observed_velocity_error_windowed_avg = self.add_statistic(
            CheckStatisticType.IMU_OBSERVED_VELOCITY_ERROR_WINDOWED_AVG,
            statistic_instance=0,
        )

        imu_observed_velocity_error_windowed_avg.value = float(
            max([
                metric.max() for _, metric in
                imu_metrics["output_obs_vel_err_median_windowed_mean"]
            ]))

        # observed position error statistic average
        imu_observed_position_error_avg = self.add_statistic(
            CheckStatisticType.IMU_OBSERVED_POSITION_ERROR_AVG,
            statistic_instance=0)
        imu_observed_position_error_avg.value = float(
            calculate_stat_from_signal(
                output_tracking_error_data,
                output_tracking_error_msg,
                "output_tracking_error[2]",
                self._in_air_detector_no_ground_effects,
                np.median,
            ))
        imu_observed_position_error_avg.thresholds.warning = (
            thresholds.imu_observed_position_error_warning_avg())

        # observed position error statistic average windowed
        imu_observed_position_error_windowed_avg = self.add_statistic(
            CheckStatisticType.IMU_OBSERVED_POSITION_ERROR_WINDOWED_AVG,
            statistic_instance=0,
        )

        imu_observed_position_error_windowed_avg.value = float(
            max([
                metric.max() for _, metric in
                imu_metrics["output_obs_pos_err_median_windowed_mean"]
            ]))