Repository navigation
feat: wave 4 roadmap items (M32, M12, M11, M14, M10, P2) - #35
Merged
Merged
Conversation
ToolWrench carries the environment's force and moment at the tool point. The new InverseDynamics overload subtracts it from the last link's load in the backward pass, which satisfies tau(w) - tau(0) = -J^T w. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Feedback-linearizing joint controller: a_q = qdd_d + Kd e_dot + Kp e, then tau = ID(q, qdot, a_q) in one InverseDynamicsModel call, which gives decoupled error dynamics. Adds a MockInverseDynamicsModel test double. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Yoshikawa index through the unit-consistent Gram determinant (J J^T or J^T J, whichever is not rank-deficient by shape), velocity-ellipsoid axes and condition number through the SVD, and a near-singular guard, all over a JacobianProvider. Adds a MockJacobianProvider test double. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
qdot = J+_lambda xdot + (I - J+ J) qdot0 over a JacobianProvider, on upstream solvers::DampedPseudoInverse (NT62). The undamped, rank-thresholded projector keeps secondary motion invisible to the task for any damping. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Straight-line position and shortest-arc quaternion SLERP driven by one time law (template parameter, no virtual call), with the twist feed-forward (v; omega) = sdot (p1 - p0; phi k) computed from the sign-fixed quaternion pair. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Quadratic-then-conic attraction plus Khatib repulsion from proximity readings, clamped to a maximum speed. Each command reports moving, reached or stalled, so local minima are detected rather than hidden. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
✅
|
| Descriptor | Linter | Files | Fixed | Errors | Max errors | Warnings | Elapsed time |
|---|---|---|---|---|---|---|---|
| ✅ ACTION | actionlint | 7 | 0 | 0 | 0.48s | ||
| ✅ CPP | clang-format | 89 | 0 | 0 | 0 | 0.96s | |
| ✅ CPP | cppcheck | 89 | 0 | 0 | 1.37s | ||
| ✅ DOCKERFILE | hadolint | 1 | 0 | 0 | 0.36s | ||
| ✅ JSON | jsonlint | 8 | 0 | 0 | 0.09s | ||
| ✅ JSON | prettier | 8 | 2 | 0 | 0 | 0.32s | |
| ✅ MARKDOWN | markdownlint | 152 | 0 | 0 | 0 | 1.85s | |
| ✅ MARKDOWN | markdown-table-formatter | 152 | 0 | 0 | 0 | 0.19s | |
| lychee | 195 | 2 | 0 | 16.09s | |||
| ✅ YAML | prettier | 12 | 0 | 0 | 0 | 0.43s | |
| ✅ YAML | yamllint | 12 | 0 | 0 | 0.47s |
Detailed Issues
⚠️ SPELL / lychee - 2 errors
[ERROR] failed to verify TLS certificate: invalid peer certificate: UnknownIssuer
📝 Summary
---------------------
🔍 Total..........217
🔗 Unique..........93
✅ Successful.....205
⏳ 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
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

Show us your support by starring ⭐ the repository
MSVC (C2244) cannot match the out-of-class definition when its return type spells the dependent static member as std::array<T, ManipulabilityIndex<...>::Axes>. An AxesArray alias, referenced as typename ...::AxesArray like the rest of the library, builds on MSVC, GCC and Clang. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



This PR is wave 4 of the roadmap: the small consumers that build on the wave-3 foundation (frame chain, geometric Jacobian, chain dynamics model). The wave's mobile items (W4–W8) still wait on SE(2) (NT66) in numerical-toolbox-cpp.
As in earlier waves, each item is one self-contained commit following
roadmap/DEPLOYMENT.md:.cpp;roadmap/spec and its rows inROADMAP.mdandroadmap/README.md.Items
b89828aToolWrenchplus anInverseDynamicsoverload that subtracts the environment's wrench in the backward pass. Satisfies τ(w) − τ(0) = −Jᵀw, which the tests check againstGeometricJacobian.22f7d63InverseDynamicsModelcall. With an exact model, the plant's tracking error matches the ideal error dynamics ë + Kd·ė + Kp·e = 0 step by step in closed loop.cb58fd9JacobianProvider.0d855a2solvers::DampedPseudoInverse(NT62). The projector is undamped and rank-thresholded, so secondary motion never reaches the task for any damping λ.cf7a452b47f46eMoving,ReachedorStalled, so local minima are detected rather than hidden.Changes from the specs
dynamics::MockInverseDynamicsModelinrobotics.dynamics_test_doubles, for M12.kinematics::MockJacobianProviderin a newrobotics.kinematics_test_doublestarget, for M11.undamped_primary_task_is_exacttest also asserts J·J⁺ = I. This covers theDampedPseudoInverse(q)accessor, which no spec case exercised.FieldStatusvalues are PascalCase (Moving,Reached,Stalled) to match the repo's other enums. The spec had them lowercase.robotics.trajectorynow linksnumerical.motion_profiles, and the dynamics test target linksrobotics.kinematicsfor the M32 Jacobian cross-check.Verification
host-single-Debugbuild and the coverage build (EMIL_ENABLE_COVERAGE=On) both pass 5/5 test executables.scripts/validate-docs.pypass. No doc line exceeds markdownlint's 400-character limit, and doc tables are aligned.Not run locally: the Qt simulator build, cppcheck, and SonarCloud. CI covers these.
Generated by Claude Code