examples/IMU Simulator/README.md
This example demonstrates Serial Studio's multi-frame parsing feature, which automatically expands batched sensor data into individual frames for smooth visualization.
Many devices batch high-frequency sensor readings before transmission to reduce communication overhead. For example:
Without multi-frame parsing, you'd need to manually duplicate scalar values (battery, temperature) for each sample in JavaScript. With this feature, Serial Studio handles it automatically.
{
"battery": 3.75,
"temperature": 25.5,
"accel_x": [0.12, 0.15, ..., 0.08], // 120 samples
"accel_y": [0.23, 0.21, ..., 0.19], // 120 samples
"accel_z": [9.81, 9.79, ..., 9.82] // 120 samples
}
function parse(frame) {
if (frame.length > 0) {
var data = JSON.parse(frame);
// Return mixed scalar/vector array
return [
data.battery, // Scalar - repeated across frames
data.temperature, // Scalar - repeated across frames
data.accel_x, // Vector - unzipped element-by-element
data.accel_y, // Vector - unzipped element-by-element
data.accel_z // Vector - unzipped element-by-element
];
}
return [];
}
Frame 1: [3.75, 25.5, 0.12, 0.23, 9.81]
Frame 2: [3.75, 25.5, 0.15, 0.21, 9.79]
...
Frame 120: [3.75, 25.5, 0.08, 0.19, 9.82]
The scalars (battery, temperature) are automatically repeated, and the vectors are unzipped element-by-element!
python3 imu_simulator.py
Optional arguments:
--host HOST - UDP destination (default: 127.0.0.1)--port PORT - UDP port (default: 9000)--sample-rate RATE - Samples per packet (default: 120)--packet-rate RATE - Packets per second (default: 1.0)--duration SECONDS - Run duration (default: infinite)Example:
# Send 240 samples per packet at 2 Hz
python3 imu_simulator.py --sample-rate 240 --packet-rate 2.0
imu_batched.ssprojScalars (battery, temp) + Vectors (accel arrays) in one return value
No need to manually duplicate battery/temperature 120 times in JavaScript
Three 120-element arrays are automatically transposed into 120 frames
Transmit 1 packet instead of 120 individual frames
High-frequency data (120 Hz) visualized smoothly despite low transmission rate (1 Hz)
GPS with batched position samples:
function parse(frame) {
var data = JSON.parse(frame);
return [
data.fix_quality, // Scalar
data.satellites, // Scalar
data.latitudes, // Vector of lat samples
data.longitudes, // Vector of lon samples
data.altitudes // Vector of alt samples
];
}
Environmental sensor with hourly batches:
function parse(frame) {
var data = JSON.parse(frame);
return [
data.sensor_id, // Scalar
data.battery, // Scalar
data.temperatures, // Vector of 60 samples (1 per minute)
data.humidities, // Vector of 60 samples
data.pressures // Vector of 60 samples
];
}
Copyright (C) 2020-2025 Alex Spataru SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-SerialStudio-Commercial