ROS::Publisher 与 ROS::Subscriber 不能建立通信的难以被人察觉的情况

接昨天的代码,订阅节点 msghandler 一直接收不到 发布节点 node 的消息。

// Publisher

ros::init(argc, argv, "sipeed_tof_ms_a010_ros_topic_publisher");

ros::NodeHandle node_obj("~");

std::string s;
node_obj.param<std::string>("device", s, "/dev/ttyUSB0");
std::cout << "use device: " << s << std::endl;

std::string to_device(s.substr(5));

std::stringstream ss;
ss.str("");
ss << to_device << "/depth";
std::cout << ss.str() << std::endl;
ros::Publisher publisher_depth = // ttyUSBx/depth
    node_obj.advertise<sensor_msgs::Image>(strdup(ss.str().c_str()), 10);   
std::cout << strdup(ss.str().c_str()) << std::endl;

发布节点的源代码就是这样写的,所以……唉。就有了下面我写的订阅节点。

// Subscriber

ros::init(argc, argv, "point_cloud_processor");

ros::NodeHandle nh("~");

std::string s;
nh.param<std::string>("device", s, "/dev/ttyUSB0");
std::cout << "use device: " << s << std::endl;

std::string from_device(s.substr(5));
std::stringstream sd;

sd.str("");
sd << from_device << "/depth";
std::cout << sd.str() << std::endl;
ros::Subscriber sub_depth = // ttyUSBx/depth
    nh.subscribe<sensor_msgs::Image>(strdup(sd.str().c_str()), 1, pointDepthCallback);
std::cout << strdup(sd.str().c_str()) << std::endl;

保险起见,我还特意打印了一下:

std::cout << "use device: " << s << std::endl;
// 和
std::cout << strdup(sd.str().c_str()) << std::endl;

发现,一切正常啊。至少输出结果是一致的。
在这里插入图片描述
然鹅并没有成功建立通信。然后我就开始瞎琢磨,把每种小概率情况、我能想到的、GPT能告诉我的,全都检查了一遍。
无果,后来,查了一下运行节点的信息。

rosnode info <ros::init()的参数>

发现大有玄机。

std::cout << ss.str() << std::endl;
ros::Publisher publisher_depth = 
    node_obj.advertise<sensor_msgs::Image>(strdup(ss.str().c_str()), 10); 
// 或
std::cout << sd.str() << std::endl;
ros::Subscriber sub_depth = 
    nh.subscribe<sensor_msgs::Image>(strdup(sd.str().c_str()), 1, pointDepthCallback);

原来这样生成出来的“topic”并不一致。。。。
在这里插入图片描述
在这里插入图片描述
气笑我了。然后修改吧。

// Publisher

ros::init(argc, argv, "sipeed_tof_ms_a010_ros_topic_publisher");

ros::NodeHandle node_obj("~");

std::string s;
node_obj.param<std::string>("device", s, "/dev/ttyUSB0");
std::cout << "use device: " << s << std::endl;

std::string to_device(s.substr(5));

std::stringstream ss;
ss.str("");
ss << "/" << to_device << "/depth";				// 注意此行即可
std::cout << ss.str() << std::endl;
ros::Publisher publisher_depth = // ttyUSBx/depth
    node_obj.advertise<sensor_msgs::Image>(strdup(ss.str().c_str()), 10);   
std::cout << strdup(ss.str().c_str()) << std::endl;
// Subscriber

ros::init(argc, argv, "point_cloud_processor");

ros::NodeHandle nh("~");

std::string s;
nh.param<std::string>("device", s, "/dev/ttyUSB0");
std::cout << "use device: " << s << std::endl;

std::string from_device(s.substr(5));
std::stringstream sd;

sd.str("");
sd << "/" << from_device << "/depth";			// 注意此行即可
std::cout << sd.str() << std::endl;
ros::Subscriber sub_depth = // ttyUSBx/depth
    nh.subscribe<sensor_msgs::Image>(strdup(sd.str().c_str()), 1, pointDepthCallback);
std::cout << strdup(sd.str().c_str()) << std::endl;

然后嘛,再查看一下节点信息:
在这里插入图片描述
在这里插入图片描述
可以正常通信了。
在这里插入图片描述

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值