ES
← Back to Portfolio
Predictive Maintenance June 2026

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.

Sources
Synthetic (knobs) · Real diagnosis (CWRU / Ottawa order-tracked / MaFaulDa) · Real run-to-failure (FEMTO/XJTU/IMS, 36 trajectories)
Diagnosis
Classical envelope/SES · kurtogram/infogram · cyclostationary · cepstrum · Campbell/order; learned WDCNN + deep-AE (ONNX)
Prognostics / RUL
Ladder: exponential first-passage · particle filter · Gaussian process · deep-RUL CNN (ONNX); α-λ + calibration; ISO 20816 zones
Benchmark (real)
RUL MAE over 36 FEMTO/XJTU/IMS trajectories: GP ≈1.0 h (best) · exponential ≈2.7 h (transparent); cross-dataset MFPT: physics ~100% vs WDCNN 0% outer-race recall
Compute
100% in-browser: TypeScript DSP (FFT, Hilbert, kurtogram) + onnxruntime-web
RotorVitals — Rotating-Machinery Condition Monitoring & Prognostics — Architecture
#predictive-maintenance #condition-monitoring #prognostics #rul #vibration #dsp #wdcnn #onnx #cyclostationary #bearings #mining

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

KPIBaselineResultImpact
What the result tells youRMS threshold: "something is wrong"Fault TYPE at its kinematic line + a projected RUL with an uncertainty bandPlan the right intervention and its timing
Diagnosis honestyBlack-box accuracy on a clean rigSNR-robustness curve + cross-dataset transfer test (WDCNN vs physics) on real dataYou see where the model fails, not one flattering number
DataNeeds a proprietary labelled setLive on 4 public real datasets (CWRU, Ottawa, MaFaulDa; FEMTO/XJTU/IMS) + MFPT cross-evalReproducible; raw archives link-only, never re-hosted
ComputeServer / GPU inference service100% client-side: TypeScript DSP + onnxruntime-web (WASM)Static hosting, nothing to install, zero backend

Architecture

rotorvitals pipeline

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.

Live demo · Source on GitHub

Technology Stack

TypeScript React Vite DSP ONNX onnxruntime-web PyTorch KaTeX

Visual assets for this project are not publicly available.