mars_lib 0.1.0.2abe2576fe7f
Modular and Robust Sensor-Fusion
Loading...
Searching...
No Matches
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
19namespace mars
20{
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_;
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{
107
117 MediumPressureOptions(double P_sl, double M, double r, double g) : g(g), P_sl(P_sl), M(M), r(r)
118 {
120 }
121
129 MediumPressureOptions(double rho, double g) : g(g), rho(rho)
130 {
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{
195public:
196 typedef Eigen::Matrix<double, 1, 1> Matrix1d;
197
205
215
225
232
240
241private:
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 Pressure &pressure)
Type type_
type of the measurement
Definition pressure_conversion.h:66
double data_
measurement data
Definition pressure_conversion.h:64
friend std::ostream & operator<<(std::ostream &out, const Type &type)
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.
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