我正在编写一个课程,目的是为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'.
答案 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 ();
}
干杯,