Skip to content

docs(vehicle-ph-plant): reproduce appendix, steering as a modulation, review fixes, links - #140

Merged
transfix merged 4 commits into
mainfrom
docs/vehicle-ph-followup
Oct 28, 2026
Merged

transfix merged 4 commits into
mainfrom
docs/vehicle-ph-followup

Conversation

@transfix

@transfix transfix commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Follow-up to #137. transfix/libcvc#851 and transfix/libcvc#852 are still open, so their rows cite their branch commits (6e7ab557 and 1a0acc77); a later docs PR can swap in the squash commits once they merge.

Changes to docs/vehicle-ph-plant.tex (+ PDF, 28 pages)

  • Appendix A, reproducing the tables:
    • the exact setup behind every measured value: libcvc c1f104c0, MSVC 19.44, CMake 3.31.7, Ninja 1.12.1, cvcpkg 2.5.6, torch 2.8.0+cpu;
    • the Windows commands that were run, with the extra CMake flags and why each is there;
    • the Linux/macOS equivalents. These were not run verbatim (no Linux machine was available); libcvc's CI runs the suites under CTest on all three platforms for every PR;
    • each test's printed lines;
    • GRL-SNAM's pytest line, with its expected 53 passed, 2 skipped.
  • §6.6, the learned plant's steering:
  • Corrected provenance: public CVC-Lab/LieSPHGP has no SE(2) vehicle. The port and its golden follow an SE(2) package built on it at 65db994, which is not public. LieSPHGP's own trainers use the EKF ELBO.
  • Review fixes:
    • the dynamic plant shipped in 3.7.0 (#714) and the learned plant in 3.7.1 (#758);
    • ψ for the kinematic heading, since θ is the grade;
    • a "mixed" parity tier;
    • the sharp check's wording, and its value given once as 3.5e-5;
    • the health-check range;
    • test totals, the CTest regex and NavPotential.DriveForce*;
    • the GRL-SNAM paper's full title.

The wheel-frame front slip (149af06, 0020f2a)

The slip-switch sections, for transfix/libcvc#852 and #138:

  • the abstract, §3's slips, Lemma 1 and its proof, Prop 1, and §4.2, §4.4 and §4.5: the floor term f_ε is now round-off at any steering angle;
  • §4.7: the exact front tangent, and the test that holds it to the tire's derivative;
  • §5.2: braking books −358 J at a 4e-6 residual;
  • §8 and §10, the validation tables, Appendix A.3's printed lines, and the versions table;
  • the Torch twin of the single-track pH form and its books; dyn_bike's front slip in its wheel's frame #138 rows cite its squash commit 2f76ab0, where the dynamic twins' parity tests pass (57 passed, 6 skipped for pycvc).

The navigator's point-mass books (86fabe2)

Elsewhere

  • README.md's documentation line links the PDF.
  • The guide's "See also" (§11) has a new bullet for the paper. Only the markdown changed: docs/cvc-nav-and-grl-snam-guide.pdf is not regenerated, because pandoc isn't available where this was built.

Open questions for Joe

  • Naming the vehicle preset. The tests print the preset's name (libcvc's vehicle_desc::humvee()). The appendix summarizes those lines instead of quoting them; whether to name the preset is your call.
  • Citing the SE(2) package. Where should it be cited? The note to the LieSPHGP authors asks the same.

… review fixes, links

- Appendix A: the exact setup behind every measured value (libcvc c1f104c0,
  MSVC 19.44, CMake 3.31.7, Ninja 1.12.1, cvcpkg 2.5.6, torch 2.8.0+cpu);
  the Windows commands that were run, with the extra CMake flags and why;
  the Linux/macOS equivalents (not run verbatim here; libcvc's CI runs the
  suites on every platform); each test's printed lines; GRL-SNAM's pytest
  line and its expected 53 passed, 2 skipped.
- Section 6.6 rewritten for the learned plant's steering: the reference
  form books power through steering (13.4% of |y.u| on the golden fit;
  5.6% on a fit to the analytic plant, which books none). The opt-in
  modulated form (transfix/libcvc#851) has D(v, delta) and G(v, delta), with
  the drive alone as the port. A new validation table holds its tests.
- The learned plant's provenance corrected: public CVC-Lab/LieSPHGP has no
  SE(2) vehicle; the port and its golden follow an SE(2) package built on it
  at 65db994. LieSPHGP's own trainers use the EKF ELBO.
- Review fixes:
  - the dynamic plant is 3.7.0 (#714), the learned plant 3.7.1 (#758);
  - psi for the kinematic heading (theta is the grade);
  - a "mixed" parity tier;
  - the sharp check's wording and its 3.5e-5;
  - the health-check range;
  - test totals, the CTest regex and NavPotential.DriveForce*;
  - the GRL-SNAM paper's full title.
- Links from README.md and the guide's "See also".

pdflatex: 26 pages, three passes, no warnings.
…852), and the pH twin (#138)

The plant's front slip is now measured in its wheel's frame, as the
four-wheel model's: alpha_w = -atan2(n_w.v, sqrt((t_w.v)^2 + eps^2)), each
rooted at n_w.v = 0 (transfix/libcvc#852). The paper follows:
- Section 3: the directions come first, then the slips in the wheels'
  frames; the old front slip is noted.
- Lemma 1 holds at every steering angle (the secant through w = 0, slope
  P C B u_w / (u_w^2 + w^2) at the root); f_eps is the root branch's
  rounding only.
- Section 4.2 and Proposition 1: R's front term is S_f n_f n_f^T, and the
  vehicle is passive from the drive port alone at every floor.
- Section 4.4: S_f ~ C_f / u_f; the front tire's power is exactly its
  dissipation but for the root branch's rounding.
- Section 4.5: the floor reaches only the slips' forward speeds;
  TheFloorTermIsRoundOff measures at most 2.2e-16 of the flow; the old
  remainder and its eps^2 numbers are kept as history.
- Section 4.7: k_f is the wheel-frame slip's exact sensitivity (eq. kf),
  checked by the new TheTangentIsTheTiresDerivative (1.4e-7).
- Section 5.2: braking limiter -358 J, residual 4e-6.
- Section 10: the four-wheel form now carries the single track's over.
- Tables: the plant table gains the renamed floor test and the tangent
  test, with #852's numbers; the live plant's rows move to their own table
  (the plant table no longer fit a page); the twins table and the GRL-SNAM
  validation rows gain #138's pH twin (test_dyn_bike_ph_parity, 18 passed,
  worst 7.1e-14).
- Section 8.2-8.3, Python access and the equation-to-code map: the pH
  form's parts, rates and books are twinned in GRL-SNAM #138.
- Appendix A: #852's and #138's branch commits, and the printed lines at
  1a0acc77 with the c1f104c0 values they replace.
- Versions: #852.

Built with TeX Live pdflatex, three passes: 27 pages, no warnings.
The #138 rows, the reproduction appendix and the versions table now cite main at 2f76ab0, where the dynamic twins' parity tests pass again (57 passed, 6 skipped for pycvc). The PDF is rebuilt: 27 pages, no warnings.
… tick telemetry (libcvc #857)

- Table 9 (the twins) gains the navigator's point-mass books: book_step,
  energy_residual_bound, material_energy and integrate_surrogate_material's
  books hook, held to libcvc's NavPotential.BooksGolden. book_step on
  libcvc's arguments is held to 1e-12 (double tier); the books are held to
  1e-5 of the step's bound, and 2e-5 on the clamped rollout (float tier).
- 8.3, "What is not twinned yet": the point-mass books are twinned. The tick
  telemetry is a running world's, so it has no twin; libcvc #857 binds it in
  pycvc (nav_sim_world_set_capture_drive_telemetry,
  nav_sim_world_drive_telemetry).
- 8.4 gains "Book the navigator's energy": how to ask for the books, the
  measured parity (1.1e-6 and 8.3e-8 of the bound), and the curved-patch
  caveat. On a patch whose gradient channels are not its values' gradients,
  each step books the force/-grad U gap, which fills 99.65% of the bound at
  h = 0.002. It also says where a live world's context work comes from.
- 10, "Python access", and the equation-to-code map: updated to match.

PDF rebuilt with TeX Live pdflatex, three passes: 28 pages, no warnings.
@transfix

Copy link
Copy Markdown
Contributor Author

I added 86fabe2 on this branch. It records two things in the paper: the navigator's point-mass books now have a torch twin (#139, merged), and pycvc can read a running world's tick telemetry (transfix/libcvc#857, on auto-merge).

  • Table 1 (the twins): a new row for book_step, energy_residual_bound, material_energy and integrate_surrogate_material's books, held to libcvc's NavPotential.BooksGolden (nav: a golden for the per-step energy books, for GRL-SNAM's torch twin transfix/libcvc#849).
    • book_step on libcvc's arguments is held to 1e-12 (double tier).
    • The books are held to 1e-5 of the step's bound, and 2e-5 on the clamped rollout (float tier).
  • §8.3, "What is not twinned yet": the point-mass books are twinned now. The tick telemetry (potential_end, projection_work, context_work) belongs to a running world, so it has no twin. #857 binds it in pycvc instead: nav_sim_world_set_capture_drive_telemetry and nav_sim_world_drive_telemetry.
  • §8.4, a new paragraph, "Book the navigator's energy":
    • how to ask for the books;
    • the measured parity: 1.1e-6 and 8.3e-8 of the bound;
    • a caveat: on a patch whose gradient channels are not its values' gradients, each step books the gap between the force and -grad U. On NavPotential.Golden's curved patch that gap fills 99.65% of the bound at h = 0.002;
    • where a live world's context work comes from.
  • §10, "Python access", and the equation-to-code map: updated to match.

The PDF was rebuilt with TeX Live pdflatex, three passes: 28 pages, no warnings. The citation of #857 assumes it merges before this PR does.

@transfix
transfix marked this pull request as ready for review October 28, 2026 03:30
@transfix
transfix merged commit 3f5da2a into main Oct 28, 2026
4 checks passed
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.

1 participant