我写了一个订阅者函数来订阅字符串类型的消息主题。 第一个版本的程序显示提示“Segmentation failure (core dumped)”,无法执行。 然后我按照chatGPT指令修改了程序,第二个版本就可以执行了。
节目如下: ----版本一:
# include "ros/ros.h"
# include "std_msgs/String.h"
class NameSubscriber
{
private:
ros::Subscriber sub;
ros::NodeHandle nh;
public:
NameSubscriber(std::string _topic, int queue_size)
: nh(ros::NodeHandle()),
sub(nh.subscribe(_topic, queue_size, &NameSubscriber::Callback, this))
{
}
void Callback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("### Success get publisher");
ROS_INFO("I get the message is: %s, at: %f", msg->data.c_str(),ros::Time::now().toSec());
}
};
int main(int argc, char **argv)
{
ros::init(argc, argv, "name_s");
NameSubscriber name_sub("sub_Anthony",100);
ros::spin();
return 0;
}
----版本二(仅显示修改部分):
public:
NameSubscriber(std::string _topic, int queue_size)
: nh()
{
sub = nh.subscribe(_topic, queue_size, &NameSubscriber::Callback, this);
}
...
我有两个问题:
我很感激任何建议。
我修改了构建“子”这个对象的方式。
第一个版本的问题是类成员按照它们声明的顺序进行初始化,而不是按照它们在初始化列表中出现的顺序进行初始化。
所以,当成员在类中定义时
ros::Subscriber sub;
ros::NodeHandle nh;
然后初始化
NameSubscriber(std::string _topic, int queue_size)
: nh(ros::NodeHandle()),
sub(nh.subscribe(_topic, queue_size, &NameSubscriber::Callback, this))
在初始化
sub
之前,您已经初始化了 nh
,因此 nh.subscribe(...)
是未定义行为。
因此,要使您的第一个版本正常工作,您必须更改声明顺序:
ros::NodeHandle nh;
ros::Subscriber sub;