ROS 消息已发送但未收到
ROS message sent but not received
我在我的项目中使用ROS,我需要不时发送一条消息。我有这个功能:
void RosNetwork::sendMessage(string msg, string channel) {
_mtx.lock();
ros::Publisher chatter_pub = _n.advertise<std_msgs::String>(channel.c_str(),10);
ros::Rate loop_rate(10);
std_msgs::String msgToSend;
msgToSend.data = msg.c_str();
chatter_pub.publish(msgToSend);
loop_rate.sleep();
cout << "Message Sent" << endl;
_mtx.unlock();
}
我在 python 中有这个:
def callbackFirst(data):
#rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
print("Received message from first filter")
def callbackSecond(data):
#rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
print("Received message from second filter")
def listener():
rospy.Subscriber("FirstTaskFilter", String, callbackFirst)
print("subscribed to FirstTaskFilter")
rospy.Subscriber("SecondTaskFilter", String, callbackSecond)
print("subscribed to SecondTaskFilter")
rospy.spin()
侦听器是 python 中的一个线程。
我进入函数 sendMessage
(我在终端 "Message Sent" 中看到很多次)但我没有看到 python 脚本收到消息。
更新:我用 rostopic pub /FirstTaskFilter std_msgs/String "test"
测试了 python 回调,效果很好。
有什么想法吗?
您每次都在重新为发布者做广告,然后您立即使用它来发布一些东西。
这是有问题的,因为订阅者需要一些时间来订阅新出现的发布者。如果您在订阅者完成此操作之前发布消息,这些消息将不会到达。
为避免此问题,不要每次都发布新的发布者,而是在 class 的构造函数中只发布一次并将发布者存储在成员变量中。您的代码可能如下所示:
RosNetwork() {
_chatter_pub = _n.advertise<std_msgs::String>(channel.c_str(),10);
ros::Duration(1).sleep(); // optional, to make sure no message gets lost
}
void RosNetwork::sendMessage(string msg, string channel) {
...
_chatter_pub.publish(msgToSend);
...
}
advertise
后的一秒休眠确保所有现有订阅者都可以在您开始发布消息之前订阅。只有在不丢失一条消息很重要的情况下才需要这样做。在大多数实际情况下,它可以省略。
您的问题的正确解决方案是使用 pub.getNumSubscribers() 并等到 > 0。然后发布。
我在我的项目中使用ROS,我需要不时发送一条消息。我有这个功能:
void RosNetwork::sendMessage(string msg, string channel) {
_mtx.lock();
ros::Publisher chatter_pub = _n.advertise<std_msgs::String>(channel.c_str(),10);
ros::Rate loop_rate(10);
std_msgs::String msgToSend;
msgToSend.data = msg.c_str();
chatter_pub.publish(msgToSend);
loop_rate.sleep();
cout << "Message Sent" << endl;
_mtx.unlock();
}
我在 python 中有这个:
def callbackFirst(data):
#rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
print("Received message from first filter")
def callbackSecond(data):
#rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
print("Received message from second filter")
def listener():
rospy.Subscriber("FirstTaskFilter", String, callbackFirst)
print("subscribed to FirstTaskFilter")
rospy.Subscriber("SecondTaskFilter", String, callbackSecond)
print("subscribed to SecondTaskFilter")
rospy.spin()
侦听器是 python 中的一个线程。
我进入函数 sendMessage
(我在终端 "Message Sent" 中看到很多次)但我没有看到 python 脚本收到消息。
更新:我用 rostopic pub /FirstTaskFilter std_msgs/String "test"
测试了 python 回调,效果很好。
有什么想法吗?
您每次都在重新为发布者做广告,然后您立即使用它来发布一些东西。
这是有问题的,因为订阅者需要一些时间来订阅新出现的发布者。如果您在订阅者完成此操作之前发布消息,这些消息将不会到达。
为避免此问题,不要每次都发布新的发布者,而是在 class 的构造函数中只发布一次并将发布者存储在成员变量中。您的代码可能如下所示:
RosNetwork() {
_chatter_pub = _n.advertise<std_msgs::String>(channel.c_str(),10);
ros::Duration(1).sleep(); // optional, to make sure no message gets lost
}
void RosNetwork::sendMessage(string msg, string channel) {
...
_chatter_pub.publish(msgToSend);
...
}
advertise
后的一秒休眠确保所有现有订阅者都可以在您开始发布消息之前订阅。只有在不丢失一条消息很重要的情况下才需要这样做。在大多数实际情况下,它可以省略。
您的问题的正确解决方案是使用 pub.getNumSubscribers() 并等到 > 0。然后发布。