订阅ROS CompressedImage图像话题后无法输出显示图像问题咨询
问题根因
- 节点没有保持运行:
lane_pose_publisher函数仅完成了ROS节点初始化、话题订阅注册,没有调用rospy.spin()启动节点事件循环,函数执行完成后程序直接退出,不会等待接收相机话题的消息。 - OpenCV窗口缺少刷新逻辑:
cv2.imshow()必须搭配cv2.waitKey()才能完成窗口内容的渲染,缺少该调用时图像不会正常展示。 - 全局变量作用域错误:回调函数中修改
global_frame时没有声明global,会被识别为局部变量赋值,不会修改全局变量的值,可能触发变量未定义报错。
修复方案
修改点如下:
- 在
lane_pose_publisher函数末尾添加rospy.spin(),保持ROS节点持续运行接收消息 - 在
cv2.imshow()之后添加cv2.waitKey(1),参数1表示间隔1ms刷新窗口,满足实时显示的需求 - 在回调函数开头添加
global global_frame声明,明确修改的是全局变量
修复后的完整代码
#!/usr/bin/env python import cv2 import numpy as np from timeit import default_timer as timer from std_msgs.msg import Float64 from sensor_msgs.msg import Image, CompressedImage from cv_bridge import CvBridge, CvBridgeError import rospy import sys print(sys.version) print(cv2.__version__) height = 480 width = 640 global_frame = np.zeros((height,width,3), np.uint8) def camera_callback(data): global global_frame bridge = CvBridge() try: global_frame = bridge.compressed_imgmsg_to_cv2(data) except CvBridgeError as e: print(e) height, width, channels = global_frame.shape cv2.imshow("Original", global_frame) cv2.waitKey(1) def lane_pose_publisher(): # Set the node name rospy.init_node('lane_pose_publisher', anonymous=True) rospy.Subscriber('/camera/image_raw/compressed', CompressedImage, camera_callback, queue_size = 1) # 启动节点事件循环,保持运行 rospy.spin() if __name__ == '__main__': try: lane_pose_publisher() except rospy.ROSInterruptException: cv2.destroyAllWindows() pass
内容的提问来源于stack exchange,提问作者gup08
相关产品推荐
相关产品推荐

