简体   繁体   中英

Why is ROS publisher not publishing first message?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM