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.


load_in, the control signal of the intake fan. See the variables table for a description of these variables.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.
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 B to denote that a variable A has an effect on variable B.
Short-hand notation
A1/2 B, C is equivalent to the edges A1 B, A1 C, A2 B and A2 C
We can also express this as A* B,C
Some text and figures in this section are adapted from the original paper (Gamella et al. 2025, Appendix III).

In what follows, we provide a detailed description and visualization of each edge (physical effect) in the above graph.
load_in/out 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).
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).To recreate the data for the left and center panels (steady state) using the Remote Lab:
For the right panel (impulse):
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).
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.To replicate the experiment with the Remote Lab:
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).
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.To replicate the experiment with the Remote Lab:
res_rpm_in/out 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).
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.To replicate the experiment with the Remote Lab:
hatch 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).
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º.To replicate the experiment for the left panel using the Remote Lab:
For the right panel:
hatch 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.
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).To replicate the experiments for the plot using the Remote Lab:
load_in/out, hatch 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).
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.To replicate the experiment with the Remote Lab:
osr_* 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).
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.To replicate the experiment with the Remote Lab:
offset/sps/res_current_* 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 tores_*result in a shift and scaling of the uncalibrated measurements (*_raw).
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).You can replicate the experiments for this plot with the Remote Lab. For the left panel (varying offset_current_in):
For the center panel (varying sps_current_in):
For the right panel (varying res_current_in):
offset/sps/res_mic 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 tores_micresult in a shift and scaling of the uncalibrated measurements (mic_raw).
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).You can replicate the experiments for this plot with the Remote Lab. For the left panel (varying offset_mic):
For the center panel (varying sps_mic):
For the right panel (varying res_mic):
load_in/out,hatch 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).
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.To replicate the experiment for the figure using the Remote Lab:
mot_enabled/max 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).
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.To replicate the experiment for the left panel (impulse) using the Remote Lab:
For the right panel:
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.

pressure_ambient measurement, which is unaffected by the other chamber variables (see also Figure 13).To replicate the experiment for the plot using the Remote Lab:
Variables table
Below is a glossary of the chamber variables discussed on this page.
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 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 . 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 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 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 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
