问题分析
从你的错误日志看,核心问题是:
TypeError: a bytes-like object is required, not 'NoneType'
这个错误发生在 split_nv12_bytes 函数中,说明 nv12_bytes 是 None,即相机帧获取失败。
结合日志中的几个关键信息:
- 传感器识别正常:
Auto-selected sensor: imx415-60fps-4lane - VSE/ISP 配置正常:3840x2160@60fps 输入,输出 1920x1080
- 运行几分钟后崩溃:说明不是初始化问题,而是运行时帧获取超时或缓冲区耗尽
可能原因
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/
建议
- 优先测试 1080p@30fps:IMX415 在 4K@60fps 下对 X5 压力过大
- 避免在生产环境执行
upgrade:等待官方验证的稳定版本 - 查看相关帖子:
如果降低分辨率后问题消失,说明是带宽/性能瓶颈,建议:
- 使用 1080p@30fps 或 720p@60fps
- 或者考虑升级到更高性能的平台
需要我帮你查看具体的代码修改方案吗?