我在项目中使用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
(我在终端&#34; Message Sent&#34中看到了很多次)但我没有看到python脚本收到消息。
更新:我用rostopic pub /FirstTaskFilter std_msgs/String "test"
测试了python回调,这很有效。
有什么想法吗?
答案 0 :(得分:2)
您每次都会重新宣传发布商,然后您会立即使用它来发布内容 这是有问题的,因为订阅者需要一些时间来订阅新兴的发布者。如果您在订阅者完成此操作之前发布消息,则这些消息将不会到达。
要避免此问题,请不要每次都宣传新发布者,而是只在类的构造函数中执行一次,并将发布者存储在成员变量中。您的代码可能如下所示:
='file:///C:/[path and filename].xlsx'#$'[sheetname]'.G22
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);
...
}
之后的一秒睡眠可确保所有现有订阅者在开始发布消息之前可以订阅。只有重要的是不会丢失单个消息,这才是必要的。在大多数实际情况中,它可以省略。
答案 1 :(得分:0)
解决该问题的正确方法是使用pub.getNumSubscribers()并等待其大于0。然后发布。