ROS:将回调函数和对象成员绑定到订阅者节点

时间:2016-05-28 17:47:05

标签: c++ static callback ros

我正在编写一个课程,目的是为rviz提供一个模型。该类应能够订阅一个主题来模拟一些动作。因此,我想使用subscribe,但问题是,static void需要class MyClass { private: tf::Transform transform; ros::Subscriber subscriber; public: int publish (); private: static void callback ( std_msgs::Float64MultiArray msg); }; 函数。这意味着我无法访问我的班级成员和方法。

有可能这样做吗?

这里是缩短的代码:

MyClass.h

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 ();
}

MyClass.cpp

figure
imagesc(data1(:,:,50))
axis image 
impixelinfo
colormap(jet)

% top-down view of slice 50 (of the 91 slices) of 'data1'. 

1 个答案:

答案 0 :(得分:2)

根据ROS wiki的说法,不需要静态空白。 我引用此作为here的参考:

  

回调

     

根据您使用的subscribe()版本,这可能是任何版本   一些事情。最常见的是类方法指针和a   指向类实例的指针。这将更详细地解释   后面。

因此,只需将你的回调声明为没有静态限定符的类方法指针,它应该可以正常工作。

另一点是,在订阅者描述中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 ();
}

干杯,