Fuzzy-matching Trajectory Cache Injectable Traits refactor 🔥🔥 (backport #2941)#3408
Merged
Fuzzy-matching Trajectory Cache Injectable Traits refactor 🔥🔥 (backport #2941)#3408
Conversation
* Implement trajectory cache Signed-off-by: methylDragon <methylDragon@gmail.com> * Add README Signed-off-by: methylDragon <methylDragon@gmail.com> * Move test cpp to test directory Signed-off-by: methylDragon <methylDragon@gmail.com> * Clean up logging and comments Signed-off-by: methylDragon <methylDragon@gmail.com> * Use move_group node for time Signed-off-by: methylDragon <methylDragon@gmail.com> * Add and use logger Signed-off-by: methylDragon <methylDragon@gmail.com> * Use new move_group accessors Signed-off-by: methylDragon <methylDragon@gmail.com> * Coerce variable and method names to style Signed-off-by: methylDragon <methylDragon@gmail.com> * Formatting pass Signed-off-by: methylDragon <methylDragon@gmail.com> * Add docstrings Signed-off-by: methylDragon <methylDragon@gmail.com> * Add ability to sort in descending order Signed-off-by: methylDragon <methylDragon@gmail.com> * Add RFE for custom cost functions Signed-off-by: methylDragon <methylDragon@gmail.com> * Formatting pass Signed-off-by: methylDragon <methylDragon@gmail.com> * Fix build for downstream packages Signed-off-by: methylDragon <methylDragon@gmail.com> * Always get some workspace frame ID Signed-off-by: methylDragon <methylDragon@gmail.com> * Always get some cartesian path request frame ID Signed-off-by: methylDragon <methylDragon@gmail.com> * Fix tests Signed-off-by: methylDragon <methylDragon@gmail.com> * Add const qualifiers as appropriate Signed-off-by: methylDragon <methylDragon@gmail.com> * Add accessors, and support for preserving K plans Signed-off-by: methylDragon <methylDragon@gmail.com> * Edit docs and rename puts to inserts Signed-off-by: methylDragon <methylDragon@gmail.com> * Make clang tidy happy Signed-off-by: methylDragon <methylDragon@gmail.com> * Fix CMakeLists.txt Signed-off-by: methylDragon <methylDragon@gmail.com> * Make getters const Signed-off-by: methylDragon <methylDragon@gmail.com> * Clarify frame ID utils docstrings Signed-off-by: methylDragon <methylDragon@gmail.com> * Elaborate on trajectory cache benefits Signed-off-by: methylDragon <methylDragon@gmail.com> * Fix CHANGELOG, and make library shared Signed-off-by: methylDragon <methylDragon@gmail.com> * Add utils library with test fixtures Signed-off-by: methylDragon <methylDragon@gmail.com> * Add features interface with constant features Signed-off-by: methylDragon <methylDragon@gmail.com> * Add constraint feature extractor utils Signed-off-by: methylDragon <methylDragon@gmail.com> * Add RobotState.joint_state feature extractor utils Signed-off-by: methylDragon <methylDragon@gmail.com> * Add MotionPlanRequest features Signed-off-by: methylDragon <methylDragon@gmail.com> * Add GetCartesianPlanRequest features Signed-off-by: methylDragon <methylDragon@gmail.com> * Use namespace declarations and do cleanups Signed-off-by: methylDragon <methylDragon@gmail.com> * Add CacheInsertPolicyInterface and AlwaysInsertNeverPrunePolicy Signed-off-by: methylDragon <methylDragon@gmail.com> * Add CartesianAlwaysInsertNeverPrunePolicy Signed-off-by: methylDragon <methylDragon@gmail.com> * Init policy features on construction Signed-off-by: methylDragon <methylDragon@gmail.com> * Add execution time extraction util Signed-off-by: methylDragon <methylDragon@gmail.com> * Add BestSeenExecutionTimePolicy and rename methods Signed-off-by: methylDragon <methylDragon@gmail.com> * Add CartesianBestSeenExecutionTimePolicy Signed-off-by: methylDragon <methylDragon@gmail.com> * Return reason string from cache insert policy methods Signed-off-by: methylDragon <methylDragon@gmail.com> * Refactor TrajectoryCache to use the interfaces Signed-off-by: methylDragon <methylDragon@gmail.com> * Move test fixtures to their own directory Signed-off-by: methylDragon <methylDragon@gmail.com> * Fix bugs and build Signed-off-by: methylDragon <methylDragon@gmail.com> * Fix formatting and clang-tidy Signed-off-by: methylDragon <methylDragon@gmail.com> * Update CHANGELOG Signed-off-by: methylDragon <methylDragon@gmail.com> * Make clang-tidy happy Signed-off-by: methylDragon <methylDragon@gmail.com> * Update README Signed-off-by: methylDragon <methylDragon@gmail.com> * Enable unrelated query matching test Signed-off-by: methylDragon <methylDragon@gmail.com> * Make libraries shared Signed-off-by: methylDragon <methylDragon@gmail.com> * Sidestep deprecation warning for computeCartesianPath Signed-off-by: methylDragon <methylDragon@gmail.com> * Fix typo in trajectory cache utils test Signed-off-by: methylDragon <methylDragon@gmail.com> * Exclude test on humble * Add missing header * Use precrement for for loops Signed-off-by: methylDragon <methylDragon@gmail.com> * Use constref in range-based for loops in utils where possible Signed-off-by: methylDragon <methylDragon@gmail.com> * Reserve vectors in getSupportedFeatures Signed-off-by: methylDragon <methylDragon@gmail.com> * Fix README and CHANGELOG Signed-off-by: methylDragon <methylDragon@gmail.com> * Add and use restateInNewFrame util function Signed-off-by: methylDragon <methylDragon@gmail.com> * Attempt to fix policy test Signed-off-by: methylDragon <methylDragon@gmail.com> * Use .hpp instead of .h Signed-off-by: methylDragon <methylDragon@gmail.com> * Undo CHANGELOG changes Signed-off-by: methylDragon <methylDragon@gmail.com> * Use const ref strings for restateInNewFrame Signed-off-by: methylDragon <methylDragon@gmail.com> * Add clarificatory comment to tests and fix formatting Signed-off-by: methylDragon <methylDragon@gmail.com> * Fix compile error * Use constref shared_ptr in restateInNewFrame Signed-off-by: methylDragon <methylDragon@gmail.com> * Mitigate cartesian path tests Signed-off-by: methylDragon <methylDragon@gmail.com> * Mitigate test flakiness Signed-off-by: methylDragon <methylDragon@gmail.com> * Allow -11 for move_group gtest fixture Signed-off-by: methylDragon <methylDragon@gmail.com> * Make execution times in test deterministic Signed-off-by: methylDragon <methylDragon@gmail.com> --------- Signed-off-by: methylDragon <methylDragon@gmail.com> Co-authored-by: Sebastian Jahr <sebastian.jahr@picknik.ai> Co-authored-by: Sebastian Jahr <sebastian.jahr@tuta.io> Co-authored-by: Sebastian Castro <4603398+sea-bass@users.noreply.github.com> (cherry picked from commit a12f327)
sea-bass
approved these changes
Mar 30, 2025
Contributor
sea-bass
left a comment
There was a problem hiding this comment.
Decided to backport this so the main branch of tutorials works on Jazzy
stephanie-eng
approved these changes
Mar 30, 2025
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## jazzy #3408 +/- ##
==========================================
+ Coverage 44.78% 46.23% +1.45%
==========================================
Files 701 717 +16
Lines 61903 62600 +697
Branches 7499 7572 +73
==========================================
+ Hits 27718 28936 +1218
+ Misses 34017 33499 -518
+ Partials 168 165 -3 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
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.
As requested in the original PR, this PR refactors the TrajectoryCache to allow users to inject their own behaviors (which will allow them to cache on and sort by any arbitrary feature, as long as it can be represented as a series of warehouse_ros columns).
Depends on:
Builds on top of:
TODOs:
Preamble
I apologize that this PR is even larger than the one it builds on top of. Most of the added lines are docstrings or tests, and boilerplate to support the behavior injection pattern this refactor is concerned with.
On the other hand, the average file length has decreased, so the code is MUCH more modular and hopefully easy to digest.
I can't split up this PR into multiple smaller ones since technically speaking, in order to preserve cache functionality, all the feature extractors and cache insert policies introduced in this PR will need to go in together.
I would suggest looking at the tests to aid in review (they run the gamut of unit and integration tests).
You can also build and run the example:
PS: If the size is still prohibitive, and we are okay with having partial implementations live in moveit2 while reviews are pending, let me know and I will split up the PR into smaller PRs (though I suspect at that point, that a logical number of splits might end up being somewhere close to 5-10 PRs.)
Navigating This PR
Since this PR is so large, here is a proposed order for comprehending the PR.
features/features_interface.hpp,cache_insert_policies/cache_insert_policy_interface.hppfeatures/,cache_insert_policies/trajectory_cache.hpp,trajectory_cache.cppAdditionally, all docstrings are filled, including file ones, as appropriate. So hopefully any clarificatory questions would have already been pre-empted and answered.
Description
This PR builds on top of the fuzzy-matching Trajectory Cache introduced in:
The implementation in that PR coupled the cache tightly with assumptions about what features to extract and sort by (i.e., a specific set of start/goal constraints, and pruning by execution time.)
This means that users who might want to store different features or a subset of those features, or who might want to fetch and prune on different features (e.g., minimum jerk, path length, etc.) will be unable to.
This PR refactors the cache to allow users to inject their own feature extractors and pruning/insertion logic!
This is done by introducing two new abstract classes that can be injected into the cache methods, acting a lot like class "traits":
FeaturesInterface<>: Governs what query/metadata items to extract and append to the warehouse_ros query.CacheInserterInterface<>: Governs the pruning and insertion logic.For more details on FeaturesInterface, see the Docstrings: https://github.com/moveit/moveit2/blob/cc0feb37cf423076e133523ccdbbf3038b84a01e/moveit_ros/trajectory_cache/include/moveit/trajectory_cache/features/features_interface.hpp
Some notes:
Example
In other words, before. the cache was used like this:
Now the cache is used like this:
See the motion plan request features here: 79b7f95
The Feature Contract
Users may use an instance of FeaturesInterface<> to fetch a cache entry only if it was supported by the CacheInserterInterface<> instance that they used (or on insert, the feature was added in additional_features).
I could not think of a way to create a coupling between uses of the cache inserters and the features. This is the cost of generality and allowing users to inject arbitrary logic into the cache.
As such, users must take care to look at the docs of the cache inserter to see what features can be used with them.
(This can be mitigated by adding helper methods to get "standard" bundles of features and a "standard" CacheInserter.)
Bonus
I added new features to the default feature extractors set and cleaned up some utilities!
There are now
FeaturesInterface<>implementations that can handle path and trajectory constraints!Multiple goal constraints are also handled (at the cost of increased cardinality.)
I also added "atomic" features that wrap the basic ops you can do with warehouse_ros, to allow users to specify their own metadata to tag cache entries with.
Here: cc0feb3
Pre-Existing Support
The package now provides some starter implementations that covers most general cases of motion planning.
For more information, see the implementations of:
FeaturesInterfaceCacheInsertPolicyInterfaceCache Keying Features
The following are features of the plan request and response that you can key the cache on.
These support separately configurable fuzzy lookup on start and goal conditions!
Additionally, these features "canonicalize" the inputs to reduce the cardinality of the cache, increasing the chances of cache hits. (e.g., restating poses relative to the planning frame).
Supported Features:
WorkspaceFeatures: Planning workspaceStartStateJointStateFeatures: Starting robot joint stateMaxSpeedAndAccelerationFeatures: Max velocity, acceleration, and cartesian speed limitsGoalConstraintsFeatures: Planning requestgoal_constraintsPathConstraintsFeatures: Planning requestpath_constraintsTrajectoryConstraintsFeatures: Planning requesttrajectory_constraintsAdditionally, support for user-specified features are provided for query-only or cache metadata tagging constant features.
Similar support exists for the cartesian variants of these.
Cache Insert and Pruning Policies
The following are cache insertion and pruning policies to govern when cache entries are inserted, and how they are (optionally) pruned.
Supported Cache Insert Policies:
BestSeenExecutionTimePolicy: Only insert best seen execution time, optionally prune on best execution time.AlwaysInsertNeverPrunePolicy: Always insert, never pruneCaveat
The increased functionality is now no longer 100% covered. But I tried adding tests where I had time to. I am unfortunately running out of time to iterate on this, so let's be targeted with the improvements!
Build/Test
Precommit with: