You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ROS订阅节点统计回调次数实现图片按序存储报错求助

问题原因

你的自定义类命名为Image,和导入的ROS标准图像消息类型from sensor_msgs.msg import Image重名,导致rospy.Subscriber注册时传入的消息类型变成了你自定义的类,rospy无法识别该类为合法的ROS消息类型,因此抛出对应报错。

修复方案
  1. 重命名自定义类,避免和ROS的Image消息类型命名冲突
  2. 在主函数末尾添加rospy.spin(),保持节点持续运行接收消息
  3. (可选优化)移除回调函数中的time.sleep(),改为时间差判断实现间隔保存,避免阻塞消息队列导致消息堆积丢失
完整修改后代码
# rospy for the subscriber
import rospy, time
# ROS Image message
from sensor_msgs.msg import Image
# ROS Image message -> OpenCV2 image converter
from cv_bridge import CvBridge, CvBridgeError
# OpenCV2 for saving an image
import cv2

# Instantiate CvBridge
bridge = CvBridge()
  
class ImageSaver(object):
    def __init__(self):
        self.image_number = 0
        self.last_save_time = rospy.Time.now().to_sec()
        self.save_interval = 3.0 # 保存间隔3秒
        # Define your image topic
        image_topic = "/wamv/sensors/cameras/front_left_camera/image_raw"
        # Set up your subscriber and define its callback
        rospy.Subscriber(image_topic, Image, self.image_callback)
    
    def image_callback(self, msg):
        current_time = rospy.Time.now().to_sec()
        # 间隔不足则跳过当前帧
        if current_time - self.last_save_time < self.save_interval:
            return
        print("Received an image!")
        try:
            # Convert your ROS Image message to OpenCV2
            cv2_img = bridge.imgmsg_to_cv2(msg, "bgr8")
        except CvBridgeError as e:
            print(e)
        else:
            # Save your OpenCV2 image as a png 
            cv2.imwrite(f'croc_{self.image_number}.png', cv2_img)
            print("Saved Image!")
            self.image_number += 1 
            self.last_save_time = current_time

if __name__ == '__main__':
    rospy.init_node('image_listener')
    image_node = ImageSaver()
    rospy.spin()

内容的提问来源于stack exchange,提问作者Jehan Dastoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:15:06