为什么 ROS 发布者不发布第一条消息?
Why is ROS publisher not publishing first message?
我有一个发布者发布了两张主题为 'image' 和 'depth' 的图片,还有一个订阅者收听了这两个主题。
发布者从两个文件夹中读取图像并在同一个循环中发布它们。每个图像都有一个对应的深度,并且这两个图像具有相同的名称。发布速率为1hz.
订户没有收到第一对图像。我试图转储订阅文件夹的图像。除了第一对图像外,所有发布的图像都被转储了。
这是发布者的代码
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import os
def talker():
rospy.init_node('talker', anonymous=True)
rate = rospy.Rate(1) # 1hz
bridge = CvBridge()
hello_str = "hello world %s" % rospy.get_time()
rospy.loginfo(hello_str)
path = "/home/test_img/"
imglist = os.listdir(path)
path_depth = "/home/out_depth/"
for i in range(0,len(imglist)):
topic = 'image'
print(topic)
pub = rospy.Publisher(topic, Image, queue_size=10)
fn = path+imglist[i]
print(fn)
img = cv2.imread(fn)
imgMsg = bridge.cv2_to_imgmsg(img, "bgr8")
pub.publish(imgMsg)
topic = 'depth'
print(topic)
pub = rospy.Publisher(topic, Image, queue_size=10)
fn = path_depth+imglist[i]
print(fn)
img = cv2.imread(fn)
imgMsg = bridge.cv2_to_imgmsg(img, "bgr8")
pub.publish(imgMsg)
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
这是订阅者的代码
import rospy
import numpy as np
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
from datetime import datetime
def callback(data):
bridge = CvBridge()
# Convert your ROS Image message to OpenCV2
cv2_img = bridge.imgmsg_to_cv2(data, "bgr8")
cv2.imwrite('out_rgbd/'+datetime.now().strftime("%I:%M%S%f")+".jpg", cv2_img)
def listener():
# In ROS, nodes are uniquely named. If two nodes with the same
# name are launched, the previous one is kicked off. The
# anonymous=True flag means that rospy will choose a unique
# name for our 'listener' node so that multiple listeners can
# run simultaneously.
rospy.init_node('listener', anonymous=True)
topic = 'image'
print(topic)
rospy.Subscriber(topic, Image, callback)
topic = 'depth'
print(topic)
rospy.Subscriber(topic, Image, callback)
# spin() simply keeps python from exiting until this node is stopped
rospy.spin()
if __name__ == '__main__':
listener()
在执行发布程序时,列出了所有图像(来自 print(fn) 行)。但是订阅者没有得到第一对图像。
我试过使用 'rosrecord' 录制消息。它也没有获得第一对。
可能是什么原因?
尝试在初始化发布者时设置 latch=True
。
有关详细信息,请参阅 https://answers.ros.org/question/195348/about-subscriber-structure-and-latch-on-publisher/。
我有一个发布者发布了两张主题为 'image' 和 'depth' 的图片,还有一个订阅者收听了这两个主题。
发布者从两个文件夹中读取图像并在同一个循环中发布它们。每个图像都有一个对应的深度,并且这两个图像具有相同的名称。发布速率为1hz.
订户没有收到第一对图像。我试图转储订阅文件夹的图像。除了第一对图像外,所有发布的图像都被转储了。
这是发布者的代码
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import os
def talker():
rospy.init_node('talker', anonymous=True)
rate = rospy.Rate(1) # 1hz
bridge = CvBridge()
hello_str = "hello world %s" % rospy.get_time()
rospy.loginfo(hello_str)
path = "/home/test_img/"
imglist = os.listdir(path)
path_depth = "/home/out_depth/"
for i in range(0,len(imglist)):
topic = 'image'
print(topic)
pub = rospy.Publisher(topic, Image, queue_size=10)
fn = path+imglist[i]
print(fn)
img = cv2.imread(fn)
imgMsg = bridge.cv2_to_imgmsg(img, "bgr8")
pub.publish(imgMsg)
topic = 'depth'
print(topic)
pub = rospy.Publisher(topic, Image, queue_size=10)
fn = path_depth+imglist[i]
print(fn)
img = cv2.imread(fn)
imgMsg = bridge.cv2_to_imgmsg(img, "bgr8")
pub.publish(imgMsg)
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
这是订阅者的代码
import rospy
import numpy as np
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
from datetime import datetime
def callback(data):
bridge = CvBridge()
# Convert your ROS Image message to OpenCV2
cv2_img = bridge.imgmsg_to_cv2(data, "bgr8")
cv2.imwrite('out_rgbd/'+datetime.now().strftime("%I:%M%S%f")+".jpg", cv2_img)
def listener():
# In ROS, nodes are uniquely named. If two nodes with the same
# name are launched, the previous one is kicked off. The
# anonymous=True flag means that rospy will choose a unique
# name for our 'listener' node so that multiple listeners can
# run simultaneously.
rospy.init_node('listener', anonymous=True)
topic = 'image'
print(topic)
rospy.Subscriber(topic, Image, callback)
topic = 'depth'
print(topic)
rospy.Subscriber(topic, Image, callback)
# spin() simply keeps python from exiting until this node is stopped
rospy.spin()
if __name__ == '__main__':
listener()
在执行发布程序时,列出了所有图像(来自 print(fn) 行)。但是订阅者没有得到第一对图像。
我试过使用 'rosrecord' 录制消息。它也没有获得第一对。
可能是什么原因?
尝试在初始化发布者时设置 latch=True
。
有关详细信息,请参阅 https://answers.ros.org/question/195348/about-subscriber-structure-and-latch-on-publisher/。