1#ifndef ROBUST_CALIBRATION_FRAMEWORK_HPP
2#define ROBUST_CALIBRATION_FRAMEWORK_HPP
42 static constexpr int N = 9;
54 double adc_norm_scale);
136 const std::vector<CalibrationPoint>& points)
const;
139 const std::vector<CalibrationPoint>& new_points);
145 const std::vector<CalibrationPoint>& points)
const;
152 void bias_update(
double residual,
double sigma_meas,
double dt);
std::pair< double, bool > generalized_likelihood_ratio_test(const std::vector< CalibrationPoint > &points) const
std::pair< Eigen::VectorXd, Eigen::MatrixXd > bayesian_update(const std::vector< CalibrationPoint > &new_points)
double forgetting_factor_
Eigen::VectorXd theta_mean() const
Eigen::MatrixXd env_var_env_
double bias_variance() const
Eigen::MatrixXd rls_P_matrix() const
double last_bias_update_t_
std::deque< double > recent_uncertainties_
std::vector< CalibrationPoint > calibration_points_
Eigen::MatrixXd env_var_interaction_
Eigen::VectorXd environmental_basis(double adc_code, const EnvironmentalState &env) const
std::optional< NoiseCoefficients > noise_coeffs_
void seed_from_factory_cubic(const PTCalibrationCoeffs &c)
Seed θ by ridge LS so Φ·θ ≈ factory cubic P(adc) on an ADC grid (same env as streaming).
RobustCalibrationFramework(int sensor_id)
size_t calibration_points_count() const
std::deque< double > recent_residuals_
void bias_update(double residual, double sigma_meas, double dt)
Eigen::Vector3d bias_tau_
double bias_contribution() const
static constexpr size_t kCalibrationPointsMax
struct fsw::calibration::RobustCalibrationFramework::PhysicalParams physical_
double predict_pressure_psi(double adc_code)
Mean PSI for streaming (default env, used by calibration_service).
void set_theta_from_polynomial(const std::vector< double > &poly_coeffs, double adc_norm_min, double adc_norm_scale)
void set_theta_cov_for_restore(const Eigen::MatrixXd &cov)
std::pair< double, double > predict_pressure_with_uncertainty(double adc_code, const EnvironmentalState &env)
Mean + σ; updates bias propagation clock.
void set_rls_P_for_restore(const Eigen::MatrixXd &p)
void add_calibration_point(const CalibrationPoint &point)
Zero / capture / reference — full Python add_calibration_point logic.
double max_abs_error_vs_factory(const PTCalibrationCoeffs &factory_cubic) const
Max |Φ·θ − P_factory(adc)| over a dense ADC grid — sanity-check saved adjustments....
std::pair< Eigen::VectorXd, Eigen::MatrixXd > recursive_least_squares_update(const CalibrationPoint &point)
Eigen::VectorXd theta_mean_
std::chrono::steady_clock::time_point last_pred_time_
std::pair< Eigen::VectorXd, Eigen::MatrixXd > total_least_squares_calibration(const std::vector< CalibrationPoint > &points) const
void set_theta_mean_for_restore(const Eigen::VectorXd &t)
double compute_measurement_variance(double adc_code, double tau) const
Eigen::MatrixXd theta_cov() const
double extrapolation_variance(double adc_code) const
void bias_propagate(double dt)
Eigen::MatrixXd theta_cov_
double bias_process_noise_
void set_noise_coeffs(const NoiseCoefficients &c, double tau0=0.01)
double env_variance_base_
Output smoothing for calibrated PT pressure, per sensor uid (ESP32 and LabJack T7 alike).
Motorized ball valve position: raw ADC counts -> % open.
Environmental state [T, H, V, A, M] — scripts/calibration/robust_calibration.py.
Noise coefficients from Allan variance fit (scripts/calibration/allan_variance.py).
PT Calibration Coefficients.