For the complete documentation index, see llms.txt. This page is also available as Markdown.

Wind Tunnel Mk2

Exhaustive documentation including variables, configurations and physical effects.

The wind tunnel produces time-series data from a dynamical system.

The tunnel consists of two controllable fans that push air through it, and a variety of sensors to measure variables such as fan speed, power, and air pressure at different locations. A hatch regulates an additional opening to the outside, creating an additional flow of air.

The chamber produces time-series data from up to 41 variables, including sensor measurements, control inputs, and sensor parameters. See the variables table for a description of each variable, and the map of effects between them.

Example of time-series data from a subset of the chamber variables, collected after applying an impulse to load_in, the control signal of the intake fan. See the variables table for a description of these variables.
Chamber diagram

See the variables table for a description of all variables.

Right click to download the image (available under a CC BY-NC 4.0 non-commercial license).
Simulators

See the Simulator Index for a list of the simulators we offer for this chamber, including documentation and example code.

Hardware configurations

Like all chambers, the wind tunnel can automatically load different hardware configurations, exposing different variables and behaviors of the underlying physical system. For each configuration, see the corresponding PDF for a chamber diagram, a complete description of all variables, and the causal ground-truth graph between them.

Name
Description
Documentation

full

Full configuration with all variables and exogenous inputs.

Map of effects

Here you can find a detailed description of all effects between chamber variables, together with additional experiments and figures. Throughout, we use an edge A \longrightarrow B to denote that a variable A has an effect on variable B.

Short-hand notation

  • A1/2 \longrightarrow B, C is equivalent to the edges A1 \longrightarrow B, A1 \longrightarrow C, A2 \longrightarrow B and A2 \longrightarrow C

  • We can also express this as A* \longrightarrow B,C

Some text and figures in this section are adapted from the original paper (Gamella et al. 2025, Appendix III).

Some hardware configurations introduce additional effects between variables. See their documentation for the complete map of physical effects.

Right click to download the image (available under a CC BY-NC 4.0 non-commercial license).
Causal ground-truth

The graph above can be interpreted as a causal ground truth, as formalized in Gamella et al. (2025, Appendix V), i.e., an edge X \longrightarrow Y signifies that—for some value of the other chamber inputs—an intervention on X will change the distribution of subsequent measurements of Y. The graph should not be taken as a graphical model of statistical dependencies, as external influences on the system may create additional correlations between variables. See the research guide for more details.

In what follows, we provide a detailed description and visualization of each edge (physical effect) in the above graph.

See the variables table for a description of all variables in this section.


load_in/out \longrightarrow rpm_in/out, current_in/out, current_in/out_raw

The fan loads (load_in, load_out) define the duty cycle of the control signal sent to the fans, affecting their speed (measured by rpm_in/out) and the calibrated (current_in/out) and uncalibrated (current_in/out) measurements of the drawn electrical current. The fans operate in an open-loop configuration. In steady-state—and keeping all other variables constant—the load has a quasi-linear effect on the load and a cubic effect on the current (Figure 1, left/center). A justification from first principles is provided in Gamella et al. (2025, Appendix IV.1.1). The effect of the fan load on its speed and current is not instantaneous, as the fan requires time to accelerate (Figure 1, right).

Left: steady-state measurements of the calibrated fan current (current_in) for different values of the load load_in. Center: steady-state measurements of the fan speed (rpm_in) for different values of load_in. Due to their intended application, unless completely powered off (i.e., load_in/out = 0) the fans never operate below a certain speed, corresponding to a minimum load of 0.1 (shown by the gray line). Right: time-series data after a step increase in load_in, showing a lagged effect on fan speed (rpm_in) and current (current_in).

When the fan load is set to zero, the fan is completely powered off and no longer produces a tachometer signal; the resulting speed measurement (rpm_in/out) corresponds to the last measured speed (Figure 2).

By setting a fan load to zero (e.g., load_out ← 0 at t=125), the fan is completely powered off and will decelerate until it stops rotating. It will no longer produce a tachometer signal, and the resulting speed measurement will be the last measured speed (see rpm_out above for 125 < t < 200). When powered up again (t=200) the fan draws full power for an instant, accelerating before returning to the level specified by the load.

Because both fans are connected to the same power supply, the load of one fan affects the current drawn by the other, specially when both are running at high loags (Figure 3).

Calibrated fan currents (current_in/out, top) under step changes to the fan loads (load_in/out, bottom). Because both fans share the same power supply, when a fan is operating close to its maximum load, its drawn current is affected by large changes to the load of the other fan, e.g., at t=200,300.

res_rpm_in/out \longrightarrow rpm_in/out

Changing the resolution (res_rpm_in, res_rpm_out) of the timers used in the fan tachometers also changes the resolution of the resulting speed measurement (rpm_in, rpm_out). Using a resolution of microseconds (e.g. res_rpm_in = 1) allows measuring smaller changes in the fan speed (Figure 4).

Measurements of fan speed (rpm_in) for different resolutions of the underlying tachometer (res_rpm_in), for increasing values of the fan load load_in. The quantization error is larger for higher speeds, when tachometer pulses occur at shorter intervals. The results for rpm_out are the same and not shown.

hatch \longrightarrow rpm_in/out

The two fans in the chamber operate in tandem to drive air through the tunnel (see diagram). Thus, their speeds are coupled, i.e., if one fan accelerates, the other will as well, even if no additional power is applied to it. The strength of this coupling is modulated by the hatch position, which controls a third path for air to flow into or out of the chamber; larger openings result in a weaker coupling (Figure 5).

Left: effect on the fan speed of changing the hatch position (bottom) under constant fan loads (top and middle plot). Right: effect of applying a short impulse to load_in on the fan speeds rpm_in/out for different hatch positions. The coupling between between the fan speeds decreases as the hatch is opened. The hatch is closed at 0º, and fully open at ±45º.

hatch \longrightarrow hatch_angle

A magnetic encoder measures the actual position of the hatch, producing the measurement hatch_angle (in degrees). Under normal operating conditions (default values of mot_enabled/steps/max), the position of the hatch (as measured by hatch_angle) closely follows the position set by hatch (Figure 6, top left).

Lowering the resolution of the motor (mot_steps) results in a coarser hatch placement. If we lower the current delivered to the motor (mot_max) or power it off completely (mot_enabled = 0), the motor will cease to function properly, creating a mismatch between hatch and the actual hatch position measured by hatch_angle.

Position of the hatch (hatch_angle) along a trajectory (dotted black line) defined by the input hatch that sets the desired hatch position. We show trajectories for the default motor parameters (top left) and different values of the motor parameters mot_steps/max/enabled. Lower motor resolutions (mot_steps) result in a coarser hatch placement and potential accumulation of errors. Lowering the current delivered to the motor (mot_max), or powering it off completely (mot_enabled = 0) cause the motor to miss steps, creating a mismatch between the set position (hatch) and the actual position of the hatch (hatch_angle).

load_in/out, hatch \longrightarrow pressure_upwind/downwind/intake

The fan loads (load_in, load_out) and the hatch position (hatch) affect the air pressure measured by the barometers inside the wind tunnel (pressure_upwind, pressure_downwind) and at its intake (pressure_intake). See the chamber diagram for the location of these barometers.

An increase in the load of the intake fan (load_in) results in more air being pumped into the tunnel, increasing pressure_downwind and pressure_upwind; increasing the load of the exhaust fan (load_out) has the opposite effect (Figure 7, left & center). Opening the hatch creates an additional flow of air into or out of the chamber, also affecting the inner pressure measurements. While all three variables affect pressure_intake, the effect is very weak for load_out and hatch (Figure 6).

Left: change in the tunnel pressures after applying an impulse to load_in (gray dashed line), causing a change in the speed of the intake fan (light gray), and creating a pressure wave inside the chamber. The hatch is kept closed (hatch=0), and the exhaust fan is held at a constant load of load_out=0.1. Center: change in the tunnel pressures after applying an impulse to load_out (gray dashed line), causing the exhaust fan to accelerate and decelerate (light gray). As before, the hatch and exhaust fan load are kept contant (hatch=0, load_in=0.1). Right: change on the tunnel pressures by opening and closing the hatch; the fans are kept at a constant load of load_in=1 and load_out=0.1.

osr_* \longrightarrow pressure_*

The oversampling rate of the barometers (osr_pressure_upwind/downwind/intake/ambient) determines how many readings are averaged to produce a single measurement of the air pressure. Thus, a higher oversampling rate increases the precision of these sensors, increasing the signal-to-noise ratio of the resulting measurements (Figure 8).

Effect of the barometer oversampling rate (osr_pressure_upwind/downwind/ambient/intake) on the resulting measurement (pressure_upwind/downwind/ambient/intake). For all barometers, the oversampling rate is increased at t=200,400, 800, while keeping all other chamber inputs and sensor parameters constant.

offset/sps/res_current_* \longrightarrow current_*

The chamber produces calibrated measurements (in Amperes) of the electrical current drawn by the fans (current_in/out) and the hatch motor (current_mot). For each measurement, the chamber also returns the underlying raw, uncalibrated measurements (current_in/out_raw, current_mot_raw), which take values in the range [-2¹⁵, 2¹⁵] (the output of the sensor's ADC).

We can independently control three parameters in each sensor:

  • offset_current_* : the reference voltage. Changing it creates an additive shift in the uncalibrated measurements (*_raw) but is largely compensated for in the calibrated measurements (Figure 9, right).

  • sps_current_* : the oversampling rate, i.e., how many readings are averaged to produce a single measurement. Lower values correspond to higher oversampling rates, increasing the noise-to-signal ratio of the resulting measurements. Both the calibrated and uncalibrated measurements are affected (Figure 9, center).

  • res_current_* : the measurement range—and thus the resolution—of the sensor. Higher values correspond to smaller measurement ranges, increasing the resolution but saturating the sensor if the actual values fall outside this range (Figure 9, right). Changes to res_* result in a shift and scaling of the uncalibrated measurements (*_raw).

Effect of the sensor parameters offset/sps/res_current_in (resp. left, center, right) on the calibrated (current_in) and uncalibrated (current_in_raw) of the intake fan (top and bottom row, respectively). The behaviour for current_out and current_mot is the same and not shown. The calibrated measurements (in Amps) largely compensate for changes in the reference voltage (offset_, left) and sensor resolution (res_, right), unless sensor saturation occurs. For example, in the right plot, the resolution (res_current_in = 2) is increased to the point where the measurements fall outside of the sensor range. Both calibrated and uncalibrated measurements are affected by changes in the oversampling rate (sps_), which affects their signal-to-noise ratio (i.e., variance, precision).

offset/sps/res_mic \longrightarrow mic, mic_raw

The chamber produces calibrated measurements (mic, in Volts) of the signal produced by the tunnel microphone (see diagram). It also returns the raw, uncalibrated measurements (mic_raw) produced by the underlying analog sensor, which produces values in the range [-2¹⁵, 2¹⁵] (the output of its ADC).

As for the current measurements, we can individually control three parameters of the sensor:

  • offset_mic : the reference voltage. Changing it creates an additive shift in the uncalibrated measurements (mic_raw) but is compensated for—up to a small effect—in the calibrated measurements (Figure 10, right).

  • sps_mic : the oversampling rate, i.e., how many readings are averaged to produce a single measurement. Lower values correspond to higher oversampling rates, increasing the noise-to-signal ratio (i.e., precision) of the resulting measurements. Both the calibrated and uncalibrated measurements are affected (Figure 10, center).

  • res_mic : the measurement range—and thus the resolution—of the sensor. Higher values correspond to smaller measurement ranges, increasing the resolution but saturating the sensor if the actual value falls outside this range (Figure 10, right). Changes to res_mic result in a shift and scaling of the uncalibrated measurements (mic_raw).

Effect of the sensor parameters offset/sps/res_mic (resp. left, center, right) on the calibrated (mic) and uncalibrated (mic_raw) measurements from the tunnel microphone (top and bottom row, respectively). The calibrated measurements (in Volts) largely compensate for changes in the reference voltage (offset_mic, left) and sensor resolution (res_mic, right), unless sensor saturation occurs. For example, in the right plot, at the smallest measurement range (res_mic = 6) some measurements fall outside of the sensor range. Saturation can be achieved with lower values of res_mic by shifting the reference voltage of the sensor through offset_mic. Both calibrated and uncalibrated measurements are affected by changes in the oversampling rate (sps_mic), which affects their signal-to-noise ratio (i.e., variance, precision).

load_in/out,hatch \longrightarrow mic

The speed of the fans, controlled by the loads load_in/out, affect the overall noise level and the amount of air flowing through the exhaust and over the tunnel microphone, affecting its calibrated and uncalibrated measurements mic, mic_raw (Figure 11, left). The position of the hatch also modulates the amount of air flowing over the microphone, affecting its readings (Figure 11, right).

Left: time-series data of the microphone output mic (top) collected under varying inputs (bottom) to the fan loads load_in/out and the hatch position hatch. All three inputs affect the microphone measurements. Right: marginal distribution of the microphone output mic for the colored regions on the left plot. The hatch modulates the amount of air that flows through the tunnel exhaust and over the microphone, having a slight effect on the distribution of its measurements. The effect depends on the fan loads, e.g., opening the hatch (hatch=45) decreases the airflow over the microphone when load_in=1, load_out=0.01 (top), but increases it when load_in=0.01, load_out=1 (bottom). The results for the uncalibrated measurement mic_raw are the same and not shown.

mot_enabled/max \longrightarrow current_mot , current_mot_raw

The variable mot_max controls the amount of electrical current delivered to the hatch motor, and mot_enabled switches the motor on or off. Thus, both affect the calibrated (current_mot) and uncalibrated (current_mot_raw) measurements of the electrical current drawn by the motor. As opposed to the fan currents, the effect of mot_max/enabled on the current measurements is instantaneous, i.e., faster than the measurement rate (Figure 12, left). The relationship between mot_max and current_mot, current_mot_raw is non-linear (Figure 12, right).

Left: calibrated motor current (current_mot) under an impulse on the input mot_max , when the motor is enabled (mot_enabled=1, blue) and when it is disabled (mot_enabled=0, yellow). Right: measurements of the calibrated motor current (current_mot) for different values of mot_max, when the motor is enabled (mot_enabled=1, blue) and when it is disabled (mot_enabled=0, yellow). The behaviour of the uncalibrated measurement current_mot_raw is the same and not shown.

External influences

The tunnel barometers producing the measurements pressure_upwind/downwind/intake/ambient are all affected by natural variations in local atmospheric pressure at our location in Zurich (Figure 13, left). In other words, atmospheric pressure acts as a confounding factor between these measurements.

Controlling for local atmospheric pressure & sensor drift

The measurements produced by the ambient barometer (pressure_ambient) are unaffected by the other chamber variables (excluding osr_pressure_ambient), and act as a proxy for the local atmospheric pressure. Subtracting them from the other measurements can partially remove its effect. However, since all barometers experience sensor drift (Figure 13, right), the effect cannot be completely removed by this simple approach.

The sensor drift, which over time converges to a stable point (Figure 13, right), can create an additional correlation between the barometer measurements.

Left: measurements from the tunnel barometers over the span of 3 hours, showing the effect of variations in the local atmospheric pressure at our facility in Zurich. The fans are powered off, and all chamber inputs and parameters are kept constant. Right: drift in the barometer sensors, visible when controlling for the effect of ambient atmospheric pressure, i.e., by subtracting the pressure_ambient measurement, which is unaffected by the other chamber variables (see also Figure 13).

Variables table

Below is a glossary of the chamber variables discussed on this page.

Note: see the documentation of each hardware configuration for its complete list of variables and their default & valid values.

Variable
Description

hatch

The set position of the hatch, in degrees. The hatch is closed at 0º and open at ± 45º.

hatch_angle

The position of the hatch, in degrees, as measured by the encoder of the motor.

mot_steps

The steps-per-revolution of the stepper motor controlling the hatch. Higher values mean a higher motor resolution, i.e., more precise positioning (Figure 6).

mot_enabled

Enables (1) or disables (0) the motor controlling the hatch. If the motor is disabled (0), setting hatch will have no effect on the actual position of the hatch (Figure 6).

mot_max

Regulates the maximum current drawn by the motor controlling the hatch. At low current levels the motor may lose torque and start missing steps, resulting in a mismatch between the set position hatch and the actual hatch angle (Figure 6).

current_mot

The measurement (in Amperes) of the electric current drawn by the motor controlling the hatch (Figure 12).

current_mot_raw

The uncalibrated measurement, i.e., the raw ADC output, corresponding to the measurement current_mot.

offset_current_mot

The reference voltage (offset) of the ADC producing the current_mot and current_mot_raw measurements. The actual reference voltage (in Volts) is given by 5×offset_current_mot4095.5 \times \frac{\text{offset\_current\_mot}}{4095}. Because the signal from the current sensor is passed through an inverting amplifier, higher values of offset_current_mot result in higher values of current_mot_raw (Figure 9).

sps_current_mot

The data rate of the ADC producing the current_mot and current_mot_raw measurements. Lower values mean the ADC accumulates more readings to produce a single measurement, reducing noise but also lowering the measurement speed (Figure 9).

res_current_mot

The resolution of the ADC producing the current_mot and current_mot_raw measurements. Higher values mean a higher resolution, where a smaller voltage range is mapped to the ADC output range {32768,,32767}\{-32768, \ldots, 32767\}. The reading will saturate, i.e., clamp at -32768 or 32767, if the input voltage exceeds the set range (Figure 9).

load_in

The load of the intake fan, corresponding to the duty cycle of the pulse-width-modulation (PWM) signal that controls its speed. At higher values, the fan consumes more power and turns faster. At 0, the complete fan is powered off, including the tachometer; the measurement of fan speed (rpm_in) remains constant at the last measured value.

rpm_in

The speed of the intake fan in revolutions per minute.

res_rpm_in

The resolution of the tachometer that measures the speed of the intake fan (Figure 4), where 1 corresponds to microseconds (higher resolution) and 0 to milliseconds (lower resolution).

load_out

The load of the exhaust fan, corresponding to the duty cycle of the pulse-width-modulation (PWM) signal that controls its speed. At higher values, the fan consumes more power and turns faster. At 0, the complete fan is powered off, including the tachometer; the measurement of fan speed (rpm_out) remains constant at the last measured value.

rpm_out

The speed of the exhaust fan in revolutions per minute.

res_rpm_out

The resolution of the tachometer that measures the speed of the exhaust fan (Figure 4), where 1 corresponds to microseconds (higher resolution) and 0 to milliseconds (lower resolution).

pressure_intake

The air pressure, in pascals, measured by the barometer placed at the tunnel intake.

osr_pressure_intake

The oversampling rate of the intake barometer, which determines how many consecutive readings are averaged to produce a single measurement (Figure 8).

pressure_ambient

The air pressure, in pascals, measured by the outer barometer. This is the ambient pressure outside the chamber.

osr_pressure_ambient

The oversampling rate of the ambient barometer, which determines how many consecutive readings are averaged to produce a single measurement (Figure 8).

pressure_downwind

The air pressure, in pascals, measured by the barometer inside the tunnel placed facing away from the airflow.

osr_pressure_downwind

The oversampling rate of the downwind barometer, which determines how many consecutive readings are averaged to produce a single measurement (Figure 8).

pressure_upwind

The air pressure, in pascals, measured by the barometer inside the tunnel placed facing into the airflow.

osr_pressure_upwind

The oversampling rate of the upwind barometer, which determines how many consecutive readings are averaged to produce a single measurement (Figure 8).

current_in

The measurement of electric current drawn by the intake fan, in Amperes.

current_in_raw

The uncalibrated measurement, i.e., the raw ADC output, corresponding to the measurement current_in.

offset_current_in

The reference voltage (offset) of the ADC producing the current_in and current_in_raw measurements. The actual reference voltage (in Volts) is given by 5×offset_current_in4095.5 \times \frac{\text{offset\_current\_in}}{4095}. Because the signal from the current sensor is passed through an inverting amplifier, higher values of offset_current_in result in higher values of current_in_raw (Figure 9).

sps_current_in

The data rate of the ADC producing the current_in and current_in_raw measurements. Lower values mean the ADC accumulates more readings to produce a single measurement, reducing noise but also lowering the measurement speed (Figure 9).

res_current_in

The resolution of the ADC producing the current_in and current_in_raw measurements. Higher values mean a higher resolution, where a smaller voltage range is mapped to the ADC output range [-32768, 32767]. The reading will saturate, i.e., clamp at -32768 or 32767, if the input voltage exceeds the set range (Figure 9).

current_out

The measurement of electric current drawn by the exhaust fan, in Amperes.

current_out_raw

The uncalibrated measurement, i.e., the raw ADC output, corresponding to the measurement current_out.

offset_current_out

The reference voltage (offset) of the ADC producing the current_out and current_out_raw measurements. The actual reference voltage (in Volts) is given by 5×offset_current_out4095.5 \times \frac{\text{offset\_current\_out}}{4095}. Because the signal from the current sensor is passed through an inverting amplifier, higher values of offset_current_out result in higher values of current_out_raw (Figure 9).

sps_current_out

The data rate of the ADC producing the current_out and current_out_raw measurements. Lower values mean the ADC accumulates more readings to produce a single measurement, reducing noise but also lowering the measurement speed (Figure 9).

res_current_out

The resolution of the ADC producing the current_out and current_out_raw measurements. Higher values mean a higher resolution, where a smaller voltage range is mapped to the ADC output range [-32768, 32767]. The reading will saturate, i.e., clamp at -32768 or 32767, if the input voltage exceeds the set range (Figure 9).

mic

The measurement of the sound level captured by the microphone, in Volts.

mic_raw

The uncalibrated measurement, i.e., the raw ADC output, corresponding to the measurement mic.

offset_mic

The reference voltage (offset) of the ADC producing the mic and mic_raw measurements. The actual reference voltage (in Volts) is given by 5×offset_mic4095.5 \times \frac{\text{offset\_mic}}{4095}. Higher values of offset_mic result in lower values of mic_raw (Figure 10).

sps_mic

The data rate of the ADC producing the mic and mic_raw measurements. Lower values mean the ADC accumulates more readings to produce a single measurement, reducing noise but also lowering the measurement speed (Figure 10).

res_mic

The resolution of the ADC producing the mic and mic_raw measurements. Higher values mean a higher resolution, where a smaller voltage range is mapped to the ADC output range [-32768, 32767]. The reading will saturate, i.e., clamp at -32768 or 32767, if the input voltage exceeds the set range (Figure 10).

Citation

If you use this documentation, our open-source datasets, or Remote Lab in your scientific work, please consider citing:

References

[PDF] Gamella, J.L., Peters, J. & Bühlmann, P. Causal chambers as a real-world physical testbed for AI methodology. Nat Mach Intell 7, 107–118 (2025).

Last updated