Slow publisher with callback
Hi,
I am publishing images with the usb_cam
package on a PC and subscribing to them with an arm-based system, using the following code:
#include "ros/ros.h"
#include "sensor_msgs/Image.h"
class SubscribeAndPublish
{
public:
SubscribeAndPublish()
{
//Topic to publish
pub_ = n_.advertise<sensor_msgs::Image>("/filteredHW", 1);
//Topic to subscribe
sub_ = n_.subscribe("/usb_cam/image_raw", 1, &SubscribeAndPublish::callback, this);
}
void callback(const sensor_msgs::Image& input)
{
sensor_msgs::Image output;
output.header = input.header;
output.encoding = input.encoding;
output.height = input.height;
output.width = input.width;
output.step = input.step;
output.data = input.data;
pub_.publish(output);
}
private:
ros::NodeHandle n_;
ros::Publisher pub_;
ros::Subscriber sub_;
};//End of class SubscribeAndPublish
int main(int argc, char **argv)
{
//Initiate ROS
ros::init(argc, argv, "subscribe_and_publish_grayScale");
//Create an object of class SubscribeAndPublish that will take care of everything
SubscribeAndPublish SAPObject;
ros::spin();
return 0;
}
I am getting a new image on /usb_cam/image_raw at 30 Hz. However, the one that is being publish on the callback (/filteredHW) ends up at 20 Hz just by subscribing and re-publishing it.
Is there a better way to do this, to have the same rate? Note that no processing has been done so far, which would slow things down ever further.
Thank you.
Aren't you doing more than that?
input
is copied over tooutput
which is going to take some time, especiallyoutput.data = input.data
. What if you directly publishinput
?Publishing directly is reduces a bit the frequency but not that much. The processor is running at 666MHz, so copying a 640x480 RGB image should take roughly 1.38 ms. I am only copying with
output.data=input=data
because when I add the processing the frequency decreases even more. That's why I left only copying for this minimal example. Is there any other, better way to do the copying?