Home | History | Annotate | Download | only in common_data
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*
     18  * This module provides the component definitions used to represent sensor
     19  * calibration data, labeled flags/enumerators, and the callback functionality
     20  * employed by the online sensor calibration algorithms.
     21  */
     22 
     23 #ifndef LOCATION_LBS_CONTEXTHUB_NANOAPPS_CALIBRATION_ONLINE_CALIBRATION_COMMON_DATA_CALIBRATION_DATA_H_
     24 #define LOCATION_LBS_CONTEXTHUB_NANOAPPS_CALIBRATION_ONLINE_CALIBRATION_COMMON_DATA_CALIBRATION_DATA_H_
     25 
     26 #include <stdint.h>
     27 #include <string.h>
     28 #include <sys/types.h>
     29 
     30 #include "calibration/online_calibration/common_data/calibration_quality.h"
     31 #include "calibration/online_calibration/common_data/sensor_data.h"
     32 #include "calibration/over_temp/over_temp_model.h"
     33 
     34 namespace online_calibration {
     35 
     36 /*
     37  * Bitmask used to indicate which calibration values have changed for a given
     38  * calibration update.
     39  *
     40  * [Bit Flag]   | [Affected Sensor Calibration Value]
     41  * BIAS             - Quasi-static non-zero sensor output (offset), given
     42  *                    conditions where the sensor should ideally output zero.
     43  *                    Includes corrections for over-temperature compensation.
     44  * SCALE_FACTOR     - Sensor axis scaling (ideally unity).
     45  * CROSS_AXIS       - Output sensitivity due to variations of perpendicular
     46  *                    sensing axes (ideally zero).
     47  * OVER_TEMP        - Model parameters that capture variations in sensor
     48  *                    behavior with temperature (e.g., linear bias sensitivity
     49  *                    model).
     50  * QUALITY_DEGRADED - Indicates a degradation in calibration quality.
     51  */
     52 enum class CalibrationTypeFlags : uint8_t {
     53   NONE = 0x00,
     54   BIAS = 0x01,
     55   SCALE_FACTOR = 0x02,
     56   CROSS_AXIS = 0x04,
     57   OVER_TEMP = 0x08,
     58   QUALITY_DEGRADED = 0x10,
     59   ALL = 0xFF
     60 };
     61 
     62 // Logic operators to assist with common bitmask setting/checking.
     63 CalibrationTypeFlags operator|(CalibrationTypeFlags lhs,
     64                                CalibrationTypeFlags rhs);
     65 
     66 bool operator&(CalibrationTypeFlags lhs, CalibrationTypeFlags rhs);
     67 
     68 CalibrationTypeFlags& operator|=(CalibrationTypeFlags& lhs,
     69                                  CalibrationTypeFlags rhs);
     70 
     71 /*
     72  * Defines the calibration data specific to a prototypical three-axis sensing
     73  * device (e.g., accelerometer, gyroscope, magnetometer).
     74  *
     75  * Calibration correction may be applied as:
     76  *   corrected_data = scale_skew_matrix * (input_data - offset);
     77  *
     78  * 'offset' is the sensor bias estimate (with temperature compensation applied
     79  * when supported by the underlying calibration algorithm).
     80  *
     81  * The 'scale_skew_matrix' is assumed to be in lower diagonal form where the
     82  * sensor frame reference definition is such that cross-axis sensitivities
     83  * cross_axis_xy, cross_axis_xz, and cross_axis_yz are set to zero.
     84  *
     85  *   scale_skew_matrix = [scale_factor_x    0                 0
     86  *                        cross_axis_yx     scale_factor_y    0
     87  *                        cross_axis_zx     cross_axis_zy     scale_factor_z]
     88  *
     89  * NOTE1: If over-temperature compensation is provided, then temperature
     90  * compensation is already applied to the 'offset'. Coefficients representative
     91  * of the sensor's temperature dependency model are provided, and may be used
     92  * for model initialization after a system restart.
     93  *
     94  *   temp_sensitivity - Modeled temperature sensitivity (i.e., linear slope).
     95  *   temp_intercept   - Linear model intercept.
     96  *
     97  * The model equation for the over-temperature compensated offset:
     98  *   compensated_offset = temp_sensitivity * current_temp + temp_intercept
     99  *
    100  * NOTE2: Unless otherwise stated, 3-dimensional array indices: 0=x, 1=y, 2=z.
    101  */
    102 struct CalibrationDataThreeAxis {
    103   // Timestamp for the most recent calibration update.
    104   uint64_t cal_update_time_nanos = 0;
    105 
    106   // The sensor's offset (i.e., bias) in the x-, y-, z-axes at
    107   // 'offset_temp_celsius'.
    108   float offset[3];
    109 
    110   // The temperature associated with the sensor offset.
    111   float offset_temp_celsius;
    112 
    113   // The temperature sensitivity of the offset.
    114   float temp_sensitivity[3];  // [sensor_units/Celsius]
    115 
    116   // The sensor's offset at zero degrees Celsius.
    117   float temp_intercept[3];  // [sensor_units]
    118 
    119   // The sensor's scale factor for each axis.
    120   float scale_factor[3];
    121 
    122   // The cross-axis factors in order: [0=yx, 1=zx, 2=zy].
    123   float cross_axis[3];
    124 
    125   // Metrics used for the reported calibration accuracy. The behavior and
    126   // definition depends on the sensor calibration type. See the calibration
    127   // algorithm documentation for details.
    128   CalibrationQuality calibration_quality;
    129 
    130   // Indicates the type of sensing device being calibrated.
    131   SensorType type = SensorType::kUndefined;
    132 
    133   // Optional pointer to an array of over-temperature model data (null when not
    134   // used). For initialization, populating a model dataset will take precedence
    135   // over the linear model parameters provided in the calibration data.
    136   OverTempModelThreeAxis* otc_model_data = nullptr;
    137   int16_t num_model_pts = 0;
    138 
    139   // Helper function that resets the calibration data to a set of neutral
    140   // reference values where no calibration correction would be applied if used.
    141   void reset() {
    142     otc_model_data = nullptr;
    143     calibration_quality.reset();
    144     offset_temp_celsius = 0.0f;
    145     scale_factor[0] = 1.0f;
    146     scale_factor[1] = 1.0f;
    147     scale_factor[2] = 1.0f;
    148     memset(offset, 0, sizeof(offset));
    149     memset(temp_sensitivity, 0, sizeof(temp_sensitivity));
    150     memset(temp_intercept, 0, sizeof(temp_intercept));
    151     memset(cross_axis, 0, sizeof(cross_axis));
    152   }
    153 
    154   CalibrationDataThreeAxis() { reset(); }
    155 };
    156 
    157 /*
    158  * Defines the calibration data for single dimensional sensing device (e.g.,
    159  * thermometer, barometer).
    160  *
    161  * Calibration correction may be applied as:
    162  *   corrected_data = scale_factor * (input_data - offset);
    163  *
    164  * 'offset' is the sensor bias estimate (with temperature compensation applied,
    165  * if supported by the underlying calibration algorithm).
    166  *
    167  * NOTE: If over-temperature compensation is provided, then temperature
    168  * compensation is already applied to the 'offset'. Coefficients representative
    169  * of the sensor's temperature dependency model are provided, and may be used
    170  * for model initialization after a system restart.
    171  *
    172  *   temp_sensitivity - Modeled temperature sensitivity (i.e., linear slope).
    173  *   temp_intercept   - Linear model intercept.
    174  *
    175  * The model equation for the over-temperature compensated offset:
    176  *   compensated_offset = temp_sensitivity * current_temp + temp_intercept
    177  */
    178 struct CalibrationDataSingleAxis {
    179   // Timestamp for the most recent calibration update.
    180   uint64_t cal_update_time_nanos = 0;
    181 
    182   // The sensor's offset (i.e., bias) at temperature, 'offset_temp_celsius'.
    183   float offset;
    184 
    185   // The temperature associated with the sensor offset.
    186   float offset_temp_celsius;
    187 
    188   // The temperature sensitivity of the offset.
    189   float temp_sensitivity;  // [sensor_units/Celsius]
    190 
    191   // The sensor's offset at zero degrees Celsius.
    192   float temp_intercept;  // [sensor_units]
    193 
    194   // The sensor's scale factor.
    195   float scale_factor;
    196 
    197   // Metrics used for the reported calibration accuracy. The behavior and
    198   // definition depends on the sensor calibration type. See the calibration
    199   // algorithm documentation for details.
    200   CalibrationQuality calibration_quality;
    201 
    202   // Indicates the type of sensing device being calibrated.
    203   SensorType type = SensorType::kUndefined;
    204 
    205   // Optional pointer to an array of over-temperature model data (null when not
    206   // used). For initialization, populating a model dataset will take precedence
    207   // over the linear model parameters provided in the calibration data.
    208   OverTempModelSingleAxis* otc_model_data = nullptr;
    209   int16_t num_model_pts = 0;
    210 
    211   // Helper function that resets the calibration data to a set of neutral
    212   // reference values where no calibration correction would be applied if used.
    213   void reset() {
    214     otc_model_data = nullptr;
    215     calibration_quality.reset();
    216     scale_factor = 1.0f;
    217     offset_temp_celsius = 0.0f;
    218     offset = 0.0f;
    219     temp_sensitivity = 0.0f;
    220     temp_intercept = 0.0f;
    221   }
    222 
    223   CalibrationDataSingleAxis() { reset(); }
    224 };
    225 
    226 }  // namespace online_calibration
    227 
    228 #endif  // LOCATION_LBS_CONTEXTHUB_NANOAPPS_CALIBRATION_ONLINE_CALIBRATION_COMMON_DATA_CALIBRATION_DATA_H_
    229