使用智能盒子例程,RDK X5 运行6路hobot_rtsp_client.launch.py文件时,会会隔一段时间随机一路会出现容器崩溃错误

根据 Marcelo6151 的最新回复和社区案例,问题已经非常清晰了。


核心结论

RDK X5 的 VDEC 硬件能力虽强(支持 1×4K@60fps),但 6 路 1080P@30fps H.265 并发的总吞吐量接近硬件上限,导致资源竞争和随机崩溃。

Marcelo6151 指出:X5 供电正常时,一般能稳定支持 1×4K@60fps 编解码。这意味着:

  • 4K@60fps ≈ 8.3MP × 60 = 498 MP/s 的像素吞吐量
  • 6 路 1080P@30fps ≈ 6 × (2.07MP × 30) = 372 MP/s 的像素吞吐量

理论上 6 路应该在能力范围内,但实际运行时需要考虑

  1. 内存带宽竞争:6 路并发时的 DDR 访问压力
  2. VDEC 通道分配:可能存在通道数上限(非吞吐量上限)
  3. ROS 2 调度开销component_container_isolated 的线程调度延迟

关键排查步骤

1. 单变量验证(必须执行)

Marcelo6151 建议只修改一个变量来定位问题:

测试 A:只改帧率(编码格式保持 H.265)

# 6 路 H.265 @ 15fps
{'output_framerate': 15},  # 从 30 改为 15
  • 如果稳定 → 确认是吞吐量瓶颈
  • 如果仍崩溃 → 可能是通道数限制SDK Bug

测试 B:只改编码格式(帧率保持 30fps)

# 6 路 H.264 @ 30fps
{'in_format': 'h264'},  # 从 h265 改为 h264
  • 如果稳定 → H.265 解码器在特定固件版本下有并发 Bug
  • 如果仍崩溃 → 确认是帧率/吞吐量问题

2. 查看 VDEC 通道状态

崩溃后立即执行:

# 查看 VDEC 通道使用情况
cat /proc/hb_vdec/status

# 查看是否有通道报错
dmesg | grep -i vdec | tail -100

# 查看系统多媒体资源
sudo hb_sys show_vdec 2>/dev/null || echo "命令不存在,尝试 hb_vdec_tool"

关注点

  • 是否有通道显示 errortimeout
  • 崩溃的是否总是同一通道(如 ch_5)
  • HB_VDEC_GetFrame 是否返回错误码

3. 监控运行时资源

在运行时新开终端监控:

# 监控 CPU 和内存
top -H -p $(pgrep -f tros_container)

# 监控 VDEC 负载(如果有工具)
watch -n 1 'cat /proc/hb_vdec/status | grep -i "load\|busy"'

解决方案优先级

方案 A:降低帧率(推荐,成本最低)

将 6 路从 30fps 降为 15fps 或 20fps

{'output_framerate': 15},  # 总吞吐量降低 50%

预期效果:372 MP/s → 186 MP/s,远低于 498 MP/s 的上限,应能稳定运行。

方案 B:混合编码格式

如果某些路可以用 H.264:

# 3 路 H.265 + 3 路 H.264 @ 30fps
# H.264 解码效率通常更高,可能缓解资源竞争

方案 C:分批次启动

避免 6 路同时初始化:

from launch.actions import TimerAction

# 第 1 路立即启动
# 第 2-6 路各延迟 0.5-1 秒
TimerAction(
    period=0.5 * i,  # i = 1,2,3,4,5
    actions=[LoadComposableNodes(...)]
)

方案 D:增加看门狗

如果无法彻底解决,至少保证自愈:

# 创建监控脚本 monitor.sh
#!/bin/bash
while true; do
    ros2 launch your_package hobot_rtsp_client.launch.py
    EXIT_CODE=$?
    if [ $EXIT_CODE -eq -11 ] || [ $EXIT_CODE -eq 139 ]; then
        echo "Segfault detected. Restarting in 2s..."
        sleep 2
    else
        exit $EXIT_CODE
    fi
done

社区案例参考


下一步行动

  1. 立即执行单变量测试

    • 先测 6 路@15fps H.265(改帧率)
    • 再测 6 路@30fps H.264(改编码)
  2. 收集崩溃日志

    cat /proc/hb_vdec/status > vdec_crash.log
    dmesg | tail -200 >> vdec_crash.log
    
  3. 回复原帖:将测试结果和日志补充到 原帖,方便官方确认是否为已知的 VDEC 并发限制。

预期结论

  • 如果 15fps 稳定 → 生产环境建议控制在 15-20fps,或用多块 X5 分担负载
  • 如果 H.264 稳定 → 考虑摄像头切换为 H.264 输出(带宽略增,但兼容性更好)
  • 如果都崩溃 → 可能是 SDK 层面的 Bug,需要官方介入修复