The hard problem
Clinics measure gait with marker systems and force plates. The goal here: get useful joint-angle measurements from nothing but a phone camera — in real time, at 30 fps on a mid-range iPhone.
Raw pose estimation alone doesn't get you there: landmarks jitter frame to frame, angles need anatomical definitions and normal ranges, and the practitioner needs a report in hand two minutes after the assessment.
What I built
Every layer of the product:
- CV pipeline — MediaPipe 33-landmark pose tracking and an angle-calculation layer producing 13+ metrics (hip, knee, dorsiflexion, pelvic obliquity, trunk sway) with normal ranges and left/right symmetry.
- Signal quality — OneEuro filtering tuned per-metric, so curves are smooth enough to read without lagging real movement.
- Two assessment modes — free-form continuous analysis, and a guided 5-step protocol with voice prompts.
- Reporting — a multi-page vector PDF engine (metric cards, time-series charts, status colouring) that runs fully offline.
- AI commentary — per-metric insights via a server-side OpenAI integration, cached to avoid duplicate calls.
- The native layer — Swift shell, WKWebView bridge protocol, services for auth, upload, sharing and deep links.
Later extracted into a company-wide CocoaPod by a teammate.
How the system works
- Camera30 fps capture in-app
- PoseMediaPipe — 33 landmarks
- Metricsangle calc + OneEuro smoothing
- Reportvector PDF
- AIinsights via cloud fn
The architecture is a deliberately thin Swift shell around a web-based CV/UI core, joined by a typed message bridge — which let one engineer ship native-feeling iOS while iterating on the ML pipeline at web speed.