Atmospheric Pressure

The pressure measurement on MAVs allows to estimate the current altitude and, if two sensors are used, the current airspeed.

Wikipedia References:

Units



Pa = $\frac{N}{m^2}$\\

N = $\frac{kg \cdot m}{s^2}$\\

Density = $\frac{{kg}}{m^{3}}\\$

Airspeed

The airspeed (combination of groundspeed of the vehicle and wind speed) can be measured by comparing the pressure in a pitot tube (a tube oriented towards the front) and the ambient pressure, measured e.g. on the side of the airplane. Not interested in the basics and want just C-code? Jump to the section below.

Calculating Indicated Airspeed / Stall Speed

The indicated airspeed is the true airspeed at sea level. If the MAV flies higher than sea level, the air density is less, so when the airspeed is kept constant on all altitudes, the true air speed (travelled distance, neglegting wind effects for now) will be higher at high altitudes. The indicated airspeed thus directly relates to the pressure in front of aircraft, which in turn relates to the speed at which stall occurs. So to prevent stall, always keep the indicated airspeed above the stall speed, no matter at which altitude the MAV is flying. Consequently this will be at a lower true air speed near sea level and at a high true air speed at very high altitudes in thin air.

Calculation of the indicated airspeed: The speed in a medium is


$ V_{in} = \sqrt{\frac{2(p_t - p_s)}{\rho_0}}
$

Where all variables are in SI units:

  • V_{in} is the indicated airspeed (which depends on altitude) in meters per second (m/s)
  • \rho_0 is 1.225 kg/m³, the air density at sea level and 15 degrees Celsius
  • p_t stagnation or total pressure inside the pitot / Prandl tube, in Pascal, which is Newton per square meter (Pa → N/m²)
  • p_s static pressure, the pressure measured on the side of the airplane/tube, in Pascal, which is Newton per square meter (Pa → N/m²)

If you now expand the formula units using the unit definitions above, you end up (like expected) with m/s as unit of speed.

Calculating True Airspeed for low speeds

The true airspeed is the vehicle's forward ground speed combined with wind speed. Please note that the wind has a direction, so the true airspeed contains only the part of the wind speed along the pitot tube axis. Please also note that the overall ground speed (including movements to the side through wind drift) is not equal to the true airspeed, as e.g. wind from the side can induce a speed with respect to the ground, which is not measured by the true airspeed.

To estimate the true ground speed, it is best to fuse GPS speed and true airspeed into a consistent ground speed estimate (not covered in this article).

The formula below applies for low speeds (lower subsonic range).


$ V_{true} = V_{in} \sqrt{\frac{\rho_0}{\rho}}
$

Where

  • V_{in} is the indicated airspeed (in m/s, which depends on altitude)
  • V_{true} is the true airspeed (in m/s)
  • \rho_0 is 1.225 kg/m³, the air density at sea level and 15 degrees Celsius
  • \rho is the air density at the current altitude (in kg/m³, can be calculated from GPS altitude and/or barometric absolute pressure)

In this equation the kg/m³ cancels out and thus stays m/s from V_{in}.

Air Density for a specific temperature

This measure is used to compensate the speed calculation at different altitudes.


$\rho = \frac{p}{R \cdot T}

Where

  • $\rho$ Is the density at this temperature in kg/m³
  • $p$ Is the current static pressure in Pascal
  • $R$ Is the specific gas constant for air, 287.1 J/(kg K)
  • $T$ Is the current temperature in Kelvin (absolute temperature)

To get the absolute temperature, add 273,15 Kelvin to the temperature in degrees celcius

C-Code

Indicated airspeed calculation with IEE754 single precision floating point format. You can change the function inputs from float to e.g. int32 to simplify the calculation.

/**
 * Calculate indicated airspeed.
 *
 * Note that the indicated airspeed is not the true airspeed because it
 * lacks the air density compensation. Use the calc_true_airspeed functions to get
 * the true airspeed.
 *
 * @param differential_pressure total_ pressure - static pressure
 * @return indicated airspeed in m/s
 */
float calc_indicated_airspeed(float differential_pressure)
{
 
	if (differential_pressure > 0) {
		return sqrtf((2.0f*differential_pressure) / CONSTANTS_AIR_DENSITY_SEA_LEVEL_15C);
	} else {
		return -sqrtf((2.0f*fabs(differential_pressure)) / CONSTANTS_AIR_DENSITY_SEA_LEVEL_15C);
	}
 
}
 
/**
 * Calculate true airspeed from indicated airspeed.
 *
 * Note that the true airspeed is NOT the groundspeed, because of the effects of wind
 *
 * @param speed_indicated current indicated airspeed
 * @param pressure_ambient pressure at the side of the tube/airplane
 * @param temperature_celsius air temperature in degrees celcius
 * @return true airspeed in m/s
 */
float calc_true_airspeed_from_indicated(float speed_indicated, float pressure_ambient, float temperature_celsius)
{
	return speed_indicated * sqrtf(CONSTANTS_AIR_DENSITY_SEA_LEVEL_15C / get_air_density(pressure_ambient, temperature_celsius));
}
 
/**
 * Directly calculate true airspeed
 *
 * Note that the true airspeed is NOT the groundspeed, because of the effects of wind
 *
 * @param total_pressure pressure inside the pitot/prandtl tube
 * @param static_pressure pressure at the side of the tube/airplane
 * @param temperature_celsius air temperature in degrees celcius
 * @return true airspeed in m/s
 */
float calc_true_airspeed(float total_pressure, float static_pressure, float temperature_celsius)
{
	float density = get_air_density(static_pressure, temperature_celsius);
	if (density < 0.0001f || !isfinite(density)) {
	 density = CONSTANTS_AIR_DENSITY_SEA_LEVEL_15C;
	 printf("[airspeed] Invalid air density, using density at sea level\n");
	}
 
	float pressure_difference = total_pressure - static_pressure;
 
	if(pressure_difference > 0) {
		return sqrtf((2.0f*(pressure_difference)) / density);
	} else
	{
		return -sqrtf((2.0f*fabs(pressure_difference)) / density);
	}
}

Altitude

The current flight altitude can be calculated/estimated by measuring the absolute pressure around the airplane (at the sides of the plane/pitot/prandl tube) and by taking the current weather conditions (pressure) into account. In the MAV context this will be most likely done by calibrating the ground altitude before liftoff.

Calculating the pressure altitude

To calculate the pressure altitude, the barometric formula has to be used. If the MAV is only active between 0 and 11000 meters (0-36'000 feet), it can be simplified. For almost all MAVs the simplified version below is thus recommended to use.

General Barometric Formula

The barometric formula that relates pressue and altitude is:



$ P = P_b \cdot \left(\frac{T_b}{T_b + L_b \cdot \left(h - h_b\right)}\right)^{\left(\frac{g_0 \cdot M}{R^* \cdot L_b}\right)}$

We solve it for the height h:



\begin{eqnarray*}
\\
h = \frac{\left(\frac{T_b \cdot P_b^{\left(\frac{R^* \cdot L_b}{g_0 \cdot M}\right)}}{P^{\left(\frac{R^* \cdot L_b}{g_0 \cdot M}\right)}}\right) - T_b}{L_b} + h_b
\end{eqnarray*}

Where:

  • $P$ is the measured static pressure in Pascal (Pa, N/m²)
  • $P_b$ is the pressure on bottom of layer b in Pascal (Pa, N/m²)
  • $T_b$ is the temperature on bottom of layer b in Kelvin (K)
  • $G_0$ is the gravity acceleration, 9.80665 m/s²
  • $M$ is the molar mass of the earth's atmosphere, 0.0289644 kg/mol
  • $R^*$ is the universal gas constant for air, 8.31432 N·m /(mol·K)
  • $L_b$ is the temperature lapse rate in Kelvin per meter (K/m)
  • $h$ is the current altitude in meters
  • $h_b$ is the height at the bottom of layer b in meters
Translations of this page:


Quick Links

QR Code: URL of current page