This appendix is a bench reference. For each sensor family it names what the device physically measures, the sampling rates you should expect, and the practical gotcha that bites people who treat the raw stream as ground truth. The closing sections cover the compute and data-acquisition plumbing that turns a sensor into a dataset.
Motion: IMUs
An inertial measurement unit bundles three sensing elements on one MEMS die. The accelerometer measures specific force, which is linear acceleration plus the reaction to gravity, so a device sitting still on a table reads roughly \(9.81\ \mathrm{m/s^2}\) upward, not zero. The gyroscope measures angular rate in \(\mathrm{rad/s}\); integrating it gives orientation but accumulates drift because the bias term integrates linearly, \(\theta(t) = \int_0^t (\omega + b)\,dt\). The magnetometer measures the local magnetic field vector and supplies an absolute heading reference, but only after you correct hard-iron and soft-iron distortion from nearby ferrous metal and current-carrying traces.
Consumer IMUs sample at 100 Hz to 1 kHz; industrial and drone-grade parts run to several kHz. The classic mistake is fusing accelerometer and gyroscope without a filter: use a complementary or Kalman filter so the gyroscope carries the short-term dynamics and the accelerometer or magnetometer corrects long-term drift. Watch the datasheet for bias instability and temperature coefficient; a part that drifts with self-heating will ruin dead reckoning.
Vibration and acoustic sensors
Vibration sensing is accelerometry pushed to high bandwidth. Piezoelectric accelerometers reach tens of kHz and are the workhorse of machine condition monitoring, where bearing faults show up as sidebands around the shaft frequency. MEMS microphones and hydrophones capture pressure waves; audio-band MEMS mics sample at 16 to 48 kHz, ultrasonic parts higher. The dominant gotcha is aliasing: any energy above the Nyquist frequency \(f_s/2\) folds back into your band and cannot be removed afterward. Use an analog anti-alias filter before the ADC, and choose \(f_s\) with headroom above the highest fault frequency you care about, not just the fundamental.
Biosensors: ECG, PPG, EEG, EMG
ECG measures the heart's electrical potential across skin electrodes, typically 250 to 1000 Hz, with the diagnostic content in the 0.5 to 40 Hz band. PPG shines an LED into tissue and measures back-scattered light to infer blood volume changes; it runs at 25 to 100 Hz and is cheap and wearable but exquisitely sensitive to motion artifact. EEG records scalp potentials in the microvolt range and demands 250 to 1000 Hz sampling with careful shielding. EMG measures muscle activation and needs 1 to 2 kHz because its power extends past 400 Hz. The shared gotcha is that these are all tiny biopotentials riding on large interference: 50/60 Hz mains hum, electrode drift, and motion. Design for a strong instrumentation amplifier with high common-mode rejection, and treat electrode contact impedance as a first-class signal-quality metric.
Ranging and depth
FMCW radar (mmWave) transmits a frequency-swept chirp and mixes the echo down to a beat frequency proportional to range: \(f_b = \tfrac{2 R}{c}\,S\), where \(S\) is the chirp slope. Automotive parts operate at 24, 60, and 77 GHz, deliver range, radial velocity via the Doppler shift, and angle from an antenna array, and see through fog, dust, and clothing. They are low resolution in angle and prone to multipath ghosts.
Lidar measures time of flight of laser pulses to build a dense point cloud, from single-beam parts to 128-channel spinning or solid-state units. It gives centimeter geometry but struggles with rain, dark or specular surfaces, and returns megabytes per second that dominate your bus budget.
Depth cameras come in three flavors. Stereo triangulates disparity between two lenses and fails on textureless walls. Structured light projects a known pattern and reads its deformation, excellent up close but blinded by sunlight. Time-of-flight measures per-pixel phase delay of modulated light, robust and fast but limited in range by the modulation frequency ambiguity.
Imaging beyond the visible
Thermal and IR sensors measure emitted long-wave infrared to recover temperature without illumination. Microbolometer arrays run at 9 to 60 Hz and need periodic non-uniformity correction (the shutter click you hear); absolute accuracy drifts with ambient temperature, so calibrate against a known reference if you need real degrees.
Event cameras break the frame paradigm. Each pixel fires an asynchronous event only when its log-intensity changes past a threshold, giving microsecond latency, very high dynamic range, and near-zero output on static scenes. The catch is that almost every conventional vision algorithm assumes frames, so you either accumulate events into synthetic frames or adopt event-native processing.
RF sensing and touch
Wi-Fi CSI exposes the per-subcarrier channel state of ordinary Wi-Fi radios. Because a moving body perturbs multipath, CSI enables device-free presence, breathing, and gesture sensing, but the raw phase carries hardware offsets (sampling and carrier frequency offset) that you must sanitize before the amplitude and phase mean anything.
Tactile sensors measure contact force, pressure distribution, or slip through capacitive, resistive, or vision-based skins such as gel-and-camera fingertips. Sampling ranges from 100 Hz to over 1 kHz for slip detection. Expect nonlinearity and hysteresis, so calibrate per taxel rather than assuming a shared curve.
Environmental sensors
Temperature, humidity, barometric pressure, gas, and particulate sensors report slow-moving scalars over I2C or SPI at sub-Hz to a few Hz. They are easy to read and easy to trust too much: gas and particulate parts need warm-up time and baseline drift compensation, and a barometer used for altitude must be corrected for weather. Average over a window rather than reacting to a single reading.
Reference table
| Sensor family | Measures | Typical rate | Bus | Main gotcha |
|---|---|---|---|---|
| IMU (accel/gyro/mag) | Force, angular rate, field | 100 Hz to a few kHz | I2C, SPI | Gyro drift, mag distortion |
| Vibration / acoustic | Acceleration, pressure | 10 kHz to 100 kHz | Analog, I2S | Aliasing without anti-alias filter |
| ECG / EMG | Biopotential | 250 Hz to 2 kHz | Analog + ADC | Mains hum, electrode drift |
| PPG / EEG | Light, scalp potential | 25 Hz to 1 kHz | I2C, analog | Motion artifact, microvolt noise |
| mmWave radar | Range, velocity, angle | Frames at 10 to 30 Hz | SPI, LVDS | Multipath ghosts, low angular resolution |
| Lidar | Range point cloud | 10 to 20 Hz frames | Ethernet | Rain, dark surfaces, data volume |
| Depth camera | Per-pixel depth | 30 to 90 Hz | USB, MIPI | Sunlight, textureless or specular scenes |
| Thermal / IR | Emitted LWIR | 9 to 60 Hz | MIPI, SPI | Drift, non-uniformity correction |
| Event camera | Log-intensity change | Async, microsecond | USB, MIPI | Frame-based algorithms do not apply |
| Wi-Fi CSI | Channel state | 10 to 1000 Hz packets | Network | Phase offsets need sanitizing |
| Tactile | Force, pressure, slip | 100 Hz to 1 kHz | I2C, SPI | Nonlinearity, per-taxel calibration |
| Environmental | Temp, humidity, gas | Sub-Hz to a few Hz | I2C, SPI | Warm-up, baseline drift |
Compute: microcontrollers, NPUs, and edge accelerators
Where the model runs shapes what sensing is feasible. A microcontroller (Cortex-M class, tens to hundreds of MHz, kilobytes to a few megabytes of RAM) sits next to the sensor and handles filtering, feature extraction, and small quantized networks under a milliwatt budget; this is the domain of TinyML. An NPU or edge accelerator (the neural block in a modern SoC, or a discrete part such as a Coral Edge TPU or an Nvidia Jetson GPU) runs convolutional and transformer inference at watts, enabling on-device vision and radar processing without a cloud round trip. Match the numeric format to the hardware: microcontrollers and NPUs favor int8 quantization, and a model that assumes float32 will either not fit or not accelerate.
Data acquisition: clocks, synchronization, and buses
Multi-sensor perception lives or dies on timing. Each sensor carries its own clock, and two clocks nominally at the same rate drift apart, so a fusion pipeline that assumes sample \(n\) from two streams is simultaneous will slowly desynchronize. Prefer a shared hardware trigger or a common time base (PTP over Ethernet, a PPS pulse, or a GPIO sync line), and always timestamp at capture rather than at software arrival, where operating-system jitter has already corrupted the interval.
Choose the bus for the data rate. I2C suits slow scalar sensors, SPI handles IMUs and mid-rate parts, I2S carries audio, MIPI CSI-2 moves camera pixels, and Ethernet or LVDS carries lidar and radar. The snippet below shows the pattern that matters most: pairing every reading with a monotonic capture timestamp so downstream code can align streams and detect dropped samples.
import time
def read_synced(sensor):
# Latch the timestamp as close to the sample as possible,
# using a monotonic clock that never jumps backward.
t_ns = time.monotonic_ns()
value = sensor.read() # blocking read from the bus
return {"t_ns": t_ns, "value": value}
# Downstream, align two streams by nearest timestamp, and flag any
# gap larger than the expected sample interval as a dropped sample.
Timestamp at capture with a monotonic clock; align streams and detect drops downstream rather than trusting arrival order.
The recurring theme across every family here is that raw sensor output is a physical measurement wrapped in bias, noise, and timing uncertainty, not a clean number. The value you add as an engineer is knowing which of those to correct in hardware, which to filter, and which to hand to the model as an honest signal.