2. 开发环境搭建

NVIDIA DRIVE 平台的开发环境与普通 x86 服务器上的 CUDA 开发有本质区别:代码最终运行在车端的 ARM 架构 DRIVE 计算单元(目标机)上,而编译、调试、可视化通常在 x86 工作站(主机)上完成。因此本节的核心任务是建立一条“主机编译 → 目标机运行 → 主机调试”的完整链路,并在这条链路上跑通第一个视觉感知程序。

一、主机与目标机的角色划分

典型配置中,主机是一台安装了 Ubuntu 20.04 LTS 的 x86_64 工作站,配备 NVIDIA 独立显卡(如 RTX A4000/A5000),用于运行 DriveWorks 的宿主端工具、编译交叉工具链、执行可视化与调试。目标机是 DRIVE AGX 开发套件(如 DRIVE AGX Orin),运行 DRIVE OS,包含 ARM Cortex-A78AE CPU、Ampere GPU 与 DLA 加速器,是感知程序的真实运行环境。

两者通过以太网连接,主机侧通常配置一个静态 IP(例如 192.168.1.100/24),目标机默认地址常见为 192.168.1.1 或由 DHCP 分配。主机需要能通过 SSH 登录目标机,并能访问目标机上的 NFS 或使用 scp 传输文件。判断链路是否就绪的最直接方式是:ssh nvidia@192.168.1.1 能成功登录,且 ping 无丢包。

二、安装 CUDA 与 DriveWorks

主机端 CUDA 用于本地编译与调试,版本必须与 DRIVE OS 中目标机 CUDA 版本匹配。以 DRIVE OS 6.x 为例,目标机为 CUDA 11.4,则主机也应安装 CUDA 11.4,避免运行时出现驱动/运行时版本不匹配。安装后通过 nvcc --version 与 nvidia-smi 确认。

DriveWorks 是 NVIDIA 提供的自动驾驶感知中间件,包含传感器抽象、图像处理、DNN 推理、点云处理等模块。安装时需从 NVIDIA 开发者账号下载与 DRIVE OS 版本对应的 DriveWorks SDK 包,解压后执行安装脚本。安装完成后,环境变量是关键:

export DRIVEWORKS=/usr/local/driveworks
export LD_LIBRARY_PATH=$DRIVEWORKS/lib:$LD_LIBRARY_PATH
export PATH=$DRIVEWORKS/bin:$PATH
export CUDA_HOME=/usr/local/cuda-11.4

验证安装是否成功,可运行 dwSampleCamera 或 dwSampleDNN 等示例程序,观察是否能正常初始化并输出日志。若提示找不到 libdw.so,通常是 LD_LIBRARY_PATH 未生效。

三、交叉编译环境配置

交叉编译的核心是使用目标机对应的 aarch64 工具链,在主机上生成 ARM 可执行文件。DriveWorks 提供了 CMake 工具链文件,通常位于 $DRIVEWORKS/cmake/toolchains 下。一个典型的交叉编译命令如下:

cmake -DCMAKE_TOOLCHAIN_FILE=$DRIVEWORKS/cmake/toolchains/aarch64-linux-gnu.toolchain.cmake \
      -DCMAKE_BUILD_TYPE=Release \
      -S . -B build_aarch64
cmake --build build_aarch64 -j8

编译产物为 aarch64 可执行文件,可通过 file build_aarch64/my_perception 确认架构为 ARM aarch64。随后用 scp 拷贝到目标机运行:

scp build_aarch64/my_perception nvidia@192.168.1.1:/home/nvidia/
ssh nvidia@192.168.1.1 ./my_perception

四、调试环境设置

调试分为主机侧和目标机侧。主机侧可使用 gdb 配合交叉调试工具链进行远程调试;目标机侧则常用 gdbserver 启动程序,主机通过 target remote 连接。对于视觉感知程序,更实用的调试手段是日志与可视化:在目标机上运行程序并输出中间结果(如检测框、置信度),再传回主机用 DriveWorks 的可视化工具或 OpenCV 显示。

此外,NVIDIA 提供 nsight-systems 与 nsight-compute 用于性能分析。若目标机支持,可通过 nsys profile 采集 CUDA 与 CPU 时间线,定位感知流水线中的瓶颈。

五、第一个视觉感知程序:图像读取与目标检测

下面给出一个最小可运行的感知程序框架,功能是读取一张图像,调用 DriveWorks 的 DNN 模块进行目标检测,并输出检测框数量与类别。示例参数为:输入图像 1920×1080,模型为 DriveWorks 自带的 dwDNN 示例模型,置信度阈值设为 0.5。

#include <dw/core/Context.h>
#include <dw/dnn/DNN.h>
#include <iostream>

int main() {
    dw::core::Context context;
    dw::dnn::DNN dnn(&context);
    dnn.initialize("model.bin", "model.json");
    // 假设已加载图像并预处理为 tensor
    // 推理后遍历输出,统计置信度 > 0.5 的检测框
    int count = 0;
    for (auto& det : dnn.getDetections()) {
        if (det.confidence > 0.5f) count++;
    }
    std::cout << "detections: " << count << std::endl;
    return 0;
}

编译运行后,若输出 detections: N 且 N 大于 0,说明 DNN 推理链路已通。若输出 0,需检查模型路径、输入尺寸与预处理是否匹配。若程序在目标机上崩溃,优先检查 LD_LIBRARY_PATH 是否包含 DriveWorks 与 CUDA 库路径。

主机—目标机交叉编译与感知程序运行链路 主机 (x86_64 Ubuntu 20.04) CUDA 11.4 + 驱动 nvcc / nvidia-smi 验证 DriveWorks SDK $DRIVEWORKS / lib / bin 交叉编译工具链 aarch64-linux-gnu.toolchain.cmake 调试与可视化 gdb / nsight / OpenCV 目标机 (DRIVE AGX Orin) DRIVE OS + CUDA 11.4 ARM Cortex-A78AE / Ampere GPU DriveWorks 运行时 libdw.so / DNN 模块 感知程序运行 图像读取 → DNN 推理 → 检测框 结果输出 detections: N / 日志回传 版本匹配 scp 传输 结果回传 关键检查点:SSH 连通、CUDA 版本一致、LD_LIBRARY_PATH 正确、交叉编译产物为 aarch64、目标机运行输出 detections: N

六、常见问题与判断依据

环境搭建阶段最容易出现三类问题。第一类是版本不匹配:主机 CUDA 与目标机 CUDA 不一致,导致编译通过但运行时报 CUDA driver version is insufficient。第二类是库路径问题:目标机运行时报 error while loading shared libraries: libdw.so,需在目标机 ~/.bashrc 中补充 LD_LIBRARY_PATH。第三类是交叉编译产物架构错误:若 file 命令显示 x86_64,说明工具链文件未生效,需检查 CMake 参数。

判断环境是否真正就绪,不看安装日志,而看三个可观察结果:主机上 nvcc --version 与目标机 nvcc --version 主版本一致;交叉编译产物 file 显示 aarch64;目标机上运行感知程序能输出非零检测框或明确的日志信息。三者同时满足,才说明主机—目标机链路、DriveWorks/CUDA 安装、交叉编译与调试环境均已打通,可以进入后续的感知算法开发。