I have a publisher publishing two images with topics 'image' and 'depth', and a subscriber listening to these two topics.
The publisher reads images from two folders and publishes both in the same loop. Each image has a corresponding depth, and these two are mapped with same names. the publishing rate is 1hz.
The subscriber is not getting the first pair of images. I've tried to dump the images subscribed to a folder. All the images published are getting dumped, except the first pair of images.
This is the code of publisher
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
This is the code of subscriber
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()
While executing the publisher, all images are listed (from the print(fn) line). But the subscriber is not getting first pair of images.
I've tried recording the messages using 'rosrecord'. It is also not obtaining the first pair.
What can be the reasons?
Try setting latch=True
when you initialize your publisher.
See https://answers.ros.org/question/195348/about-subscriber-structure-and-latch-on-publisher/ for more info.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.