Purpose snapshot (first read) · ← Bundle index
After running script/pendulum_squat_gif_v7.py in the upstream repo, copy or open the generated files. In this ICD bundle the paths are:
| File | Purpose |
|---|---|
pendulum_squat_v7.html |
Full teaching stack: FBD + ROM chart + coaching text; every frame is an embedded PNG (large download). |
pendulum_squat_fbd_v7.html |
(Not included in this bundle.) Lightweight canvas with live vectors, same knee-proxy (42–142°) and phase order as the GIF; produced beside pendulum_squat_v7.html in the upstream output/ folder. |
pendulum_squat_v7.gif |
(Not included here.) Shareable loop of the matplotlib frames; upstream output/. |
Legacy v5 (pendulum_squat_v5.html) and experimental v6 canvas in pendulum_squat_fbd_v6.html are not kept in sync with v7 — use v7 for a single consistent story. The v6 file is bundled for browser-drawn vector scrubbing only.
Three vertical panels (matplotlib layout from v4_engine):
| CLI | FBD emphasis |
|---|---|
--mode movement | Geometry + angle + phase only |
--mode forces (default) | F_load, F_quads, moment arm d⊥ at knee, shear proxy box |
--mode coaching | Mechanic badges, depth cues, joint-story bullets, tempo |
The diagram is a teaching schematic: one load vector, simplified cam geometry, and a scalar “knee flexion proxy” — not marker-based inverse dynamics for a specific Matrix unit.
On every frame, the blue arc label is a knee flexion proxy in degrees, not the machine’s pendulum-arm angle from vertical and not necessarily a goniometer reading:
How this relates to the femur–tibia angle. In the usual anatomical picture, the included angle between the long axes of femur and tibia is large when the knee is near straight and gets smaller as you squat deeper (the hinge closes). Maximum quadriceps length in a squat pattern is therefore tied to that most flexed position — the narrowest femur–tibia angle in that convention — not to the largest number on a protractor in every reporting style. The blue-arc value here is different: it is a depth index that was chosen so higher = deeper (~42 shallow → ~142 deep). It is not the same quantity as “included knee angle” in degrees from anatomy atlases; the two can even move in opposite numeric directions (proxy rises as interior joint angle shrinks). Do not read ~142° as “142° included femur–tibia angle” unless you have explicitly calibrated the proxy to that definition.
When comparing to literature or to athlete measurements, say explicitly which definition you used.
The animation follows a normal full rep:
Earlier builds used the generic v4_engine sequence (concentric_increases=False), which placed concentric first in the frame array; that made the first moving phase look like “standing up” while the angle was still decreasing from a high number — confusing unless you knew the proxy increased with depth. That is corrected via a custom rep sequence in pendulum_squat_gif_v5.py.
Eccentric and concentric segments sample angles with more frames near the bottom (where joint demand changes quickly) and fewer near lockout, instead of uniform 7–8° steps across the whole arc.
The v7 HTML file does not draw vectors in JavaScript. In --mode forces, matplotlib draws F_load, F_quads, and the moment arm into each PNG before it is embedded. The player only flips through those images. For a browser-drawn vector overlay in this bundle, open pendulum_squat_fbd_v6.html (experimental v6 canvas; not lockstep with v7). A separate interactive sagittal tool may exist in the upstream pendulum_squat_force_diagram/ repo folder.