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 专用驱动安装
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-smi 报 amdgpu 模块加载失败,优先检查内核头文件是否与 RT 内核匹配,必要时降级 ROCm 版本或改用 OpenVINO CPU 推理。完成以上四层配置后,可用一个最小验证程序串联:V4L2 采集一帧 → OpenCV 灰度化 → ONNX Runtime 推理 → 输出检测框。若该链路在目标板上稳定运行 10 分钟无丢帧、无内核报错,即可认为开发环境搭建完成,可进入后续的相机标定与算法移植阶段。