RotorVitals, Rotating-Machinery Condition Monitoring & Prognostics
An in-browser condition-monitoring and prognostics workbench for rotating machinery (bearings-first), running on real measured vibration. A source selector switches between a synthetic signal generator, real diagnosis segments (CWRU / Ottawa order-tracked / MaFaulDa), and real run-to-failure trajectories (FEMTO / XJTU / IMS). A classical DSP chain, a learned WDCNN + deep-autoencoder, and a four-model RUL ladder run live via onnxruntime-web. Honest by design: synthetic labelled as such, cross-domain transfer flagged, frequency relations exact.
Business Context
Unplanned failure of a crusher or conveyor stops a line; condition monitoring exists to convert that into a planned intervention, caught days or weeks ahead. The value here is not just a diagnosis but a defensible one: it names the failing element AND projects a remaining useful life with an uncertainty band, and it is honest about when the learned model can be trusted: showing, on real data, where deep learning wins (in-distribution) and where physics wins (cross-rig), instead of a single flattering accuracy.
Strategic Value
RotorVitals demonstrates a full condition-monitoring-to-prognostics stack running entirely client-side on public real data, with the discipline to report its own failure modes: a CWRU-trained WDCNN that nails one severity but collapses on another, and that scores near chance cross-rig on MFPT while the training-free envelope analysis transfers almost perfectly, the honest lesson that deep learning wins in-distribution and physics wins out-of-distribution. The RUL side is a genuine model ladder from closed-form to Bayesian to deep, benchmarked against 36 real run-to-failure trajectories. It is a reusable pattern for explainable, on-device, honestly-scoped monitoring of rotating equipment.
The Challenge
Rotating equipment (crushers, conveyors, pumps, fans) fails most often at the bearing, and the developing fault is buried in vibration, masked by everything else that spins. Catching it early is high-value, but the useful questions go beyond "is something wrong": which element is degrading, is the model trustworthy on data it was not trained on, and how long until failure. Most tools answer only the first, with a black-box number you cannot audit on a safety-relevant call.
Our Approach
RotorVitals is a browser workbench with a first-level source selector that decides what everything operates on: a physically-grounded synthetic generator (fault type, severity, rpm, SNR as live controls); real diagnosis segments from CWRU (the classifier's native domain), Ottawa (time-varying speed, computed-order-tracked so defect frequencies sit at constant orders and a real Campbell view is possible), and MaFaulDa; and real run-to-failure trajectories from FEMTO/PRONOSTIA, XJTU-SY and IMS. On the selected data it runs three tiers live: a classical DSP chain (envelope/SES, kurtogram/infogram, cyclostationary, cepstrum, Campbell/order, ISO velocity zones), a learned tier (a WDCNN classifier and a deep-autoencoder health indicator, both ONNX, run in-domain on CWRU and cross-domain-labelled elsewhere), and a four-model remaining-useful-life ladder (classical first-passage, particle filter, Gaussian process, and a deep-RUL CNN) projecting against the experiment's true failure time. Everything is client-side: TypeScript DSP plus onnxruntime-web, static on GitHub Pages.
Key Performance Indicators
| KPI | Baseline | Result | Impact |
|---|---|---|---|
| What the result tells you | RMS threshold: "something is wrong" | Fault TYPE at its kinematic line + a projected RUL with an uncertainty band | Plan the right intervention and its timing |
| Diagnosis honesty | Black-box accuracy on a clean rig | SNR-robustness curve + cross-dataset transfer test (WDCNN vs physics) on real data | You see where the model fails, not one flattering number |
| Data | Needs a proprietary labelled set | Live on 4 public real datasets (CWRU, Ottawa, MaFaulDa; FEMTO/XJTU/IMS) + MFPT cross-eval | Reproducible; raw archives link-only, never re-hosted |
| Compute | Server / GPU inference service | 100% client-side: TypeScript DSP + onnxruntime-web (WASM) | Static hosting, nothing to install, zero backend |
Architecture
rotorvitals pipeline
From “something is wrong” to “which element, and how long”
RotorVitals is an in-browser condition-monitoring and prognostics workbench for rotating machinery, bearings-first, running on real measured vibration. Envelope analysis (the classic bearing-fault method) is now one tier inside it. Live at rotorvitals.fasl-work.com, part of the Faena mining-analytics hub.
A source selector drives the whole workbench
- Synthetic (with controls), a physically-grounded generator (McFadden & Smith 1984); fault type, severity, rpm and SNR are live knobs to explore the physics. Severities here are synthetic and labelled as such.
- Real: diagnosis segment: a measured window from CWRU (the classifier’s native domain), Ottawa (time-varying speed, computed-order-tracked → a real Campbell/order view), or MaFaulDa.
- Real: run-to-failure, a real trajectory from FEMTO/PRONOSTIA, XJTU-SY or IMS; a life-instant slider scrubs measured windows healthy → failure, the waterfall is the real degradation surface, and RUL projects against the experiment’s true failure time.
Three tiers, run live
Classical DSP (envelope/SES, kurtogram/infogram, cyclostationary, cepstrum, Campbell/order, ISO velocity zones) · a learned tier (a WDCNN classifier + a deep-autoencoder health indicator, both ONNX) · and a four-model RUL ladder (exponential first-passage → particle filter → Gaussian process → deep-RUL CNN), benchmarked on 36 real run-to-failure trajectories (GP gives the lowest aggregate error, ≈1 h MAE, with the transparent exponential a close second at ≈2.7 h, an aggregate over lifetimes from ~0.6 h to ~1000+ h).
Honest about the model’s limits
The learned classifier is trained on CWRU and shown in-domain there (with an entire load held out); everywhere else it is cross-domain-labelled, and its failures are on display, not hidden: trained only on 0.007″ faults it nails 0.021″ but collapses on 0.014″ (27.8%), and it scores near chance cross-rig on MFPT (0% outer-race recall) while the training-free envelope analysis transfers almost perfectly. The lesson, shown not claimed: deep learning wins in-distribution, physics wins out-of-distribution. Synthetic cases are labelled synthetic, frequency relations are exact, and the scope is rotating machinery, bearings-first, no gear claim (no gear dataset), variable speed only via the one order-tracked dataset.
Technology Stack
Reel
A short, composed reel of the product.

In action
A short tour of the live app: the real interface, recorded from the deployed site.

Application Screenshots


