2016-05-28 1 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). Но здесь это не нужно, так как вы можете получить доступ к своему частному атрибуту transform внутри метода класса callback.

Вот исправленный код заголовка (так очевидно, как это может быть), с добавлением 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(); 
} 

Cheers,