Ros1:订阅者的回调函数只有在发布3-4次后才有效

问题描述 投票:0回答:1

这是发布者代码的一部分

def publish_data(topic, message):
    pub = rospy.Publisher(topic, UInt16, queue_size=100)
    rospy.init_node('Talker', anonymous=True)
    pub.publish(message)
    rospy.loginfo("MSG PUB LUL")
    rate = rospy.Rate(20) # publish at 10 Hz
    rate.sleep()`

这是整个订阅者代码:


import rospy
from std_msgs.msg import String
from std_msgs.msg import UInt16


def callback(servo_num, data):
    print("Callback function called with servo_num:", servo_num, "and data:", data.data)
    rospy.loginfo("Servo{}".format(servo_num))
    rospy.loginfo(data.data)

def listener():

    rospy.init_node('listener', anonymous=True)
    rospy.Subscriber("Servo1", UInt16, lambda data: callback(1, data))
    rospy.Subscriber("Servo2", UInt16, lambda data: callback(2, data))
    rospy.Subscriber("Servo3", UInt16, lambda data: callback(3, data))
    rospy.Subscriber("Servo4", UInt16, lambda data: callback(4, data))
    rospy.Subscriber("Servo5", UInt16, lambda data: callback(5, data))
    rospy.Subscriber("Servo6", UInt16, lambda data: callback(6, data))

    rospy.spin()

if __name__ == '__main__':
    listener()

当尝试发布消息时,rospy.loginfo("MSG PUB LUL") 在终端中没有问题。问题在另一边,在同一主题发布 2-3 次后仅输出 print("Callback function called with servo_num:", servo_num, "and data:", data.data)。如果回调被调用一次,除非我重新启动我的代码,否则它将被再次调用而没有问题。我的观察者是,如果速率变得太高,如 200 左右,则 2-3 次可能恰好是 3-4 次。但是,如果我尝试将 rate = 1 它并没有真正改变太多,在实际出现之前相同的 2-m 次发布到无效。

有人遇到同样的问题吗?真的可以在这里使用一些帮助。提前致谢!

代码在发布者中运行得很好。 预期的: print("用servo_num调用的回调函数:", servo_num, "and data:", data.data) rospy.loginfo("Servo{}".format(servo_num)) rospy.loginfo(数据。数据) 得到执行并在终端中查看数据。

实际:

仅在发布后 2 到 3 次后发生。

python ros ubuntu-20.04
1个回答
0
投票

您的发布者代码有误。您不应该在每次要发布内容时都创建发布者并重新初始化节点。相反,请看以下示例:

pub = rospy.Publisher('some_topic', UInt16, queue_size=100)

def publish_data(message):
    pub.publish(message)
    rospy.loginfo("MSG PUB LUL")

if __name__ == '__main__':
    rospy.init_node('Talker', anonymous=True)
    rate = rospy.rate(20)
    while not rospy.is_shutdown():
        msg = UInt16()
        msg.data = 5
        publish_data(msg)
        rate.sleep()

注意,如果要发布到多个topic,同样要创建多个publisher。

© www.soinside.com 2019 - 2024. All rights reserved.