4. 开发环境搭建

Ryzen Embedded 机器视觉平台的开发环境不是“装个 Ubuntu 就能跑”的通用环境,它同时承担三类任务:实时采集与运动控制、GPU/NPU 加速推理、以及面向目标板的交叉编译。本节按“宿主机实时化 → 专用驱动 → 视觉与推理框架 → 交叉工具链”的顺序展开,每一步都给出可执行的配置对象与判断依据。

一、实时内核:让采集与触发抖动可控

机器视觉中,相机触发、编码器采样、光源同步往往要求微秒到毫秒级的确定性。标准 Ubuntu 内核的 CFS 调度和不可抢占区会导致偶发数十毫秒延迟,因此需要实时内核。推荐使用 Ubuntu 22.04 LTS + PREEMPT_RT 补丁,或直接安装 linux-image-rt-amd64 系列。示例参数:目标板为 Ryzen Embedded V2718(8 核 16 线程),宿主机同为 x86_64,内核版本 5.15.0-rt。

# 安装实时内核(示例,版本以仓库为准)
sudo apt update
sudo apt install linux-image-5.15.0-rt-amd64 linux-headers-5.15.0-rt-amd64
sudo update-grub && sudo reboot

# 验证实时性
uname -a
# 应出现 PREEMPT_RT 字样

# 用 cyclictest 测抖动(示例:8 线程,优先级 80,跑 60 秒)
sudo cyclictest -t8 -p80 -n -i1000 -l60000 -h400

判断依据:cyclictest 输出的 Max 值若稳定在 100 μs 以内,说明实时性满足多数视觉触发场景;若 Max 超过 500 μs,需检查 BIOS 中 C-State、SMT 与电源策略,建议关闭深度 C-State 并设置 intel_pstate=disable 或 amd_pstate=passive。此外,将相机采集线程绑定到隔离核(isolcpus=2-5)并设置 SCHED_FIFO 优先级,可进一步降低抖动。

Ryzen Embedded 视觉开发环境四层依赖关系 ① 实时内核层 PREEMPT_RT 5.15 isolcpus / SCHED_FIFO ② 专用驱动层 amdgpu / Xilinx Vitis GigE Vision / USB3 Vision ③ 视觉与推理层 OpenCV 4.8 + DNN ONNX Runtime / ROCm ④ 交叉工具链 aarch64-linux-gnu sysroot / CMake 关键验证点与示例参数 cyclictest Max < 100 μs;关闭 C-State,绑定隔离核 2-5 amdgpu 驱动加载成功:dmesg | grep amdgpu;相机枚举 v4l2-ctl --list-devices OpenCV 编译开启 WITH_V4L=ON、WITH_OPENCL=ON;DNN 后端选 OpenVINO 或 ROCm 交叉编译:aarch64-linux-gnu-g++ + sysroot,CMake 指定 CMAKE_SYSROOT

二、Ryzen Embedded 专用驱动安装

Ryzen Embedded 的 GPU 为 Radeon Vega 或 RDNA 架构,Linux 下由 amdgpu 内核模块驱动。Ubuntu 22.04 默认已包含,但需确认固件包 linux-firmware 完整,并安装 mesa-va-drivers、vainfo 用于视频加速。若使用 Xilinx/AMD 的 Vitis 或 ROCm 进行推理加速,还需安装 rocm-opencl-runtime 与 rocm-smi。

# 检查 GPU 与驱动
lspci | grep -i vga
sudo dmesg | grep -i amdgpu | head
sudo apt install mesa-va-drivers vainfo
vainfo   # 应列出 H.264/HEVC 解码入口

# 安装 ROCm(示例,仅支持部分 Ryzen Embedded 型号)
sudo apt install rocm-opencl-runtime rocm-smi
rocm-smi  # 查看 GPU 温度、功耗、显存占用

相机侧驱动分两类:GigE Vision 相机通常依赖 arv-fake-gv-camera 或厂商 SDK(如 Basler pylon、Hikrobot MVS),需将 libgxiapi.so 加入 LD_LIBRARY_PATH;USB3 Vision 相机则通过 uvcvideo 或厂商内核模块加载。判断依据:v4l2-ctl --list-devices 能列出相机节点,且 v4l2-ctl -d /dev/video0 --all 可读到分辨率与帧率。

三、OpenCV 与深度学习框架部署

OpenCV 建议源码编译,以便开启 V4L2、OpenCL、FFmpeg 与 DNN 模块。示例配置:OpenCV 4.8.0,CMake 参数如下。

cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D WITH_V4L=ON -D WITH_OPENCL=ON \
      -D WITH_FFMPEG=ON -D OPENCV_DNN_OPENCL=ON \
      -D BUILD_EXAMPLES=OFF ..
make -j$(nproc) && sudo make install

深度学习推理可选三条路径:ONNX Runtime(CPU/OpenVINO)、OpenCV DNN(轻量)、ROCm + MIGraphX(GPU 加速)。以 ONNX Runtime 为例,安装 onnxruntime 后,用 providers=['ROCMExecutionProvider'] 即可调用 GPU。判断依据:加载一个 YOLOv8n ONNX 模型,输入 640×640,若单帧推理时间在 V2718 上稳定低于 30 ms,则满足 30 FPS 实时检测。

四、交叉编译工具链配置

目标板资源有限,通常在 x86_64 宿主机上交叉编译。安装 gcc-aarch64-linux-gnu 与 g++-aarch64-linux-gnu,并准备目标板 sysroot(可从目标板 /usr、/lib 打包)。CMake 工具链文件示例如下。

# toolchain-aarch64.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(CMAKE_SYSROOT /opt/sysroot-aarch64)
set(CMAKE_FIND_ROOT_PATH /opt/sysroot-aarch64)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

编译时使用 cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-aarch64.cmake ..,生成的 ELF 用 file 检查应为 ARM aarch64。将可执行文件与依赖库通过 scp 推送到目标板,运行 ldd 确认无缺失动态库。若出现 GLIBC_2.34 not found,说明 sysroot 版本低于目标板,需重新同步 sysroot。

建议将上述四步固化为一个 setup_env.sh 脚本,并在 CI 中缓存 sysroot 与 OpenCV 编译产物,避免每次重建耗时超过 40 分钟。
实时内核与 ROCm 驱动可能存在版本冲突:若 rocm-smi 报 amdgpu 模块加载失败,优先检查内核头文件是否与 RT 内核匹配,必要时降级 ROCm 版本或改用 OpenVINO CPU 推理。

完成以上四层配置后,可用一个最小验证程序串联:V4L2 采集一帧 → OpenCV 灰度化 → ONNX Runtime 推理 → 输出检测框。若该链路在目标板上稳定运行 10 分钟无丢帧、无内核报错,即可认为开发环境搭建完成,可进入后续的相机标定与算法移植阶段。