2016-05-28 264 views
1

我在写一个类,其目标是向rviz提供一个模型。班级应能够订阅一个主题来模拟一些动作。因此,我想使用node.subscribe,但问题是,subscribe预计static void函数。这意味着我无法访问我的班级成员和方法。ROS:将回调函数和对象成员绑定到订阅节点

有没有可能做到这一点?

这里缩短代码:

MyClass.h

class MyClass 
{ 
    private: 
     tf::Transform transform; 
     ros::Subscriber subscriber; 

    public: 
     int publish(); 

    private: 
     static void callback (std_msgs::Float64MultiArray msg); 
}; 

MyClass.cpp

MyClass::MyClass() 
{ 
    this->subscriber = 
     this->node.subscribe("topic_id", 
          1, 
          &MyClass::callback, 
          this->transform); 
} 

void MyClass::callback(std_msgs::Float64MultiArray msg, tf::Transform &transform) 
{ 
    std::vector<double> data(4); 
    data = msg.data; 

    transform->setRotation(tf::Quaternion(data[0], data[1], data[2], data[3])); 
    publish(); 
} 

回答

2

据ROS维基,有没有这样的需要一个静态无效。 我举这个作为参考,从here

回调

根据版本的认购()你使用,这可能是一个几件事情的任何 。最常见的是一个类方法指针和一个指向类实例的指针。这在稍后更详细地解释为 。

因此,只需要声明你的回调为类方法指针没有静态预选赛,它应该只是罚款。

另一点是,在订户描述中最好是use boost::bind if you callback will need some arguments。 (见answer)。但是,这里不需要,因为您可以在类方法callback内访问您的私有属性transform

这里的修正头的代码(如明显,因为它可能是),与添加node::handler,因为我真的不知道你node是:

class MyClass 
{ 
    private: 
     ros::NodeHandle ph_; 
     tf::Transform transform; 
     ros::Subscriber subscriber; 

    public: 
     int publish(); 

    private: 
     void callback (const std_msgs::Float64MultiArray::ConstPtr& msg); 
}; 

和CPP文件:

MyClass::MyClass() : ph_("~") 
{ 
    subscriber = ph_.subscribe("topic_id", 
          1, 
          &MyClass::callback, 
          this); 
} 

void MyClass::callback(const std_msgs::Float64MultiArray::ConstPtr& msg) 
{ 
    std::vector<double> data(4); 
    data = msg.data; 

    transform->setRotation(tf::Quaternion(data[0], data[1], data[2], data[3])); 
    publish(); 
} 

干杯,