mars_lib  0.1.0.3dc76ee85e09
Modular and Robust Sensor-Fusion
pressure_conversion.h
Go to the documentation of this file.
1 // Copyright (C) 2021-2023 Martin Scheiber, Alessandro Fornasier, Christian Brommer,
2 // Control of Networked Systems, University of Klagenfurt, Austria.
3 //
4 // All rights reserved.
5 //
6 // This software is licensed under the terms of the BSD-2-Clause-License with
7 // no commercial use allowed, the full terms of which are made available
8 // in the LICENSE file. No license in patents is granted.
9 //
10 // You can contact the authors at <christian.brommer@ieee.org>
11 // <alessandro.fornasier@ieee.org> and <martin.scheiber@ieee.org>.
12 
13 #ifndef PRESSURECONVERSION_H
14 #define PRESSURECONVERSION_H
15 
16 #include <Eigen/Dense>
17 #include <iostream>
18 
19 namespace mars
20 {
24 struct Pressure
25 {
29  enum class Type
30  {
31  LIQUID,
32  GAS,
33  HEIGHT
34  };
35  inline friend std::ostream& operator<<(std::ostream& out, const Type& type);
36 
40  Pressure() = default;
41 
49  Pressure(double pressure) : data_(pressure)
50  {
51  }
52 
60  Pressure(double pressure, double temperature, Type type) : data_(pressure), temperature_K_(temperature), type_(type)
61  {
62  }
63 
64  double data_{ 0 };
65  double temperature_K_{ 0 };
67 
68  friend std::ostream& operator<<(std::ostream& out, const Pressure& pressure);
69 
70  inline Pressure operator+(const Pressure& pressure)
71  {
72  return { data_ + pressure.data_, temperature_K_ + pressure.temperature_K_, type_ };
73  }
74 
75  inline void operator+=(const Pressure& pressure)
76  {
77  data_ += pressure.data_;
78  temperature_K_ += pressure.temperature_K_;
79  }
80 
81  inline void operator/=(const double& n)
82  {
83  if (n == 0)
84  {
85  throw std::overflow_error("Divide by zero exception");
86  }
87  data_ /= n;
88  temperature_K_ /= n;
89  }
90 };
91 
99 {
104  {
105  set_constants();
106  }
107 
117  MediumPressureOptions(double P_sl, double M, double r, double g) : g(g), P_sl(P_sl), M(M), r(r)
118  {
119  set_constants();
120  }
121 
129  MediumPressureOptions(double rho, double g) : g(g), rho(rho)
130  {
131  set_constants();
132  }
133 
134  // general constants
135  const double g{ 9.80665 };
136 
137  // gas constants
138  const double P_sl{ 101325 };
139  const double M{ 0.0289644 };
140  const double r{ 8.31432 };
141 
142  // liquid constants
143  const double rho{ 997 };
144 
145  // gas variables
146  double rOverMg;
147  double ln_Psl;
148  double ln_P0PslT;
149 
150  // liquid variables
151  double OneOverGRho;
152 
157  {
158  rOverMg = r / (M * g);
159  ln_Psl = std::log(P_sl);
160  OneOverGRho = 1.0 / (g * rho);
161  }
162 
169  {
170  ln_P0PslT = (std::log(p0.data_) - ln_Psl) * p0.temperature_K_;
171  }
172 
177  {
178  std::cout << "Medium Options:\n"
179  << "\tg: " << g << " m/s^2\n"
180  << "\tGas Options:\n"
181  << "\t P_sl: " << P_sl << " Pa\n"
182  << "\t M: " << M << " Kg*mol\n"
183  << "\t r: " << r << " Nm/mol*K\n"
184  << "\t rOverMg: " << rOverMg << " Nm s^2 / mol^2 Kg Km\n"
185  << "\t ln_Psl: " << ln_Psl << " log(Pa)\n"
186  << "\tLiquid Options:\n"
187  << "\t rho: " << rho << " Pa\n"
188  << "\t 1/gRho: " << OneOverGRho << " Pa\n"
189  << std::endl;
190  }
191 };
192 
194 {
195 public:
196  typedef Eigen::Matrix<double, 1, 1> Matrix1d;
197 
204  PressureConversion() = default;
205 
215 
225 
232 
240 
241 private:
244  bool reference_is_set_{ false };
245 
261  double get_height_liquid(const Pressure& pressure);
262 
283  double get_height_gas(const Pressure& pressure);
284 };
285 
286 } // namespace mars
287 
288 #endif // PRESSURECONVERSION_H
Definition: pressure_conversion.h:194
Pressure reference_
reference pressure for h=0
Definition: pressure_conversion.h:242
PressureConversion(Pressure pressure)
Detailed constructor to set also the pressure reference.
Definition: pressure_conversion.h:214
PressureConversion(Pressure pressure, MediumPressureOptions gas_options)
Detailed constructor to set the pressure reference and medium options.
void set_pressure_reference(Pressure pressure)
Setter function to set the reference pressure after construction of object.
double get_height_gas(const Pressure &pressure)
Converts the given pressure measurement to a height based.
Eigen::Matrix< double, 1, 1 > Matrix1d
Definition: pressure_conversion.h:196
double get_height_liquid(const Pressure &pressure)
Converts the given pressure measurement to a height based.
bool reference_is_set_
flag to determine if the reference_ has been set
Definition: pressure_conversion.h:244
PressureConversion()=default
Default constructor for creating a PressureConversion object.
Matrix1d get_height(Pressure pressure)
Converts the given pressure measurement to a height (distance) value.
MediumPressureOptions medium_options_
pressure medium (gas or liquid) options to use
Definition: pressure_conversion.h:243
Definition: buffer.h:27
The MediumPressureOptions struct contains all medium-related (gas, liquid, fluid, etc....
Definition: pressure_conversion.h:99
double rOverMg
(gas) = r/(M*g), for faster calculations
Definition: pressure_conversion.h:146
void set_constants()
Sets a couple of constants for faster calculations.
Definition: pressure_conversion.h:156
const double rho
(liquid) density of the medium [kg/m^3]
Definition: pressure_conversion.h:143
MediumPressureOptions(double P_sl, double M, double r, double g)
Detailted constructor for Pressure::Type::GAS constants.
Definition: pressure_conversion.h:117
double OneOverGRho
(liquid) = 1/(g*rho)
Definition: pressure_conversion.h:151
const double r
(gas) universal gas constant [Nm/mol*K]
Definition: pressure_conversion.h:140
double ln_Psl
(gas) = log(P_sl), log of the pressure at sealevel
Definition: pressure_conversion.h:147
void update_constants(Pressure p0)
Updates the constants related to the reference pressure P_0, where height = 0.
Definition: pressure_conversion.h:168
double ln_P0PslT
(gas) = (log(P_meas) - log(P_sl)) * T_meas
Definition: pressure_conversion.h:148
void PrintGasOptions()
Print a list of all gas options currently set.
Definition: pressure_conversion.h:176
MediumPressureOptions(double rho, double g)
Detailted constructor for Pressure::Type::LIQUID constants.
Definition: pressure_conversion.h:129
MediumPressureOptions()
Default constructor for MediumPressureOptions and sets all constants to default values.
Definition: pressure_conversion.h:103
const double M
(gas) molar mass of dry air [Kg/mol]
Definition: pressure_conversion.h:139
const double g
gravity constant [m/s^2]
Definition: pressure_conversion.h:135
const double P_sl
(gas) pressure at sealevel [Pascal]
Definition: pressure_conversion.h:138
The Pressure struct describes the raw pressure measurement used for conversion later.
Definition: pressure_conversion.h:25
friend std::ostream & operator<<(std::ostream &out, const Type &type)
Type type_
type of the measurement
Definition: pressure_conversion.h:66
double data_
measurement data
Definition: pressure_conversion.h:64
Pressure(double pressure, double temperature, Type type)
Detailed constructor.
Definition: pressure_conversion.h:60
Pressure()=default
Default constructor initializing values to 0, and type to Type::GAS.
friend std::ostream & operator<<(std::ostream &out, const Pressure &pressure)
Type
The Type enum determines the type of pressure measurement used for conversion.
Definition: pressure_conversion.h:30
@ GAS
pressure measruement is in gas medium, e.g., air
@ LIQUID
pressure measurement is in liquid medium, e.g., water
@ HEIGHT
pressure measurement has already been converted to height by sensor
Pressure operator+(const Pressure &pressure)
Definition: pressure_conversion.h:70
void operator/=(const double &n)
Definition: pressure_conversion.h:81
void operator+=(const Pressure &pressure)
Definition: pressure_conversion.h:75
Pressure(double pressure)
Detailed constructor with pressure value.
Definition: pressure_conversion.h:49
double temperature_K_
ambient temperature when measurement data was observed
Definition: pressure_conversion.h:65