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

使用Picamera2.capture_array存图到RAM时的程序异常排查

问题排查与解决方案

1. 程序无响应、不终止的核心排查

程序无输出、无法自动结束,大概率是主线程被阻塞或异常被静默吞掉,按以下方向排查:

  • Picamera2捕获阻塞:capture_array()必须在相机启动后才能正常获取帧,检查是否遗漏start()调用,示例正确流程:
    picam2 = Picamera2()
    config = picam2.create_preview_configuration(main={"format": "RGB888", "size": (640, 480)})
    picam2.configure(config)
    picam2.start()  # 缺失此步骤会导致capture_array无限等待
    frame = picam2.capture_array()
    
  • GPIO逻辑阻塞:如果舵机控制用了time.sleep()且参数过大,或驱动库(RPi.GPIO/pigpio)初始化错误,会导致线程挂起。检查舵机代码是否有无限循环或未处理的阻塞逻辑。
  • 异常静默处理:若代码存在try-except但未打印异常,会吞掉所有错误导致无输出,修改为:
    try:
        # 捕获图片/角度识别逻辑
    except Exception as e:
        print(f"Error: {e}")
    

2. 图片无显示的修复

预期显示图片但未出现,需检查:

  • 显示逻辑缺失:用cv2.imshow()时必须调用cv2.waitKey(1)刷新窗口,若设为0会无限等待按键:
    import cv2
    cv2.imshow("Capture", frame)
    cv2.waitKey(1)  # 至少等待1ms确保窗口渲染
    
  • 远程运行环境限制:SSH远程运行未开启X11转发时,imshow会失效,可先保存图片验证捕获是否成功:
    cv2.imwrite("test_capture.jpg", frame)
    

3. “no center of mass found”未打印的原因

  • 函数未触发调用:检查捕获图片后是否正确执行get_angle(frame),以及函数内部的蓝点识别逻辑是否满足打印条件(比如阈值设置过高导致未检测到蓝点,却没走到打印分支)。
  • 输出被重定向:后台运行程序时输出可能被写入日志而非终端,直接在终端前台运行程序查看输出。

4. 初始GPIO占用警告的处理

GPIO通道占用警告说明有其他进程占用目标引脚,用以下命令排查占用进程:

sudo lsof /dev/gpiomem

或重启树莓派释放GPIO资源,确保仅当前程序占用舵机引脚。


内容的提问来源于stack exchange,提问作者Ricky W.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:46:01