Repository navigation
Conversation
Add the cg_height_ref key (vehicle | sprung) with YAML, to_yaml and Python plumbing, the derived sprung-body height helper, and the gates for the whole-vehicle cg_height meaning on the L5 strut and DAE path: static system CG height, drag height on the strut body, key round trip, rejection and the single warning off the strut path. The R2 expectation uses cg_height on every path. The core still places the strut body at cg_height in this commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The strut and DAE body is the sprung mass alone, so its CG now sits at the derived h_s and the wheel mounts, the spawn settle and the aero arm origin follow it. The penalty path and L1-L4 keep the body origin at cg_height. cg_height_ref sprung restores the previous meaning. The spawn settle gets the body height through an internal overload, so the public contact interface is unchanged. The 3D renderer reads an optional body_cg_height_m geometry key. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Record the re-judged strut-path axle load transfer as a known limitation of this release and mark the validation currency pending until the same-head CI measurement. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add the reaction-arm helper for the wheel-spin balance with its unit tests: on the L5 strut and DAE path with the whole-vehicle cg_height the tire force acts at the wheel-centre height, while the penalty path and cg_height_ref sprung keep the effective rolling radius. The R2 gate and expectation are unchanged and are re-judged after this fix. The core still uses the rolling radius in this commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On the strut and DAE path the wheel is its own particle above the contact, so the tire force reacts on the wheel spin about the wheel-centre height rather than the effective rolling radius. Slip and the tire model keep the rolling radius. The penalty path is unchanged, and cg_height_ref sprung keeps the previous arm so it still reproduces the 0.8.1 strut-path behaviour as a whole. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rdict L5Reaction.R2 passes its unchanged gate after the strut-path reaction arm fix, so both tests move back into the integration suite and the known_failure executable, which held only them, goes away. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Note the wheel-centre reaction arm on the L5 strut and DAE path, what the sprung reference reproduces, and the axle load transfer gate returning to the verdict. The validation currency stays pending until the same-head CI run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
cg_heightnow means the whole-vehicle CG height (sprung + unsprung) on the L5 spatial-strut and corner-DAE path, the same meaning L1-L4 and the L5 penalty path already use. The strut body (sprung mass only) sits at the derived h_s = (m·h − Σm_u·R)/(m − Σm_u); wheel mounts, the spawn settle and the aero arm origin follow it. On the same path the tire longitudinal force now reacts on the wheel spin about the wheel-centre height R0 − penetration instead of the effective rolling radius (scope extension, below).cg_height_ref: sprungrestores the whole 0.8.1 strut-path behaviour. Breaking for every strut-path run.Gates (work order 47 sec. 3, fixed before measurement)
Commit a7bd99f fixes every gate and the R2 expectation (h = cg_height on every path) before the core change in dd870ec.
t_compute_s/compute_*timing arrays differ, as between any two runs)cg_height_ref: sprungbit-identical on L5 strut / DAECgHeightRefKeys.*6 tests; Pythoncg_height_ref1 ctest (20 checks)G1 note: on the strut path without a corner model
unsprungresolves likesprung, so sprung↔unsprung are bit-identical by design; the ≤ 1 % sub-gate has no discriminating power there.Scope extension: strut-path reaction arm (user decision 11-07, 0.8.2 R2 handling option 3)
R2 has to pass before 0.8.2 ships. The wheel-spin reaction
T_react = Fx · armuses arm = R0 − penetration on the strut / DAE path; the penalty path, slip, the tire model and every other use of the effective rolling radius are unchanged.cg_height_ref: sprungkeeps the old arm so G4 stays bit-identical. Commit order: 0630ee6 gate + arm helper and unit tests (core unchanged) → f2e16b9 core → 32459a2 R2 back in the verdict → ceb1c4c docs, currency PENDING.cg_height_ref: sprungUnit:
L5ReactionArm.*3 tests (strut → R0 − penetration; penalty and sprung → Re).Information (not gates):
Changed after measurement
L5Strut.SettlesToStaticEquilibrium: upper boundcg_height + 5 mm→h_s + 5 mm, derived from the new definition (PO 1st verdict item 4), not from a measured value.L5Reaction.R2_*moved out of labelknown_failureinto the integration suite; thevdsim_known_failure_testsexecutable, which held only these two, is removed.Interfaces
VehicleParams::cg_height_ref,validate_cg_height_ref,cg_height_ref_is_sprung,l5_strut_body_height(params.hpp). The Python binding exposes the field.core/src/spawn_settle_internal.hpp); the reaction-arm helper is internal (core/src/free_3d_reaction_internal.hpp);settle_spawn_on_ground()andIContactProviderare unchanged. No environment variables.cosim/realtime_server.cppnever enables the strut path, so it keeps the public settle.cg_heightabove ground (four-key) oraero_drag_height; elements keep their z. Only the arm origin moves to h_s on the strut path.python/vdsim_render3d.py: optional trace geometry keybody_cg_height_m; absent = unchanged. Smoke render once (no gate).Documentation impact (W1)
CHANGELOG
[0.8.2](Breaking, Added, Fixed: reaction arm and R2 back in the verdict; the R2 known limitation is removed),params.hppfield comments,docs/theory/20_ld5_stunt.md(h, h_o, h_s, aero arm, strut reaction arm),docs/VALIDATION.mdcurrency PENDING until the CI measurement, R2 exclusion lines removed.Local verification
Canonical validation preset (
ctest --preset validation --parallel 4) at ceb1c4c: 615/615 (main 595 + 20: C++ unit 9, C++ integration 10 incl. R2 ×2, Python 1).ctest -L known_failure: 0 tests. Doc audit at ceb1c4c: A1 version and A2 currency PENDING (intentional until the CI measurement) fail; main fails A1 only; links, nav, theory index, README, private strings pass.CI measurement
PENDING: same-head complete successes ×3, currency confirmation, final run and wheels. Run 42379950076 (ceb1c4c) did not start — account billing lock; not counted, not retried. No merge, tag or publication performed.
🤖 Generated with Claude Code