Skip to content

feat: wave 5 roadmap items (P4, M15, M31, M16, M22, M13, M17, P3) - #36

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

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

Conversation

@gabrielfrasantos

Copy link
Copy Markdown
Contributor

Wave 5 of the roadmap: eight ★★★ items, one commit each. Every commit adds the header, its coverage instantiations, the spec's tests, a doc page and the index rows, and deletes the spec from roadmap/. 27 specs remain.

Commit Item Module Summary
c48c944 P4 SelfCollision planning Capsule per link on the FrameChain; minimum signed distance, attaining pair, allowed-pair bit matrix, margin flag
da79aeb M15 ProductOfExponentials kinematics Screw-axis FK, space Jacobian, conversion to geometric Jacobian, FrameChain output
77795d7 M31 CoriolisMatrixAndRegressor dynamics Modified RNEA (Christoffel C), CoriolisMatrix (C, Cᵀq̇), InertialRegressor / ChainInertialRegressor (10 params per link)
ec48168 M16 MomentumObserver dynamics Generalized-momentum residual on M29 + M31 Cᵀq̇, per-joint collision thresholds
f176e36 M22 DynamicParameterIdentification dynamics M31 regressor rows into upstream IncrementalQrLeastSquares; base-parameter rank and directions
8141e78 M13 PoseInverseKinematics kinematics Upstream Levenberg–Marquardt on the weighted SE(3) log error, manipulability-adaptive damping, step and joint-limit clamping
755b179 M17 ImpedanceControl controllers/manipulator Passive Jᵀ(Ke + Dė) + g and inertia-shaping variants; ships the shared TaskError.hpp for M18/M19
94c27ef P3 GridSearch planning A*/Dijkstra on bounded 2-D/3-D grids, indexed binary heap with decrease-key, octile heuristic

Notable changes

  • SpatialInertia.hpp gains the spatial motion/force algebra used by M31: SpatialMotion, MotionCross, ForceCross, Apply and TransformMotionToChild.
  • New links between targets:
    • robotics.planning → robotics.kinematics
    • robotics.dynamics → numerical.estimators
    • robotics.kinematics → numerical.optimization
    • robotics.controllers.manipulator → robotics.kinematics, numerical.solver
  • The controllers/manipulator test target now links robotics.kinematics_test_doubles.
  • roadmap/README.md now uses OperationalSpaceControl as its canonical example, because ImpedanceControl shipped. The M18/M19 specs point at the shipped TaskError.hpp, and the SlotineLi spec points at the shipped M31 headers.

Spec deviations

  • M16: the fixture uses heavier rods (2 kg × 1 m, 1.5 kg × 0.8 m). With the spec's K_O·dt = 0.05, the light-rod discretization residual exceeded 1e-2. The Cᵀq̇ test bounds the residual at 5 % of the |Cᵀq̇ − Cq̇| drift (about 6.6 N·m at q̇ = (3, −4)), not at an absolute value.
  • M22: IdentificationResult mirrors the upstream LeastSquaresResult, with rowSpace renamed to baseDirections.
  • M13: PoseIkProblem and ManipulabilityDamping are instantiated for coverage as well. λ₀ > 0 is not asserted, because the spec's own stale-error test uses λ₀ = 0.
  • M17: jacobian_transpose_maps_wrench uses the non-symmetric J = [[1, 0.5], [0, 2]] instead of a diagonal one, so Jᵀ and J give different results.
  • P3:
    • PascalCase enumerators (Faces/Full, AStar/Dijkstra).
    • The coverage instantiations are <float, 8, 6> and <float, 3, 3, 3>, plus the Search member template for a function-reference cost, to match the tests. The spec named <64, 64> and <16, 16, 16>, which the tests never use.
    • The 3-D test uses a free cost function instead of a lambda.

Verification

  • host-single-Debug and coverage ctest: 5/5 suites pass.
  • Merged line coverage is 100 % on every new header. CoriolisMatrix::TransposeTimesVelocity is now covered by the M16 tests.
  • clang-format --dry-run --Werror and a Clang -Wall -Wextra -Werror syntax check pass on the coverage sources.
  • scripts/validate-docs.py passes, no doc line is over 400 characters, and the tables are aligned.
  • Not run locally: Qt host preset, MSVC, cppcheck, SonarCloud.

Generated by Claude Code

Joint-to-joint capsules per link from the FrameChain. Every non-allowed
pair is checked with PrimitiveDistance::CapsuleCapsule; adjacent links
are allowed by default through a symmetric bit matrix. Reports the
minimum signed distance, the attaining pair and a margin-based
collision flag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Screw-axis forward kinematics (base-frame screws, linear-first), the
space Jacobian through running adjoints, conversion to the geometric
Jacobian, and a FrameChain so GeometricJacobian applies unchanged.
Pitched screws are rejected at construction.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
A modified RNEA computes M qdd_r + C(q, qd) qd_r + g with the
Christoffel-consistent C (Mdot - 2C skew-symmetric). CoriolisMatrix
builds C column by column and also returns C^T qd. ChainInertialRegressor
implements the new InertialRegressor interface with the
10-parameter-per-link regressor Y. The spatial motion/force algebra is
added to the shared SpatialInertia.hpp.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Generalized-momentum residual on the M29 model and the M31 C^T q-dot
product: a first-order estimate of the external joint torque with
per-joint collision thresholds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Streams M31 regressor rows into the upstream rank-revealing incremental
QR least squares and reports the base-parameter estimate, its rank and
the identifiable directions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Full 6-DoF pose IK on any JacobianProvider: upstream Levenberg-Marquardt
on the weighted SE(3) log-map error, manipulability-adaptive damping,
step clamping and joint-limit projection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Passive J^T stiffness/damping impedance with gravity compensation, and
inertia-shaping impedance through the task-space inertia and a measured
contact wrench. Adds the TaskError helper shared with M18/M19.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
A* and Dijkstra on bounded 2-D/3-D grids: per-cell costs from a
callable, an indexed binary heap with decrease-key, octile/Manhattan
admissible heuristics and corner-cutting control, all in fixed storage.

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.42s
✅ CPP clang-format 120 0 0 0 0.95s
✅ CPP cppcheck 120 0 0 1.7s
✅ DOCKERFILE hadolint 1 0 0 0.39s
✅ JSON jsonlint 8 0 0 0.08s
✅ JSON prettier 8 2 0 0 0.3s
✅ MARKDOWN markdownlint 136 0 0 0 1.51s
✅ MARKDOWN markdown-table-formatter 136 0 0 0 0.18s
⚠️ SPELL lychee 179 2 0 2.31s
✅ YAML prettier 12 0 0 0 0.36s
✅ YAML yamllint 12 0 0 0.37s

Detailed Issues

⚠️ SPELL / lychee - 2 errors
[ERROR] failed to verify TLS certificate: invalid peer certificate: UnknownIssuer
📝 Summary
---------------------
🔍 Total..........255
🔗 Unique.........101
✅ Successful.....243
⏳ 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 125: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

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 0685e5c into main Nov 5, 2026
12 checks passed
@gabrielfrasantos
gabrielfrasantos deleted the claude/determined-einstein-bznlpi branch November 5, 2026 13:15
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