Skip to content
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

Support zero-copy intra-process publishing #306

Merged
merged 15 commits into from
May 16, 2024

Conversation

bjsowa
Copy link
Contributor

@bjsowa bjsowa commented Apr 22, 2024

ROS2 supports intra-process communication when composing multiple nodes in a single process. It additionally can avoid doing any copies of the data when published using std::unique_ptr<MessageT> and subscribed using shared_ptr<const MessageT> or std::unique_ptr<MessageT> (at most 1 subscriber)

This PR is my attempt to add support for publishing using std::unique_ptr without breaking any of the existing APIs.

The idea is that:

  1. Each publisher plugin can decide whether they support publishing using unique ptr (for now I don't see how any other plugin than raw can take advantage of the ownership).
  2. The new Publisher::publish(sensor_msgs::msg::Image::UniquePtr message) method first publishes using the const reference to plugins that don't support std::unique_ptr, then moves the ownership of the message to (at most 1) plugin that supports it.
  3. If there is more than one plugin that supports std::unique_ptr and has subscriptions, we pass the ownership to only one such plugin (the first we find), and for the rest we still use const reference, delegating doing any extra copies to plugin implementations.

Related issues/prs:
#212
#215
#216 (kinda)

Copy link
Collaborator

@ahcorde ahcorde left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are you planning to make some changes in image_transport_plugins too ? using this new API ?

image_transport/src/publisher.cpp Outdated Show resolved Hide resolved
image_transport/src/camera_publisher.cpp Outdated Show resolved Hide resolved
image_transport/src/publisher.cpp Show resolved Hide resolved
@bjsowa
Copy link
Contributor Author

bjsowa commented Apr 22, 2024

are you planning to make some changes in image_transport_plugins too ? using this new API ?

I don't see how the compressed image transports can take advantage of the image ownership as they still have to copy the data, BUT they might avoid copying the resulting compressed data by publishing it using std::unique_ptr so I was planning to make them use the more generic publish(const sensor_msgs::msg::Image & message, const PublisherT & publisher) method to publish unique_ptr instead of const reference.

@bjsowa bjsowa requested a review from ahcorde April 22, 2024 14:03
@bjsowa
Copy link
Contributor Author

bjsowa commented Apr 29, 2024

I marked the method as deprecated. Also, I think that we should not add default implementations that are empty or don't make sense. I also can't make these methods abstract, so instead I just throw exceptions. @ahcorde What do you think?

@bjsowa bjsowa requested a review from ahcorde April 29, 2024 02:12
@ahcorde ahcorde requested a review from mikeferguson May 15, 2024 11:10
Copy link
Member

@mikeferguson mikeferguson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems reasonable to me

@ahcorde
Copy link
Collaborator

ahcorde commented May 15, 2024

  • Linux Build Status
  • Linux-aarch64 Build Status
  • Windows Build Status

@ahcorde ahcorde merged commit fd51363 into ros-perception:rolling May 16, 2024
2 checks passed
@bjsowa
Copy link
Contributor Author

bjsowa commented May 16, 2024

@ahcorde Could this be backported to Jazzy?

@ahcorde
Copy link
Collaborator

ahcorde commented May 16, 2024

https://github.com/Mergifyio backport jazzy

Copy link

mergify bot commented May 16, 2024

backport jazzy

✅ Backports have been created

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.

3 participants