在实际应用中,经常需要在同一个节点内接受数据,在回调函数中将数据进行处理,再将新数据重新发布在另一个新话题上。
实现步骤:
1. 定义一个数据处理类SubscribeAndPublish,设置2个pub成员对象和1个sub成员对象为public。
2. 在主函数中发布原始消息;
3. 将callback定义为成员函数,并使用新的pub将消息发布出去。
测试程序代码如下:
#include <ros/ros.h>
#include"std_msgs/String.h"class SubscribeAndPublish { public: SubscribeAndPublish() { //Topic you want to publish pub_ = n_.advertise<std_msgs::String>("/published_topic", 1); pub_callback = n_.advertise<std_msgs::String>("/callback_topic", 1);//Topic you want to subscribe sub_ = n_.subscribe("/published_topic", 1, &SubscribeAndPublish::callback, this); //注意这里,和平时使用回调函数不一样了。} void callback(const std_msgs::String& input) { std_msgs::String output; output.data = input.data;output.data.append(" treated!");//.... do something with the input and generate the output... ROS_INFO("callbacked and published on /callback_topic");pub_callback.publish(output); // ROS_INFO("callback published");} public: ros::NodeHandle n_; ros::Publisher pub_; ros::Publisher pub_callback; ros::Subscriber sub_; };//End of class SubscribeAndPublish int main(int argc, char **argv) { //Initiate ROS ros::init(argc, argv, "subscribe_and_publish"); //Create an object of class SubscribeAndPublish that will take care of everything SubscribeAndPublish SAPObject; std_msgs::String msg; msg.data = "from main";ros::Rate loop_rate(1);while (ros::ok()){SAPObject.pub_.publish(msg);ROS_INFO("main published on /published_topic");ros::spinOnce();//处理订阅话题的所有回调函数callback(),loop_rate.sleep();}return 0; }
打印来原始话题的消息和新话题的消息:
rostopic echo /published_topic
rostopic echo /callback_topic
得到原始数据和处理过后的数据的结果。