2016-05-28 35 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(); 
} 

乾杯,