最近需要一个程序实现在subscriber中订阅话题并将话题处理后发布出去,但按常规的方法无论如何总是报错or发出空话题。查询后发现回调函数中发布新话题需要定义一个类实现。
ROS官方事例如下
#include <ros/ros.h>
class SubscribeAndPublish
{
public:
SubscribeAndPublish()
{
//Topic you want to publish
pub_ = n_.advertise<PUBLISHED_MESSAGE_TYPE>("/published_topic", 1);
//Topic you want to subscribe
sub_ = n_.subscribe("/subscribed_topic", 1, &SubscribeAndPublish::callback, this);
}
void callback(const SUBSCRIBED_MESSAGE_TYPE& input)
{
PUBLISHED_MESSAGE_TYPE output;
//.... do something with the input and generate the output...
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");
//Create an object of class SubscribeAndPublish that will take care of everything
SubscribeAndPublish SAPObject;
ros::spin();
return 0;
}
不仅要定义在类内,在使用回调函数时也需要写明作用域(类名)并给出最后的this指针。
this指针在实例化对象时,指向产生建立的对象。
在类内实现和类外实现回调函数的不同如下:
分别在第七行给出例子,class methods的第七行最后由this代替。
若不使用类定义,则要在全局变量中先声明,之后在主函数中注意直接赋值而不是重新创建。
如图