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

订阅ROS CompressedImage图像话题后无法输出显示图像问题咨询

问题根因
  • 节点没有保持运行:lane_pose_publisher函数仅完成了ROS节点初始化、话题订阅注册,没有调用rospy.spin()启动节点事件循环,函数执行完成后程序直接退出,不会等待接收相机话题的消息。
  • OpenCV窗口缺少刷新逻辑:cv2.imshow()必须搭配cv2.waitKey()才能完成窗口内容的渲染,缺少该调用时图像不会正常展示。
  • 全局变量作用域错误:回调函数中修改global_frame时没有声明global,会被识别为局部变量赋值,不会修改全局变量的值,可能触发变量未定义报错。
修复方案

修改点如下:

  1. 在lane_pose_publisher函数末尾添加rospy.spin(),保持ROS节点持续运行接收消息
  2. 在cv2.imshow()之后添加cv2.waitKey(1),参数1表示间隔1ms刷新窗口,满足实时显示的需求
  3. 在回调函数开头添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:54:03