Skip to content

feat: wave 3 roadmap items (M1, M30, M8, M7, M29) - #34

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

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

Conversation

@gabrielfrasantos

Copy link
Copy Markdown
Contributor

Wave 3 of the roadmap is the manipulator foundation that about 25 later items build on. Like wave 1, each item is one self-contained commit per roadmap/DEPLOYMENT.md: header, coverage .cpp, the spec's test cases, CMake, doc page and doc-table rows. Each commit also deletes its roadmap/ spec and the matching rows in ROADMAP.md and roadmap/README.md.

Items

Commit Item Summary
26ddc25 M1 JointLink Generic link: joint type (revolute or prismatic), JointLimits, armature, JointTransform(q) and the motion subspace (AngularAxis/LinearAxis). FK, IK, RNEA, ABA and CRBA now go through the motion subspace, so revolute and prismatic joints share one code path. The prismatic Coriolis term and force projection are included, and armature adds to the joint-space inertia. RevoluteJointLink stays as an alias, so existing aggregate initializers and the simulator compile unchanged.
d4106f4 M30 ChainPoseKinematics Full tool pose (math::SE3Transform) plus the model-independent FrameChain: joint origins, axes and types in the base frame.
9acd4cc M8 + M7 GeometricJacobian, DenavitHartenberg M8: 6×N geometric Jacobian, bias acceleration J̇q̇ and statics Jᵀw from any FrameChain, behind the JacobianProvider interface, with ChainTaskJacobian (link model) and DhTaskJacobian (DH) implementations. M7: standard and modified DH tables with constant joint offsets. IK now uses the shared Jacobian instead of its private 3×N one.
7bf2027 M29 ChainDynamicsModel Implements EulerLagrangeDynamics (M via CRBA, C·q̇ and g via RNEA) and the new one-call InverseDynamicsModel, with SetLinks for payload changes.

Changes from the specs

  • M7 and M8 are one commit. M7's DhTaskJacobian implements M8's interface, and an M8 test compares a DH arm with a link arm, so neither can ship first.
  • Central differences: the Jacobian finite-difference tests use central differences, which gives more margin at the same step size.
  • Extra assertions:
    • The ChainTaskJacobian test also compares the J̇q̇ rows and the tool pose of the 3-row and 6-row versions.
    • The PUMA-560 DH test goes through DhTaskJacobian, which exercises the adapter.
  • IK prismatic support: IK previously ignored the joint type; it now handles prismatic joints through the shared Jacobian.

Verification

  • host-single-Debug and the coverage build (EMIL_ENABLE_COVERAGE=On): 5/5 test executables pass.
  • Merged gcov line coverage of the new and changed headers is 100%, except DhTaskJacobian::BiasAcceleration (2 lines, which forward to the fully tested GeometricJacobian).
  • Prismatic correctness was cross-checked outside the spec tests:
    • CRBA columns match RNEA to 6e-8 on a revolute–prismatic–revolute chain.
    • ABA reproduces RNEA's input accelerations to 1e-6.
    • CRBA kinetic energy matches an independent per-link sum, armature included.
    • J̇q̇ (values 0.1–0.7) matches a central difference to 2.5e-5.
  • Clang 18 -Wall -Wextra -Werror syntax check of the new translation units is clean. clang-format and scripts/validate-docs.py pass, and no doc line exceeds markdownlint's 400-character limit.
  • The simulator's RobotArmSimulator.cpp (which uses the links) still compiles.

Not run locally: the full Qt simulator build, cppcheck and SonarCloud. CI covers these.

Next

Wave 4 (M32, M12, M11, M14, M10, P2) needs nothing upstream. Wave 2 (mobile) still waits on SE(2) (NT66) in numerical-toolbox-cpp.


Generated by Claude Code

…nd armature (M1)

JointLink replaces the revolute-only link (RevoluteJointLink stays as an
alias, so existing aggregate initializers compile unchanged). FK, IK,
RNEA, ABA and CRBA now work through each joint's motion subspace, so
revolute and prismatic joints share one code path; armature adds to the
joint-space inertia.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Full tool pose on SE(3) plus every joint origin, axis and type in the
base frame, in one O(n) pass over the generic link model. The frame
chain is the model-independent input for the geometric Jacobian.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
GeometricJacobian builds the 6xN Jacobian, the bias acceleration and
the statics map from any FrameChain, with revolute and prismatic
columns. JacobianProvider is the seam for task-space consumers;
ChainTaskJacobian and DhTaskJacobian implement it for link models and
DH tables. DenavitHartenberg covers standard and modified conventions
with constant joint offsets. InverseKinematics now uses the shared
Jacobian instead of its private 3xN one. M7 and M8 ship together
because each one's tests need the other.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Adapter from a link chain to the manipulator equation. It implements
EulerLagrangeDynamics (M via CRBA, C qdot and g via RNEA) and the new
one-call InverseDynamicsModel used by computed-torque control. SetLinks
handles payload changes.

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.47s
✅ CPP clang-format 72 0 0 0 0.91s
✅ CPP cppcheck 72 0 0 1.28s
✅ DOCKERFILE hadolint 1 0 0 0.32s
✅ JSON jsonlint 8 0 0 0.08s
✅ JSON prettier 8 2 0 0 0.31s
✅ MARKDOWN markdownlint 165 0 0 0 2.15s
✅ MARKDOWN markdown-table-formatter 165 0 0 0 0.2s
⚠️ SPELL lychee 207 2 0 2.2s
✅ YAML prettier 12 0 0 0 0.44s
✅ YAML yamllint 12 0 0 0.45s

Detailed Issues

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

@sonarqubecloud

sonarqubecloud Bot commented Nov 5, 2026

Copy link
Copy Markdown

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