Skip to content

feat: wave 1 roadmap items (M33, M28, P1, M5, M34) - #33

Merged
gabrielfrasantos merged 7 commits into
mainfrom
claude/determined-einstein-bznlpi
Nov 5, 2026
Merged

gabrielfrasantos merged 7 commits into
mainfrom
claude/determined-einstein-bznlpi

Conversation

@gabrielfrasantos

Copy link
Copy Markdown
Contributor

First wave of roadmap specs, picked as the cheapest items that need nothing beyond the current numerical-toolbox pin (63c9b91). Each item is one self-contained commit per roadmap/DEPLOYMENT.md: header, coverage .cpp, tests limited to the spec's cases, CMake, doc page and doc-table rows. The same commit deletes the item's roadmap/ spec and its rows in ROADMAP.md and roadmap/README.md.

Items

Commit Item Summary
c6d6530 M33 CubicSplineTrajectory C² joint trajectory through timed via points on math::CubicSpline (NT61). Creates the trajectory module and the shared TrajectoryTypes.hpp (JointTrajectoryState).
e385f73 M28 CompositeRigidBodyAlgorithm O(n²) mass matrix, exactly symmetric. ABA's private spatial-inertia and wrench transforms move into a shared robotics/dynamics/SpatialInertia.hpp, so ABA and CRBA use one implementation. ABA's public API is unchanged.
0a106a9 P1 PrimitiveDistance Closed-form closest points and signed distances (point, segment, sphere, capsule, oriented box). Creates the planning module.
f914ff8 M5 PdGravityCompensation τ = Kp·e − Kd·q̇ + g(q) on the existing EulerLagrangeDynamics interface. Creates controllers/manipulator (target robotics.controllers.manipulator) and a robotics.dynamics_test_doubles target with MockEulerLagrangeDynamics.
736a5aa M34 ForwardDynamicsIntegrator ABA exposed as SecondOrderSystem/OdeSystem and stepped by SemiImplicitEuler (NT58) or RungeKutta4.

Changes from the specs

  • P1: the spec's tests never call SphereCapsule, so rounded_pairs_subtract_the_radii gets one extra assertion for it.
  • M34: the coverage instantiations are <float, 1, RungeKutta4> and <float, 2, SemiImplicitEuler>, not the spec's two 2-link versions. Only the instantiations in the coverage .cpp are measured, and the tests use the 1-link RK4 pendulum.
  • roadmap/README.md: its canonical worked example linked to the M5 spec this PR deletes, so it now points to ComputedTorqueControl.
  • M5: the simulator's RobotArmSimulator::StepChain is not switched to M34 yet, although the M34 spec suggests it. That change needs the Qt build.

Verification

  • host-single-Debug configure, build and ctest: 5/5 test executables pass.
  • Coverage build (EMIL_ENABLE_COVERAGE=On, simulator off): 5/5 pass. Merged gcov line coverage of the new headers is 98.7–100%:
    • PrimitiveDistance 98.7%
    • all the others 100%
    • ABA after the refactor 100%
  • Margins on the numerical tests:
    • pendulum period error 0.016% (limit 0.5%)
    • RK4 energy drift 1e-7 (limit 1e-4)
    • semi-implicit Euler energy-error ratio 1.37 (limit 2)
    • CRBA columns match RNEA to 7e-9
  • python scripts/validate-docs.py passes, the new C++ is formatted with clang-format, and a grep of the new files finds no heap containers, #pragma GCC optimize, plain TEST(, NiceMock or comments.

Not run locally: the host preset with the Qt simulator, cppcheck/clang-tidy, and SonarQube. CI covers these.

Next

Wave 2 needs SE(2) (NT66) built in numerical-toolbox-cpp, then a pin bump, before F1 and W1–W3. Wave 3 (M1, M30, M8+M7, M29) needs nothing upstream.


Generated by Claude Code

Joint-space C2 trajectory through timed via points on upstream
math::CubicSpline (NT61), rest-to-rest by default. Creates the
trajectory module and the shared JointTrajectoryState type.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
O(n^2) joint-space mass matrix from composite inertias, exactly
symmetric. ABA's spatial-inertia and wrench transforms move into the
shared SpatialInertia.hpp so ABA and CRBA use one implementation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Closed-form closest points and signed distances between points,
segments, spheres, capsules and oriented boxes. Creates the planning
module; P2, P4 and P5 build on these queries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Globally stable set-point regulator tau = Kp e - Kd qdot + g(q) on the
shipped EulerLagrangeDynamics interface. Creates the
controllers/manipulator module and a MockEulerLagrangeDynamics test
double.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Fixed-step simulation step for a link chain: ABA exposed as upstream
SecondOrderSystem/OdeSystem and advanced by SemiImplicitEuler (NT58)
or RungeKutta4, with the step-start acceleration logged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
@github-actions

github-actions Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

✅⚠️MegaLinter analysis: Success with warnings

Descriptor Linter Files Fixed Errors Max errors Warnings Elapsed time
✅ ACTION actionlint 7 0 0 0.68s
✅ CPP clang-format 53 0 0 0 0.93s
✅ CPP cppcheck 53 0 0 1.45s
✅ DOCKERFILE hadolint 1 0 0 0.64s
✅ JSON jsonlint 8 0 0 0.12s
✅ JSON prettier 8 2 0 0 0.52s
✅ MARKDOWN markdownlint 175 0 0 0 2.6s
✅ MARKDOWN markdown-table-formatter 175 0 0 0 0.24s
⚠️ SPELL lychee 217 2 0 2.45s
✅ YAML prettier 12 0 0 0 0.54s
✅ YAML yamllint 12 0 0 0.65s

Detailed Issues

⚠️ SPELL / lychee - 2 errors
[ERROR] failed to verify TLS certificate: invalid peer certificate: UnknownIssuer
📝 Summary
---------------------
🔍 Total..........165
🔗 Unique..........81
✅ Successful.....153
⏳ Timeouts.........0
🔀 Redirected.......5
👻 Excluded.........9
❓ Unknown..........0
🚫 Errors...........2
⛔ Unsupported......2

Errors in .github/workflows/static-analysis.yml
[403] https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$ (at 37:21) | Rejected status code: 403 Forbidden

Errors in doc/kinematics/InverseKinematics.md
[ERROR] https://mathweb.ucsd.edu/~sbuss/ResearchWeb/ikmethods/iksurvey.pdf (at 124:169) | SSL certificate not trusted. Use --insecure if site is trusted

Hint: Followed 5 redirects. You might want to consider replacing redirecting URLs with the resolved URLs. Use verbose mode (`-v`/`-vv`) to see redirection details.
Hint: You can configure accepted/rejected response codes with `-a` or `--accept`

Notices

⚠️ Your configuration references items that have been removed from MegaLinter and are ignored: REPOSITORY_GITLEAKS, REPOSITORY_KICS. See Removed linters to find their replacements.

See detailed reports in MegaLinter artifacts

Your project could benefit from a custom flavor, which would allow you to run only the linters you need, and thus improve runtime performances. (Skip this info by defining FLAVOR_SUGGESTIONS: false)

  • Documentation: Custom Flavors
  • Command: npx mega-linter-runner@10.1.0 --custom-flavor-setup --custom-flavor-linters ACTION_ACTIONLINT,CPP_CPPCHECK,CPP_CLANG_FORMAT,DOCKERFILE_HADOLINT,JSON_JSONLINT,JSON_PRETTIER,MARKDOWN_MARKDOWNLINT,MARKDOWN_MARKDOWN_TABLE_FORMATTER,SPELL_LYCHEE,YAML_PRETTIER,YAML_YAMLLINT

MegaLinter is provided by OX Security
Show us your support by starring ⭐ the repository

Apply the markdown-table-formatter suggestions on PR #33 (ROADMAP
planning table and the five new complexity tables) and wrap four
paragraph lines that exceeded markdownlint's 400-character MD013 limit.
Text is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Addresses the SonarCloud finding on PR #33: the articulated-body solver
held by ChainAccelerationSystem is an empty class, so it takes no
storage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
@sonarqubecloud

sonarqubecloud Bot commented Nov 5, 2026

Copy link
Copy Markdown

@gabrielfrasantos
gabrielfrasantos merged commit d095f8c into main Nov 5, 2026
12 checks passed
@gabrielfrasantos
gabrielfrasantos deleted the claude/determined-einstein-bznlpi branch November 5, 2026 11:02
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