gpt4 book ai didi

c++ - ROS:将回调函数和对象成员绑定(bind)到订阅者节点

转载 作者:行者123 更新时间:2023-11-30 03:41:14 24 4
gpt4 key购买 nike

我正在编写一个类,目的是为 rviz 提供一个模型。该类应该能够订阅一个主题来模拟一些 Action 。因此我想使用 node.subscribe 但问题是,subscribe 需要一个 static void 函数。这意味着我无权访问我的类成员和方法。

有没有可能做到这一点?

这里是缩短的代码:

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

最佳答案

根据 ROS wiki 的说法,不需要静态空隙。我引用这作为引用来自 here :

callback

Depending on the version of subscribe() you're using, this may be any of a few things. The most common is a class method pointer and a pointer to the instance of the class. This is explained in more detail later.

因此,只需将回调声明为不带静态限定符的类方法指针,它就可以正常工作。

另一点是,如果您的回调需要一些参数,最好在订阅者描述中使用 boost::bind。 (参见 answer )。但是,这里不需要这样做,因为您可以在类方法 callback 中访问您的私有(private)属性 transform

这是更正后的 header 代码(尽管可能很明显),添加了 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 ();
}

干杯,

关于c++ - ROS:将回调函数和对象成员绑定(bind)到订阅者节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37502096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com