Robotics StackExchange | Archived questions

Offline node subscribers of generated messages

I have some nodes running some algorithms that take varying amounts of time right now. For debugging, I've created offline processing programs that read from bags and feed the data into nodes. Currently, the processing is done in these callbacks (for better or worse) and at the end it checks for subscribers and publishes messages depending on who is listening.

Is there a way to set up subscribers without running a live ROS system to write this data to a bag without re-architecting the callbacks and publishing? E.g. the nh.subscribe call without a node handle?

Some sample code:

 /**
 * Inherits from message_filters::SimpleFilter<M>
 * to use protected signalMessage function
 */
template <class M>
class BagSubscriber : public message_filters::SimpleFilter<M>
{
public:
    void newMessage(const boost::shared_ptr<M const> &msg)
    {
        message_filters::SimpleFilter<M>::signalMessage(msg);
    }
};


// Callback for synchronized messages
void proxyCallback(const sensor_msgs::Image::ConstPtr &l_img,
              const sensor_msgs::Image::ConstPtr &r_img,
              const sensor_msgs::CameraInfo::ConstPtr &l_info,
              const sensor_msgs::CameraInfo::ConstPtr &r_info)
{
    // This will result in publications on certain topics, I'd like to create an offline callback
    node.image_callback(l_img, r_img, l_info, r_info); 
}

// How can I do this?
void visualizationCallback(const MarkerArray::ConstPtr &array)
{
   output_bag.write("/topic", array->header.stamp, array);
}

int main(int argc, char ** argv)
{
    typedef message_filters::sync_policies::ApproximateTime<sensor_msgs::Image, sensor_msgs::Image, sensor_msgs::CameraInfo, sensor_msgs::CameraInfo> ApproximatePolicy;


    typedef message_filters::Synchronizer<ApproximatePolicy> ApproximateSync;
    boost::shared_ptr<ApproximateSync> approximate_sync_;

    // Set up fake subscribers to capture images
    BagSubscriber<sensor_msgs::Image> l_img_sub, r_img_sub;
    BagSubscriber<sensor_msgs::CameraInfo> l_info_sub, r_info_sub;

    approximate_sync_.reset(new ApproximateSync(ApproximatePolicy(25),
                                                l_img_sub, r_img_sub, l_info_sub, r_info_sub) );

    approximate_sync_->registerCallback(boost::bind(&proxyCallback, _1, _2, _3, _4));

    // I want a real subscriber for data generated here
    ros::Subscriber sub = nh.subscribe("my_topic", 1, visualizationCallback);

    BOOST_FOREACH(rosbag::MessageInstance const m, view)
    {
    // Loop through messages
    }
}

Asked by EEngineer on 2015-04-22 22:20:39 UTC

Comments

Answers

You cannot use the subscribe API to get callbacks unless you are "running" ROS.

However I think you should look at the rosbag API for offline processing.

Asked by tfoote on 2015-08-28 03:04:21 UTC

Comments

Hi, I just created something that might be useful for this case. Please look into https://github.com/lrse/batch_ros

Asked by Matias on 2018-11-03 10:43:30 UTC

Comments