RDK-X5 IMX415 获取帧失败

问题分析

从你的错误日志看,核心问题是:

TypeError: a bytes-like object is required, not 'NoneType'

这个错误发生在 split_nv12_bytes 函数中,说明 nv12_bytesNone,即相机帧获取失败

结合日志中的几个关键信息:

  1. 传感器识别正常Auto-selected sensor: imx415-60fps-4lane
  2. VSE/ISP 配置正常:3840x2160@60fps 输入,输出 1920x1080
  3. 运行几分钟后崩溃:说明不是初始化问题,而是运行时帧获取超时或缓冲区耗尽

可能原因

1. 带宽/性能瓶颈

IMX415 在 60fps 4K 分辨率下数据量极大:

  • 原始数据:3840×2160×10bit × 60fps ≈ 5Gbps
  • X5 的 MIPI 和内存带宽可能无法持续支撑

2. 缓冲区不足

日志显示:

flowid module cid chn FREE  REQ  PRO  COM USED
0      vin0   0   8      0    2    1    0    0

缓冲区使用异常,可能导致后续帧获取失败。

3. 系统版本问题

你提到执行过 update+upgrade,这可能导致:

  • 驱动版本不匹配
  • 固件与 SDK 版本不一致

解决步骤

步骤 1:降低分辨率和帧率测试

修改代码,使用更低配置验证稳定性:

# 尝试 1080p@30fps
cam.open_cam(0,-1,-1,1920,1080,30)  # 如果支持 fps 参数

# 或者使用 720p
cam.open_cam(0,-1,-1,1280,720)

步骤 2:检查系统版本一致性

# 查看当前系统版本
cat /etc/version

# 查看 SDK 版本
python3 -c "import hobot_vio; print(hobot_vio.__version__)"

# 检查是否有未完成的更新
sudo apt update
sudo apt list --upgradable

步骤 3:增加错误处理和重试机制

在代码中添加帧获取失败的处理:

# 在 01_mipi_camera_yolov5s.py 中添加
max_retries = 3
for i in range(max_retries):
    nv12_bytes = vps.get_image()
    if nv12_bytes is not None:
        break
    print(f"Frame get failed, retry {i+1}/{max_retries}")
    time.sleep(0.1)

if nv12_bytes is None:
    print("Failed to get frame after retries, restarting camera...")
    # 添加相机重启逻辑
    continue

步骤 4:检查系统资源

运行时监控资源使用:

# 新开一个终端,监控内存和 CPU
watch -n 1 'free -h && echo "---" && top -bn1 | grep "Cpu(s)"'

# 监控 MIPI 相关错误
dmesg -w | grep -i "mipi\|vin\|isp"

步骤 5:回退系统版本(如必要)

如果 update+upgrade 后出现问题,考虑回退:

# 查看可用的内核版本
dpkg --list | linux-image

# 或者重新刷写官方镜像
# 下载地址:https://developer.d-robotics.cc/

建议

  1. 优先测试 1080p@30fps:IMX415 在 4K@60fps 下对 X5 压力过大
  2. 避免在生产环境执行 upgrade:等待官方验证的稳定版本
  3. 查看相关帖子

如果降低分辨率后问题消失,说明是带宽/性能瓶颈,建议:

  • 使用 1080p@30fps 或 720p@60fps
  • 或者考虑升级到更高性能的平台

需要我帮你查看具体的代码修改方案吗?