Skip to content

Label FourPost jacking and elastic share by what they measure - #156

Merged
raorjun merged 5 commits into
fix/fourpost-static-balancefrom
fix/fourpost-labels
Oct 29, 2026
Merged

raorjun merged 5 commits into
fix/fourpost-static-balancefrom
fix/fourpost-labels

Conversation

@raorjun

@raorjun raorjun commented Oct 25, 2026 •

Copy link
Copy Markdown
Member

What

  • "Geometric Anti-Roll" reported net axle jacking. Zero net jacking does not mean zero geometric load transfer.
  • "LLTD" was the elastic share under imposed roll with no lateral force.
  • Invalid samples were filtered without notice: nearest-sample substitution, neighbor fill, abs, and a quiet source switch.

Changes

  • Labels name what each metric measures. Keys and values stay.
  • The metrics CSV gets a status column (ok, partial, invalid, unavailable), and the in-repo readers respect it.
  • lltd_source names the stiffnesses that fell back to defaults.
  • docs/four-post-metrics.md describes each metric, its limits and the key migration.

How to check

tests/test_four_post_metric_status.py and new kinematics tests, including zero net jacking with nonzero differential jacking and a known asymmetric force-based roll-center height.

Notes

Stack

5 of 7.

avg_anti_roll_<axle>_pct is net axle jacking: the vertical force that a
lateral contact-patch force puts on the whole axle. The report called it
"Geometric Anti-Roll", but zero net jacking does not mean zero geometric
load transfer. avg_lltd_front_pct is the elastic share under imposed
roll, but the report called it "LLTD".

The keys keep their names. The FourPost plots and summary page, the
vehicle review and the SHARK overlay now say net jacking and elastic
share. The anti-dive and anti-squat outputs name their force path, a
contact-patch force that the upright reacts, and the summary page shows
the dFz/dFx coefficients beside the percentages. An app config saved
before this change takes these plots from the seed config.

Synthetic tests show the meaning of the existing keys: zero net jacking
with a nonzero differential, and an FBRC height that the differential
sets and net jacking does not change.
FourPost hid invalid samples. An empty sample window took the nearest
sample outside the window. A bad measured pulse force was replaced by
the reference force. A flat jacking signal quietly switched the source
to the contact-load sum. The elastic share was filled from neighbor
poses and took abs() of each transfer, which hid opposite signs.

Now an invalid sample stays invalid and every summary metric gets a
status: ok, partial or invalid. The metrics CSV has a third column,
status. The summary page marks a metric that is not ok. The zero-roll
pose is not counted for the elastic share, where it is 0/0.

Heave poses where a contact patch is in tension are visible.
heave_cp_tension_points counts them, a per-pose tension residual is in
the series, and the clamped contact load shows as NaN, not 0 N. The
anti records keep these poses.

common/metrics_csv.py reads the status. The spring free length balance
in the response generator rejects a motion ratio that is not ok.
vehicle_yaml falls back to its defaults for a roll stiffness that is not
ok. The baseline regression test fails a baselined metric whose status
is not ok.
…_source

lltd_source said four_post_report_roll_stiffness whenever the FourPost metrics file had any row. A roll stiffness that was missing, empty or not ok still fell back to its nominal default. lltd_source now names each roll stiffness that fell back.
The page says what each summary metric measures and does not measure, the anti force path, why net jacking is not geometric load transfer, the status column and its readers, the heave poses in tension, and the default-car value changes.
When the static balance check cannot run, for example because an
executed signal is missing, its values are empty. The default status
rule of the metrics CSV then marked them invalid. They are not
invalid samples. The check did not run.

The static balance keys now get status unavailable in that case. The
status and reason keys keep status ok, because they hold a valid
value. A pass or fail result keeps the default rule.
@raorjun
raorjun added this pull request to stack #159 October 25, 2026 00:43
@raorjun
raorjun requested a review from rhorvath02 October 25, 2026 02:44
@raorjun
raorjun merged commit b43851c into main Oct 29, 2026
5 of 6 checks passed
@raorjun
raorjun deleted the fix/fourpost-labels branch October 29, 2026 22:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants