-
Notifications
You must be signed in to change notification settings - Fork 178
[WIP] Action support #410
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[WIP] Action support #410
Conversation
|
copy of 295 |
|
I'll have some time available beginning this week or next week, and I think the most valuable thing I can do for rclrs right now is help to get action generation finished so we can spin out I'll start by reviewing the current state of the PR and see if I can identify anywhere that I can help, but if @nwn has any guidance on where things could use attention then I'll be happy to take directions. |
Awesome, thanks @mxgrey! I haven't had the time to do much on this in the past month, but I'll try to organize things a bit so it's clearer what our next steps are. |
9e6f572 to
75fd275
Compare
|
In the interest of breaking this work into smaller pieces and also getting the message generation side merged sooner, I've split off all the |
|
@nwn Would you be able to describe what work remains, or what would enable this feature to move forward? Thank you so much for your contributions to this btw! |
|
@jonatanolofsson We're planning to resume working on actions by building off of #446 so that we can take advantage of async capabilities. It'll probably take a while for #446 to get through the review process because of how huge the changes are, but I'll probably start prototyping it soon, while the review is still ongoing. |
Update uses of a `Mutex<rcl_node_t>` with a `NodeHandle`, as was done elsewhere in the crate. Also, correct the documented UUID size to 16 rather than 24. The minimal_action_client compiles, but the minimal_action_server does not yet, complaining about expecting the `rmw` versions of messages rather than the idiomatic ones.
This provides a convenient RAII-style way to ensure that a function is always called when a specific value gets dropped.
This skips some of the steps that rclcpp performs, as they appear to be unnecessary. Testing should reveal whether that's true or not.
This trims the send_goal_response() function down to only be a wrapper around the rcl_action equivalent. In addition to improving logical separation, this also simplifies control flow when handling rejection.
Rather than having a bunch of standalone traits implementing various message functions like `ExtractUuid` and `SetAccepted`, with the trait bounds on each associated type in `ActionImpl`, we'll instead add these functions directly to the `ActionImpl` trait. This is simpler on both the rosidl_runtime_rs and the rclrs side.
This requires a mutex to enable simultaneous goal acceptance in a multithreaded executor. We also make ServerGoalHandles implement Send and Sync, since they will be accessed by multiple threads during callbacks. Due to containing a raw pointer field, the type doesn't automatically implement Send/Sync; however, we guarantee that the uses of this pointer is safe and synchronized, allowing us to safely implement the traits.
Adds a trait method to create a feedback message given the goal ID and the user-facing feedback message type. Depending on how many times we do this, it may end up valuable to define a GoalUuid type in rosidl_runtime_rs itself. We wouldn't be able to utilize the `RCL_ACTION_UUID_SIZE` constant imported from `rcl_action`, but this is pretty much guaranteed to be 16 forever. Defining this method signature also required inverting the super-trait relationship between Action and ActionImpl. Now ActionImpl is the sub-trait as this gives it access to all of Action's associated types. Action doesn't need to care about anything from ActionImpl (hopefully).
This still needs to be hooked up to the ActionServerGoalHandle, though.
These aren't actually implemented as callbacks like in rclcpp, but rather just regular method calls. This required making some of the ActionServer and ActionServerBase methods use an Arc receiver, but the ActionServer is only ever created within an Arc, so this is fine.
These now call into the action server to send a response to prior (queued) and future goal result requests. There are still some synchronization tweaks needed for this to be correct.
This adds methods to ActionImpl for creating and accessing action-specific message types. These are needed by the rclrs ActionClient to generically read and write RMW messages. Due to issues with qualified paths in certain places (rust-lang/rust#86935), the generator now refers directly to its service and message types rather than going through associated types of the various traits. This also makes the generated code a little easier to read, with the trait method signatures from rosidl_runtime_rs still enforcing type-safety.
Just the bare minimum to get things working after the rebase. Lots of clean-up still to do.
When compiling the examples that use the action client/server, you got "undefined reference" errors for any `rcl_action_*` functions during the linking phase. Telling rustc to link against the rcl_action shared library fixes this.
This matches the pattern used by the other endpoint structs.
This works similarly to the option struct used for the other endpoint types, except that it cannot use the PrimitiveOptions stuff since actions have multiple different QoS settings.
Signed-off-by: Michael X. Grey <[email protected]>
|
@mxgrey Impressive work! Thank you! |
* Remove lockfiles from being tracked Signed-off-by: Michael X. Grey <[email protected]> * Port draft action implementation from #410 Signed-off-by: Michael X. Grey <[email protected]> * Rework readiness for waitables Signed-off-by: Michael X. Grey <[email protected]> * Reworking action server goal handle lifecycles Signed-off-by: Michael X. Grey <[email protected]> * Fleshing out the state machines for action server goals -- cancelling is WIP Signed-off-by: Michael X. Grey <[email protected]> * Finished action server goal state machine API -- need to finish action_server.rs Signed-off-by: Michael X. Grey <[email protected]> * Progress on action_server implementation Signed-off-by: Michael X. Grey <[email protected]> * Action server finished -- needs testing Signed-off-by: Michael X. Grey <[email protected]> * Creating action server and action goal receiver -- needs testing Signed-off-by: Michael X. Grey <[email protected]> * Introducing action clients into the wait set processing Signed-off-by: Michael X. Grey <[email protected]> * Incorporate action clients into wait sets Signed-off-by: Michael X. Grey <[email protected]> * Fleshing out implementation of action clients Signed-off-by: Michael X. Grey <[email protected]> * Implementing goal status client Signed-off-by: Michael X. Grey <[email protected]> * Implementing goal result client Signed-off-by: Michael X. Grey <[email protected]> * CancellationClient API in progress Signed-off-by: Michael X. Grey <[email protected]> * Finish action cancellation request API Signed-off-by: Michael X. Grey <[email protected]> * Finish API for action clients -- needs testing Signed-off-by: Michael X. Grey <[email protected]> * Link against rcl_action Signed-off-by: Michael X. Grey <[email protected]> * Add initial tests and improve ergonomics Signed-off-by: Michael X. Grey <[email protected]> * Add co-author credit Co-authored-by: Nathan Wiebe Neufeldt <[email protected]> Signed-off-by: Michael X. Grey <[email protected]> * Re-export traits from rosidl_runtime_rs Signed-off-by: Michael X. Grey <[email protected]> * Update bindings to include actions -- added script for automating the binding generation Signed-off-by: Michael X. Grey <[email protected]> * Apply cargo fmt Signed-off-by: Michael X. Grey <[email protected]> * Update bindings for kilted Signed-off-by: Michael X. Grey <[email protected]> * Update bindings for humble Signed-off-by: Michael X. Grey <[email protected]> * Update bindings for rolling Signed-off-by: Michael X. Grey <[email protected]> * Fix use of serde Signed-off-by: Michael X. Grey <[email protected]> * Use desktop image so it includes rcl_action which we need for action bindings Signed-off-by: Michael X. Grey <[email protected]> * Fix serde Signed-off-by: Michael X. Grey <[email protected]> * Finish documentation for GoalClientStream Signed-off-by: Michael X. Grey <[email protected]> * Enable serde for goal status info Signed-off-by: Michael X. Grey <[email protected]> * Fix action cancellation pipeline Signed-off-by: Michael X. Grey <[email protected]> * More trait re-exports Signed-off-by: Michael X. Grey <[email protected]> * Add tests for action cancellation Signed-off-by: Michael X. Grey <[email protected]> * Fix use of action client options Signed-off-by: Michael X. Grey <[email protected]> * Fix style Signed-off-by: Michael X. Grey <[email protected]> * Remove use of .clear_poison because it is not stable in 1.75 Signed-off-by: Michael X. Grey <[email protected]> * chore: revert bindings-related changes (#5) Signed-off-by: Esteve Fernandez <[email protected]> * update rosidl_runtime_rs for action support (#6) Signed-off-by: Esteve Fernandez <[email protected]> * revert bindings generation changes --------- Signed-off-by: Michael X. Grey <[email protected]> Signed-off-by: Michael X. Grey <[email protected]> Signed-off-by: Esteve Fernandez <[email protected]> Co-authored-by: Nathan Wiebe Neufeldt <[email protected]> Co-authored-by: Esteve Fernandez <[email protected]>
* Remove lockfiles from being tracked Signed-off-by: Michael X. Grey <[email protected]> * Port draft action implementation from #410 Signed-off-by: Michael X. Grey <[email protected]> * Rework readiness for waitables Signed-off-by: Michael X. Grey <[email protected]> * Reworking action server goal handle lifecycles Signed-off-by: Michael X. Grey <[email protected]> * Fleshing out the state machines for action server goals -- cancelling is WIP Signed-off-by: Michael X. Grey <[email protected]> * Finished action server goal state machine API -- need to finish action_server.rs Signed-off-by: Michael X. Grey <[email protected]> * Progress on action_server implementation Signed-off-by: Michael X. Grey <[email protected]> * Action server finished -- needs testing Signed-off-by: Michael X. Grey <[email protected]> * Creating action server and action goal receiver -- needs testing Signed-off-by: Michael X. Grey <[email protected]> * Introducing action clients into the wait set processing Signed-off-by: Michael X. Grey <[email protected]> * Incorporate action clients into wait sets Signed-off-by: Michael X. Grey <[email protected]> * Fleshing out implementation of action clients Signed-off-by: Michael X. Grey <[email protected]> * Implementing goal status client Signed-off-by: Michael X. Grey <[email protected]> * Implementing goal result client Signed-off-by: Michael X. Grey <[email protected]> * CancellationClient API in progress Signed-off-by: Michael X. Grey <[email protected]> * Finish action cancellation request API Signed-off-by: Michael X. Grey <[email protected]> * Finish API for action clients -- needs testing Signed-off-by: Michael X. Grey <[email protected]> * Link against rcl_action Signed-off-by: Michael X. Grey <[email protected]> * Add initial tests and improve ergonomics Signed-off-by: Michael X. Grey <[email protected]> * Add co-author credit Co-authored-by: Nathan Wiebe Neufeldt <[email protected]> Signed-off-by: Michael X. Grey <[email protected]> * Re-export traits from rosidl_runtime_rs Signed-off-by: Michael X. Grey <[email protected]> * Update bindings to include actions -- added script for automating the binding generation Signed-off-by: Michael X. Grey <[email protected]> * Apply cargo fmt Signed-off-by: Michael X. Grey <[email protected]> * Update bindings for kilted Signed-off-by: Michael X. Grey <[email protected]> * Update bindings for humble Signed-off-by: Michael X. Grey <[email protected]> * Update bindings for rolling Signed-off-by: Michael X. Grey <[email protected]> * Fix use of serde Signed-off-by: Michael X. Grey <[email protected]> * Use desktop image so it includes rcl_action which we need for action bindings Signed-off-by: Michael X. Grey <[email protected]> * Fix serde Signed-off-by: Michael X. Grey <[email protected]> * Finish documentation for GoalClientStream Signed-off-by: Michael X. Grey <[email protected]> * Enable serde for goal status info Signed-off-by: Michael X. Grey <[email protected]> * Fix action cancellation pipeline Signed-off-by: Michael X. Grey <[email protected]> * More trait re-exports Signed-off-by: Michael X. Grey <[email protected]> * Add tests for action cancellation Signed-off-by: Michael X. Grey <[email protected]> * Fix use of action client options Signed-off-by: Michael X. Grey <[email protected]> * Fix style Signed-off-by: Michael X. Grey <[email protected]> * Remove use of .clear_poison because it is not stable in 1.75 Signed-off-by: Michael X. Grey <[email protected]> * chore: revert bindings-related changes (#5) Signed-off-by: Esteve Fernandez <[email protected]> * update rosidl_runtime_rs for action support (#6) Signed-off-by: Esteve Fernandez <[email protected]> * revert bindings generation changes --------- Signed-off-by: Michael X. Grey <[email protected]> Signed-off-by: Michael X. Grey <[email protected]> Signed-off-by: Esteve Fernandez <[email protected]> Co-authored-by: Nathan Wiebe Neufeldt <[email protected]> Co-authored-by: Esteve Fernandez <[email protected]>
Picking up @esteve's work in #295 to add support for actions.