Code repository for the tutorial paper published in Mechanical Systems and Signal Processing.
D. Gorjup, K. Zaletelj, J. Slavič, An Open-source Supported Tutorial to High-speed Camera Based Structural Dynamics Identification, Mechanical Systems and Signal Processing, TODO (TODO). DOI: TODO
The measured data is published separately as an open dataset on Zenodo: 10.5281/zenodo.21476609 (CC BY 4.0).
Python 3.11+ is required.
# Clone (no Git LFS required)
git clone git@github.com:domengorjup/mssp-image-tutorial.git
cd mssp-image-tutorial
# Create virtual environment and install dependencies
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
# Register the kernel and launch the notebook
python -m ipykernel install --user --name=mssp-tutorial
jupyter notebook image_based_dynamics_tutorial.ipynbThe measured data is not part of the repository — it is downloaded from Zenodo by the notebook itself, in section 2.1. See Measured data below.
image_based_dynamics_tutorial.ipynb # main tutorial notebook
methods/ # reusable Python modules
data.py # on-demand download of the measured data from Zenodo
calibration.py # intrinsic and extrinsic camera calibration
triangulation.py # DLT point triangulation and ODS reconstruction
modal.py # FRF estimation and modal analysis utilities
visualization.py # plotting and animation helpers
utils.py # general utilities (I/O, image loading)
data/
results/image_displacements/ # precomputed LK optical-flow displacements (in repository)
plate_speckle.png # speckle pattern image for visualization (in repository)
mraw/ # Photron videos, two views ─┐
measured_signals/ # force and acceleration signals │ downloaded
calibration/ # checkerboard calibration images │ from Zenodo
.zenodo/ # download markers (do not edit) ─┘
All measurements are published as a citable Zenodo printer-bed dataset and downloaded on demand. The repository pins the version DOI 10.5281/zenodo.21476609, not the concept DOI, so that every reader obtains byte-identical files and reproduces the exact results reported in the paper.
| Archive | Size | MD5 | Extracts to |
|---|---|---|---|
mraw.zip |
442.7 MB | c1e3fd2e2aa1b59ea686f136411e2041 |
data/mraw/ |
measured_signals.zip |
9.3 MB | bb93d8be17476b1ea13d8f148cde9fb9 |
data/measured_signals/ |
calibration.zip |
1.9 MB | f10eb0d63ce2a919cdd53100c3ed3fe3 |
data/calibration/ |
The notebook calls ensure_dataset() in section 2.1, before the data is first
used. It can also be called directly:
from methods.data import ensure_dataset
ensure_dataset() # all archives (~450 MB on first run)
ensure_dataset('calibration') # a single archiveThe function is safe to re-run. Data already in place is detected via marker files
in data/.zenodo/ and skipped without any network access, so re-running a notebook
cell costs nothing. Each archive is verified against the MD5 checksum published in
the Zenodo record before extraction; a mismatch raises an error rather than
proceeding with corrupt data. An interrupted download or extraction leaves no
marker behind, so the next call simply fetches the dataset again.
Slow or unreliable connection? Download any of the archives manually from the record page and place them in
data/.ensure_dataset()verifies their checksums, extracts them, and skips the download.
The example printer-bed dataset consists of a sine-sweep excitation experiment on a suspended thin plate (3D-printer bed) with a speckle pattern, recorded sequentially from two camera views.
- Excitation: swept-sine, 60–500 Hz
- Views: 2 (multi-view for 3-D displacement reconstruction using frequency-domain triangulation)
- Repetitions: 4 (view 0) / 1 (view 1) — used for ensemble-averaged FRF estimation
- Camera: Photron high-speed, downsampled to 384×384 px at 1000 fps for the provided example data
- Force and acceleration sampled at 25600 Hz (DAQ), clipped to camera Nyquist (500 Hz) during analysis
All precomputed data is stored in HDF5 format, readable without any proprietary software. Load with methods.utils.load_hdf5 or directly with h5py.
Force and acceleration time series for the 4 view-0 repetitions.
InputTask/
data float64 (51200, 3) columns: force [N], acceleration [m/s²], trigger
time float64 (51200,) time axis [s]
channel_names str list ['force', 'acc', 'trigger']
sample_rate int 25600 [Hz]
Same structure, single repetition for view 1.
Lucas–Kanade optical-flow displacements for each measurement repetition. These are derived results, computed from the videos by the notebook, and are included in the repository so that the modal analysis can be run without repeating the tracking.
view 0 float64 (100, 2000, 2) displacements [px] — axes: (point, frame, [v, u])
view 1 float64 (100, 2000, 2)
Please cite both the paper and the dataset.
@article{gorjup2026tutorial,
author = {Gorjup, Domen and Zaletelj, Klemen and Slavi\v{c}, Janko},
title = {An Open-source Supported Guide to High-speed Camera Based Structural Dynamics Identification},
journal = {Mechanical Systems and Signal Processing},
year = {TODO},
volume = {TODO},
pages = {TODO},
doi = {TODO},
}
@dataset{gorjup2026dataset,
author = {Gorjup, Domen and Zaletelj, Klemen and Slavi\v{c}, Janko},
title = {Printer-bed dataset: high-speed-camera and accelerometer modal
measurements of a suspended 3D-printer bed},
year = {2026},
publisher = {Zenodo},
doi = {10.5281/zenodo.21476609},
url = {https://doi.org/10.5281/zenodo.21476609},
}- Domen Gorjup — University of Ljubljana, Faculty of Mechanical Engineering
- Klemen Zaletelj — University of Ljubljana, Faculty of Mechanical Engineering
- Janko Slavič — University of Ljubljana, Faculty of Mechanical Engineering