Re: [ros-users] Nodelet image transfer performance

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: Joel Cartwright
Date:  
To: ros-users
Subject: Re: [ros-users] Nodelet image transfer performance
Josh,

That's just what I was looking for - thanks. Performance is vastly
improved now, down to about 12% CPU usage on the same within-nodelet test.

Joel

Josh Faust wrote, On 17/09/10 10:30:
> Intraprocess publishing is only significantly faster if you're
> publishing a shared_ptr to the message, otherwise it still has to
> serialize/deserialize as usual.
>
> So instead of keeping an image as part of the class, filling that image,
> and then publishing it, you need to allocate the image each time you
> publish:
> sensor_msgs::ImagePtr image(new sensor_msgs::Image);
> sensor_msgs::fillImage(*image, "bgr8", height, width, 3 * width, data);
> pub_.publish(image);
>
> It doesn't look like this is explained anywhere on the wiki other than
> the cturtle release
> notes: http://www.ros.org/wiki/ROS/ChangeList/1.2/roscpp_changes#Publish.2BAC8-Subscribe_Changes,
> I'll remedy that tomorrow.
>
> Josh
>
> On Fri, Sep 17, 2010 at 1:01 AM, Cartwright, Joel J
> < <mailto:J.J.Cartwright@hw.ac.uk>> wrote:
>
>     Hi all,

>
>     I've been running some rough performance tests on transferring images
>     using nodelets, and have found the overhead to be higher than I
>     expected. For reference, I'm running ROS cturtle on Ubuntu 10.04 64 bit
>     (stock kernel 2.6.32-24-generic) on a 2 GHz Intel Core 2 Duo laptop. CPU
>     use monitored approximately using htop.

>
>     Exchanging one 1920x1280 bgr8 image at 10 fps incurs ~30% CPU use for
>     the nodelet manager. As expected, this is better than when the nodelets
>     are run standalone (then ~25% CPU each), but I wanted to check if I'm
>     doing something wrong that might affect nodelet performance. I've been
>     using raw Image publishing rather than image_transport, to keep the test
>     as simple as possible.

>
>     The image 'source' is just an uninitialised unsigned char array of the
>     correct size. As a comparison, I created a node that merely copies the
>     source array a number of times, and found that 5 memcpy operations
>     produce about the same CPU load as the best nodelet case, around 30%.
>     Of course CPU caching may improve the speed of those 5 consecutive
>     memcpy operations, so I'm not saying "ROS is copying the data 5 times".

>
>     I've attached the relevant source files. The question is: Is this the
>     best we can do at present for image transfer, and if not, are there
>     modifications on the horizon that will improve performance?

>
>     Joel
>     --
>     Research Assistant
>     Ocean Systems Laboratory
>     Heriot-Watt University, UK

>
>
>     ------------------------------------------------------------------------
>     Heriot-Watt University is a Scottish charity registered under
>     charity number SC000278.

>
>     _______________________________________________
>     ros-users mailing list
>      <mailto:ros-users@code.ros.org>
>     https://code.ros.org/mailman/listinfo/ros-users

>
>
>
>
> _______________________________________________
> ros-users mailing list
>
> https://code.ros.org/mailman/listinfo/ros-users


--
Research Assistant
Ocean Systems Laboratory
Heriot-Watt University, UK