已发送但未收到 ROS 消息

Jav*_*avi 2 python callback messages ros

我在我的项目中使用 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();
}
Run Code Online (Sandbox Code Playgroud)

我在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()
Run Code Online (Sandbox Code Playgroud)

侦听器是python中的一个线程。我进入了该函数sendMessage(我在终端中看到“Message Sent”很多次),但我没有看到 python 脚本接收到消息。

更新:我测试了 python 回调,rostopic pub /FirstTaskFilter std_msgs/String "test"这很好用。

任何想法?

lua*_*tor 6

您每次都在重新为发布商做广告,然后您立即使用它来发布某些内容。
这是有问题的,因为订阅者需要一些时间来订阅新出现的发布者。如果您在订阅者完成此操作之前发布消息,这些消息将不会到达。

为了避免这个问题,不要每次都公布一个新的发布者,而是在你的类的构造函数中只做一次,并将发布者存储在一个成员变量中。您的代码可能如下所示:

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);
    ...
}
Run Code Online (Sandbox Code Playgroud)

advertise在您开始发布消息之前,一秒睡眠后确保所有现有订阅者都可以订阅。仅当没有一条消息丢失很重要时,这才是必要的。在大多数实际情况下,它可以省略。