Skip to content

feat: wave 6 roadmap items (M26, M21, M20, M18, M19, P6, M23, M25, P5) - #37

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

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

Conversation

@gabrielfrasantos

Copy link
Copy Markdown
Contributor

Wave 6 of the roadmap: the nine ★★★★ items that need nothing unshipped from upstream. Each commit adds the header, its coverage instantiations, the spec's tests, a doc page and the index rows, and deletes the spec from roadmap/. 18 specs remain: M27 (TOPP-RA) and 17 items blocked on upstream NT66/NT67/NT70/NT74.

Commit Item Module Summary
191bcf9 M26 ContinuumKinematics kinematics Constant-curvature arcs: singularity-free section transform, multi-section FK, closed-form single-section IK
1644fae M21 AnalyticalIkOpw kinematics Closed-form OPW IK for ortho-parallel 6R arms, all 8 configurations, wrist-singular handling
bd9b386 M20 SlotineLiAdaptiveControl controllers/manipulator Passivity-based adaptive tracking on the M31 regressor; adds MockInertialRegressor
1f75616 M18 OperationalSpaceControl controllers/manipulator Task-space inertia, joint-space C q̇ + g, dynamically consistent null space, σ damping
ffe37ac M19 HybridPositionForceControl controllers/manipulator Constraint-frame selection, motion PD and damped force PI with anti-windup
db9f84f P6 RrtConnect planning Bidirectional RRT-Connect with fixed node pools and random shortcutting
866a669 M23 Stewart–Gough and Delta kinematics Hexapod leg IK, leg Jacobian and LM forward kinematics on SE(3); closed-form Delta IK/FK
0196780 M25 CableTensionDistribution controllers/manipulator Structure matrix, Pott's improved closed form, exact QP fallback (upstream ActiveSetQp)
da3f252 P5 ConvexCollision planning GJK on cores + margins, Johnson enumeration, bounded EPA

Notable changes

  • robotics.controllers.manipulator now links infra.util, for the really_assert on the M19 selection matrix.
  • roadmap/README.md now uses mobile/PurePursuit as its canonical example, because OperationalSpaceControl shipped. The empty controllers/manipulator index section is removed.

Spec deviations

  • M21: $\sin\theta_5$ is computed as $|(W_{02}, W_{12})|$ instead of $\sqrt{1 - W_{22}^2}$. In float the latter loses precision near $\theta_5 = 0$ and pushed poses with $|\theta_5| \approx 10^{-3}$ into the singular branch.
    • The wrist threshold is $100\varepsilon$.
    • The random round-trip test requires exact recovery of $q$ only when $|\sin\theta_5| > 10^{-2}$; the pose check still applies to every sample.
    • Edge-case assertions were added for $\theta_5 = \pi$, the $b$-cylinder, and a zero acos denominator.
  • M17 / M19: jacobian_transpose_maps_wrench uses the non-symmetric J = [[1, 0.5], [0, 2]], so Jᵀ and J give different results.
  • P6 and P5 coverage:
    • P6: the coverage instantiations use the test sizes (<2, 256>, <2, 10>) and the function-reference callables the tests pass to Plan and Shortcut, as in P3. The test sampler is a free function with a file-local xorshift32 state.
    • P5: adds a <16, 8> instantiation for the face-budget test.
    • P5: the edge-case assertions also cover a degenerate capsule, sphere-in-box EPA and a flat Minkowski difference.
  • P6 and P5 enums: PascalCase enumerators (PlanStatus::Found, ShapeKind::Box, …).
  • M23 / M25: a few edge-case assertions were added to existing tests to cover defensive branches:
    • M23: the Delta has no assembly.
    • M25: zero-length cables.

Verification

  • host-single-Debug and coverage ctest: 5/5 suites pass.
  • Merged line coverage is 100 % on every new header except ConvexCollision.hpp (99.2 %). Its two uncovered lines guard against zero-area EPA faces, which the coplanar-visibility rule prevents.
  • clang-format --dry-run --Werror and a Clang -Wall -Wextra -Werror -Wshadow syntax check pass on every coverage source.
  • scripts/validate-docs.py passes, no doc line is over 400 characters, and every touched table is aligned.
  • Not run locally: Qt host preset, MSVC, cppcheck, SonarCloud.

Generated by Claude Code

Piecewise constant-curvature arcs: a singularity-free section transform
(series below |theta| = 1e-2), multi-section forward kinematics by SE(3)
composition and the closed-form single-section inverse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Closed-form OPW inverse kinematics for ortho-parallel 6R arms with a
spherical wrist: all eight shoulder/elbow/wrist configurations in eight
fixed slots, wrist-singular handling and closed-form forward kinematics.
sin(theta5) is taken from the wrist matrix's third column so the singular
branch triggers only at rounding level in single precision.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Passivity-based adaptive tracking: sliding variable and reference motion,
regressor feedforward with sliding-variable damping, and the
-Gamma Y^T s parameter update. Adds the MockInertialRegressor test double.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Task-space control through the task inertia (optionally damped near
singularities), full joint-space Coriolis/gravity compensation and a
dynamically consistent null-space projector for secondary torques.
The roadmap canonical example now points at PurePursuit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Constraint-frame selection between a motion PD and a damped force PI with
element-wise anti-windup, mapped through J^T with gravity and Coriolis
compensation. The selection matrix is checked to be diagonal 0/1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Bidirectional RRT-Connect in joint space with fixed node pools, an
injected sampler and validity test, discrete edge checking and random
shortcutting. Coverage instantiations match the test sizes and the
function-reference callables the tests pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
StewartGoughKinematics: closed-form leg lengths, the leg Jacobian and
Newton/Levenberg-Marquardt forward kinematics on SE(3) through the
upstream solver. DeltaKinematics: closed-form per-arm inverse and
three-sphere forward kinematics.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Structure matrix from cable geometry, Pott's improved closed-form tension
distribution within [tMin, tMax] with worst-cable clamping, and an exact
least-distance QP through the upstream active-set solver for wrenches
near the workspace boundary.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Support-function distance between spheres, capsules, oriented boxes and
convex hulls: GJK on the shape cores with radii as margins, Johnson's
sub-algorithm by enumeration, and a bounded EPA with centroid-oriented
faces and coplanar-visible removal for penetration depth and normal.

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.46s
✅ CPP clang-format 151 0 0 0 1.47s
✅ CPP cppcheck 151 0 0 2.53s
✅ DOCKERFILE hadolint 1 0 0 0.39s
✅ JSON jsonlint 8 0 0 0.08s
✅ JSON prettier 8 2 0 0 0.36s
✅ MARKDOWN markdownlint 118 0 0 0 1.78s
✅ MARKDOWN markdown-table-formatter 118 0 0 0 0.2s
⚠️ SPELL lychee 161 3 0 38.08s
✅ YAML prettier 12 0 0 0 0.41s
✅ YAML yamllint 12 0 0 0.44s

Detailed Issues

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

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

Errors in ROADMAP.md
[504] https://github.com/embedded-pro/numerical-toolbox-cpp/blob/main/doc/solvers/SymplecticIntegrators.md (at 53:89) | Rejected status code: 504 Gateway Timeout

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

- CableTensionDistribution: split Distribute into SolveFree and
  WorstViolation (cognitive complexity).
- ConvexCollision: extract ToggleHorizonEdge and AppendIfIndependent;
  loop conditions only test their counters (complexity, nesting,
  loop-invariant conditions).
- RrtConnect: invoke the forwarded callable directly in Shortcut.
- DeltaKinematics: azimuth tables as in-class static constexpr arrays.

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