这是发布者代码的一部分
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 次后发生。
您的发布者代码有误。您不应该在每次要发布内容时都创建发布者并重新初始化节点。相反,请看以下示例:
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。