Skip to content

feat: mobile wave roadmap items (F1, W1–W10, E2, M24) - #38

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

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

Conversation

@gabrielfrasantos

Copy link
Copy Markdown
Contributor

Bumps numerical-toolbox to dc147fb (SE2Transform, NT66) and ships every spec it unblocked, one commit per item.

Commit Item Module
2bc4125 Pin bump to dc147fb (NT66) build
02b0b45 F1 PlanarOdometry mobile (new)
af66097 W1 DifferentialDrive mobile
0c2bf08 W2 CarLikeKinematics mobile
45e1fa9 W3 OmnidirectionalKinematics mobile
f751642 + fc5a5b6 W4 SkidSteerKinematics + IcrEstimator (and a doc line wrap) mobile
f863c93 W5 PurePursuit + PlanarPath mobile
4e43110 W7 KanayamaController mobile
95641b0 W6 StanleyController mobile
7610314 W8 DubinsPath + CarPath planning
3246ceb E2 OccupancyGridMap localization (new)
7b5136e W9 DynamicWindowApproach planning
8f4cfc3 W10 ReedsSheppPath planning
52c607a M24 MobileManipulatorKinematics kinematics

Each commit includes the header, coverage .cpp, tests, doc, index rows, and removal of the spec and its roadmap rows.

Deviations from the specs

  • W5: the spec's goal rules contradicted its end-of-path test. Added a rule: when the last waypoint is within the look-ahead, it becomes the goal.
  • W6: an extra Restart() assertion in closed_loop_converges covers Restart.
  • W8:
    • Steering enumerators are PascalCase (Left, Straight, Right).
    • LSL and RSR compute their straight length as a hypotenuse, since their discriminant is a sum of squares, so the existence test could never fail.
    • Coincident positions take the start heading as the reference direction, so any start equal to its goal gives a zero-length path (not only the identity start).
  • W10: dropped the redundant u ≥ −π/2 check in 8.8, which ρ ≥ 0 already implies.
  • E2: extra IsOccupied and Parameters() assertions.
  • Coverage instantiations: Stanley <float, 4>, OccupancyGridMap <float, 10, 10> and DWA <float, 5, 11> are instantiated alongside the spec's sizes, to match the test types.
  • Docs and roadmap:
    • The roadmap/README.md canonical example now points to localization/OdometryFusion.
    • The NT66 link points to the upstream doc.
    • The emptied wheeled and planning ROADMAP.md tables are replaced by notes pointing to the shipped docs.
    • The README overview lists the shipped families.
    • Two long names in the README Kinematics row are abbreviated, to stay under the 400-character line limit.

Verification

  • Debug and coverage ctest: 7/7.
  • 100% merged line coverage on every new header.
  • Clang -Wall -Wextra -Werror -Wshadow with -DROBOTICS_TOOLBOX_COVERAGE_BUILD.
  • clang-format --dry-run --Werror on all changed C++.
  • scripts/validate-docs.py OK; no doc line over 400 characters; tables aligned.
  • Not run locally: Qt preset, MSVC, cppcheck, SonarCloud.

Generated by Claude Code

claude added 15 commits November 5, 2026 15:06
New mobile module. Dead reckoning on SE(2): exact arc integration of a
body twist with the SE(2) exponential and per-step renormalisation,
body-frame odometry increments through the logarithm, and the
increment noise model shared by the localization filters.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Unicycle kinematics of a two-wheel axle: forward and inverse maps,
curvature-preserving wheel saturation through the shared ScaleToLimit,
the achievable twist and the speed envelope.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Kinematic bicycle twist at the rear axle or any point ahead of it (the
SE(2) adjoint), steering for a curvature, steering angle and rate
limits, Ackermann wheel angles and the minimum turning radius.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Swedish-wheel and mecanum kinematics for any layout of three or more
wheels: wheel Jacobian, pseudo-inverse from one Cholesky factorization,
least-squares forward kinematics, slip residual and uniform saturation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
ICR model for skid-steered and tracked vehicles: forward kinematics with
lateral slip, inverse kinematics, shared curvature-preserving saturation
and a closed-form least-squares ICR estimator with an excitation check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
PlanarPath: bounded polyline with cumulative arc lengths, windowed
closest-point projection with signed cross-track, and interpolation by
arc length. PurePursuit: speed-scheduled look-ahead, monotone progress,
circle-exit goal with end-of-path and off-path fallbacks, and the
tangent-arc curvature command. The roadmap canonical example now points
at OdometryFusion.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Lyapunov-stable trajectory tracking for unicycle-type bases: the
reference is expressed in the robot frame and the feedforward velocity
is corrected along track, cross track and in heading, with a critically
damped gain helper. The roadmap index now links the shipped upstream
SE2Transform doc instead of its removed spec.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Front-axle Stanley steering law for car-like vehicles on a PlanarPath:
heading error plus a speed-softened arctangent of the cross-track error,
monotone path progress, and the vehicle's steering angle and rate
limits. Coverage instantiates the test path size alongside the spec's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
CarPath: up to five steering segments with signed lengths, total length
and sampling by arc length with the SE(2) exponential. DubinsPlanner:
closed-form evaluation of the six Dubins words with float-tolerant
existence tests and 2*pi snapping. LSL and RSR take their straight
length as a hypotenuse, since their discriminant is a sum of squares,
and coincident positions use the start heading as the reference
direction so any start equal to its goal gives a zero-length path.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
New localization module. Bounded log-odds occupancy grid updated from
range scans at known sensor poses: integer Bresenham rays clear the
crossed cells and mark the end cell, readings at maximum range only
clear, rays stop at the grid border and every cell is clamped. Cell
queries give log odds, probability and an occupancy test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Reactive local obstacle avoidance for unicycle-type bases: the dynamic
window of reachable velocities is sampled on a fixed grid, each sample's
closed-form arc clearance to body-frame obstacle points decides whether
it can still stop, and the admissible samples are scored on normalised
goal heading, clearance and speed. The README overview now lists the
shipped families.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Shortest paths for a bounded-curvature car that may reverse: the eight
Reeds-Shepp base formulas in OMPL's corrected form, expanded by time
flip, reflection and the backwards variants into 44 candidates, with
float-tolerant existence tests and the shared CarPath result. The
emptied wheeled and planning roadmap tables now point at the shipped
docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014WUWh44uw7k4JjMd6YkAwN
Combined world-frame Jacobian of a differential-drive base carrying an
arm: forward-speed and yaw-rate columns with the tool lever arm, and the
arm's geometric Jacobian rotated into the world through the base heading
and the mount. Also the composed tool pose and the no-slip base
constraint. Two long names in the README kinematics row are abbreviated
to keep the table under the 400-character line limit.

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.52s
✅ CPP clang-format 195 0 0 0 1.76s
✅ CPP cppcheck 195 0 0 3.17s
✅ DOCKERFILE hadolint 1 0 0 0.37s
✅ JSON jsonlint 8 0 0 0.09s
✅ JSON prettier 8 2 0 0 0.28s
✅ MARKDOWN markdownlint 94 0 0 0 2.0s
✅ MARKDOWN markdown-table-formatter 94 0 0 0 0.2s
⚠️ SPELL lychee 141 2 0 2.28s
✅ YAML prettier 12 0 0 0 0.44s
✅ YAML yamllint 12 0 0 0.46s

Detailed Issues

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

…micWindowApproach

ReedsSheppPlanner::Consider takes the formula and the length builder as
template parameters instead of function pointers, the radius scaling
loop iterates the segments directly, and Mirror uses 'using enum'.
DynamicWindowApproach loops to a compile-time sample count and assigns
each sample before reading it.

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