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"这很好用。
任何想法?
您每次都在重新为发布商做广告,然后您立即使用它来发布某些内容。
这是有问题的,因为订阅者需要一些时间来订阅新出现的发布者。如果您在订阅者完成此操作之前发布消息,这些消息将不会到达。
为了避免这个问题,不要每次都公布一个新的发布者,而是在你的类的构造函数中只做一次,并将发布者存储在一个成员变量中。您的代码可能如下所示:
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在您开始发布消息之前,一秒睡眠后确保所有现有订阅者都可以订阅。仅当没有一条消息丢失很重要时,这才是必要的。在大多数实际情况下,它可以省略。