Skip to content

Measure FourPost static balance from executed signals - #155

Merged
raorjun merged 2 commits into
fix/fourpost-bar-ratesfrom
fix/fourpost-static-balance
Oct 29, 2026
Merged

raorjun merged 2 commits into
fix/fourpost-bar-ratesfrom
fix/fourpost-static-balance

Conversation

@raorjun

@raorjun raorjun commented Oct 25, 2026 •

Copy link
Copy Markdown
Member

What

The static-balance summary derived the spring force from the target load and compared the target with itself. static_balance_max_abs_fz_error_n was 0 and static_balance_pass was True for every car. The balance loop always stopped after one run.

Changes

  • FourPost reads the contact-patch forces, spring forces and actuator reaction. It checks force and moment closure on every zero-command row, the spring force against the table, and the contact Fz against the target.
  • A run without these signals reports unavailable, never a pass.
  • The free length comes from the config or the vehicle file, not from a previous run's CSV.
  • The no-op balance loop and its helpers are removed. Robert: this removes _static_balance_iterations, whose default you set to 4. The executed behavior was one run either way. Please confirm.
  • docs/four-post-static-balance.md explains the checks and tolerances.

How to check

  • tests/test_four_post_static_balance.py.
  • The default car now fails the closure check: the residual grows with simulated time at a fixed pose, to 4.4 N (4.1e-3) at t = 118 s. This is pre-existing on main and reproduced on unmodified fe03bab. It is a model issue, not this PR. The gate was not widened.
  • Cause: the old rig drives heave and roll from LinearSegments tables. In OpenModelica 1.27.1 the actuator acceleration then grows as k·t on flat segments, and the rig link masses turn it into force. BobLib 093952a (BobVis: easier controls, LLTD, friction circles and a metrics tab #48) switches to MonotoneContinuousDerivative2 and a quasi-static rig. FourPostSim there closes to 7e-13 N over 118 s. The check passes once BobSim pins BobLib 093952a or later.

Notes

Stack

4 of 7.

The static-balance summary derived the spring force from the target load
and compared the target with itself. static_balance_max_abs_fz_error_n
was 0 and static_balance_pass was True for every car.

Now FourPost reads the contact-patch forces, spring forces and chassis
actuator reaction. It checks force and moment closure on every
zero-command row, the spring force against the executed table with the
signed BobLib rule, and the measured contact Fz against the target
sprung corner load. static_balance_max_abs_fz_error_n keeps its name and
now means measured contact Fz minus target. A run without the signals is
'unavailable', not 'fail'.

The spring free length no longer comes from a metrics CSV of an earlier
run. It comes from the config or the vehicle file. The static balance
loop, which always stopped after one run, is removed with its two config
keys.
The page gives the rows each check uses, the metrics CSV keys, the tolerance basis with the closure residual that grows with time on the default car, the limits, and the behavior change.
@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 cf9da89 into main Oct 29, 2026
6 of 7 checks passed
@raorjun
raorjun deleted the fix/fourpost-static-balance 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