接昨天的代码,订阅节点 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;
然后嘛,再查看一下节点信息:
可以正常通信了。