我是ROS2的新手,我参照古月居的教程写了一个Publisher发布摄像头的图像信息,并在本机另一个终端调用Subscriber订阅这个话题。这个demo在我的笔记本上能跑通,但是在工控机上就跑不通,话题可以发布出去,但是订阅者的回调函数无法触发。有没有可能是订阅者的端口没有开放呢?

以上是我遇到的问题,希望能有前辈为我答疑解惑,感激不尽!以下是我的代码:

class ImagePublisher(Node):
def __init__(self, name):
    super().__init__(name)
    self.publisher_ = self.create_publisher(Image, "image_raw", 10)
    self.timer = self.create_timer(0.1, self.timer_callback)
    # 在工控机中我使用URL来捕获摄像头,可以捕获成功
    self.cap = cv2.VideoCapture(0)
    self.cv_bridge = CvBridge()

def timer_callback(self):
    ret, frame = self.cap.read()

    if ret == True:
        self.publisher_.publish(self.cv_bridge.cv2_to_imgmsg(frame, 'bgr8'))

    self.get_logger().info('Publishing video frame...')

def main(args = None):
    rclpy.init(args=args)
    node = ImagePublisher("cam_pub")
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()


class ImageSubscriber(Node):
def __init__(self, name):
    super().__init__(name)
    # 代码执行卡在这里
    self.sub = self.create_subscription(Image, 'image_raw', self.listener_callback, 10)
    self.cv_bridge = CvBridge()

def object_detect(self, image):
    cv2.imshow("object", image)
    cv2.waitKey(10)

def listener_callback(self, data):
    self.get_logger().info('Receiving video frame')
    image = self.cv_bridge.imgmsg_to_cv2(data, 'bgr8')
    self.object_detect(image)

def main(args = None):
    rclpy.init(args=args)
    node = ImageSubscriber("cam_sub")
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()