ROS订阅节点统计回调次数实现图片按序存储报错求助
问题原因
你的自定义类命名为Image,和导入的ROS标准图像消息类型from sensor_msgs.msg import Image重名,导致rospy.Subscriber注册时传入的消息类型变成了你自定义的类,rospy无法识别该类为合法的ROS消息类型,因此抛出对应报错。
修复方案
- 重命名自定义类,避免和ROS的
Image消息类型命名冲突 - 在主函数末尾添加
rospy.spin(),保持节点持续运行接收消息 - (可选优化)移除回调函数中的
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
相关产品推荐
相关产品推荐

