从零上手:基于征程®️5 EDK平台的快速原型开发指南

📅 发布时间:2026/7/15 19:20:29 👁️ 浏览次数:
从零上手:基于征程®️5 EDK平台的快速原型开发指南
1. 开箱与硬件初识你的第一块征程®️5 EDK开发板拿到地平线征程®️5 EDK开发套件第一感觉是什么我当初的感觉是这不像一块传统的“开发板”更像一个设计精巧的“小电脑”。对于刚接触嵌入式AI特别是想快速验证视觉算法的朋友来说这个第一印象很重要——它意味着你的开发体验会更接近在PC上写代码而不是在单片机上“抠”资源。整个套件核心是那个LS500_uSOM模组你可以把它理解成一台迷你电脑的“主板CPU内存”一体机。它集成了征程5芯片、LPDDR4内存和eMMC存储通过一个260针的SODIMM接口插在EDK转接板上。这种模块化设计的好处是你未来做产品时可以直接复用这个成熟的核心模组专注于自己的应用底板开发大大降低了硬件设计门槛和风险。转接板则把模组强大的接口能力“翻译”成了我们开发者熟悉的物理接口两个FPC连接器接摄像头一个Mini HDMI口输出视频一个千兆网口一个USB调试口还有一个PCIe x4扩展槽和一堆低速IO排针。开箱后别急着通电我建议你先花十分钟对照用户手册把板子上的主要接口都认一遍。重点看这几个电源接口一定要用配套的12V/5A电源适配器功率不足可能导致板子工作不稳定尤其是接上PCIe设备时。Micro USB调试口这是你接下来几天最亲密的“伙伴”系统日志、命令行操作都靠它。记得先安装CP210x的USB转串口驱动。Mini HDMI口旁边有个小小的拨码开关SW3它决定了视频输出信号是来自MIPI TX0还是TX1默认在TX0位置对应我们常用的摄像头输入通道。风扇接口EDK自带了一个小风扇和亚克力支架务必安装好。J5芯片算力全开时发热不小良好的散热是稳定运行的保障。把板子、支架、风扇组装好连接好电源和USB调试线先别通电你的硬件准备就完成了。这个过程就像拼装一个高性能的乐高核心部件都已经高度集成我们要做的就是把它们正确地组合起来为接下来的软件之旅打好基础。2. 软件环境搭建一条命令搞定开发环境硬件就位接下来就是搭建软件开发环境。这是新手最容易“卡住”的地方但基于EDK平台地平线已经做了极大的简化。你不需要在本地主机上折腾复杂的交叉编译工具链官方推荐并支持的是使用Docker容器作为统一的开发环境。这种方法我实测下来非常“稳”能完美解决库依赖冲突、环境不一致的问题。首先确保你的宿主机是一台装有Ubuntu 20.04或22.04的电脑物理机或虚拟机均可并且已经安装了Docker引擎。然后从地平线开发者社区或EDK资料包的06.软件工具.zip里找到官方提供的Docker镜像文件通常是一个.tar.gz包和对应的环境准备脚本。假设你已经下载了镜像包horizon_j5_edk_docker_v2.0.tar.gz和脚本setup_docker.sh打开终端跟着我做# 1. 加载Docker镜像到本地仓库 docker load -i horizon_j5_edk_docker_v2.0.tar.gz # 加载成功后用 docker images 命令应该能看到一个名为 horizon_j5_edk 的镜像 # 2. 运行环境准备脚本它会帮你创建并启动一个容器 chmod x setup_docker.sh ./setup_docker.sh这个脚本通常会做几件事创建一个容器将你当前的工作目录映射到容器内的/home/work目录方便文件共享将宿主机的USB设备映射进去以便在容器内访问EDK板的调试串口。容器启动后你会进入一个全新的bash终端这个终端里的环境就是已经配置好的、包含全套地平线SDK、交叉编译工具链、模型转换工具的“开箱即用”环境。为了验证环境是否正常我们可以在容器内尝试编译一个最简单的Hello World程序。用你熟悉的编辑器比如vim或vscode通过远程连接容器创建一个hello.c文件#include stdio.h int main() { printf(Hello, Journey 5 EDK!\n); return 0; }然后使用征程5的交叉编译工具链进行编译aarch64-linux-gnu-gcc hello.c -o hello编译成功后会生成一个名为hello的可执行文件。先别急着往板子上拷我们下一步要先把系统运行起来。3. 系统镜像烧录与上电初体验有了可执行程序就需要一个操作系统来运行它。EDK套件预装了Linux系统但为了确保环境一致我们通常使用官方提供的预编译镜像进行烧录。资料包中的04.EDK可烧写镜像包.zip里就包含了完整的系统镜像。烧录工具推荐使用balenaEtcher它界面简单跨平台支持好。将一张至少16GB的Micro SD卡通过读卡器插入电脑打开EtcherSelect image选择解压后的镜像文件通常是.img格式。Select drive选择你的SD卡操作前务必确认盘符避免误格式化其他磁盘。Flash!点击烧录等待进度条完成。烧录完成后将SD卡插入EDK板背面的卡槽。现在可以给板子上电了。打开电源开关SW1你会看到电源指示灯亮起。此时我们需要通过串口工具观察系统启动过程。在宿主机上使用Minicom、Picocom或MobaXtermWindows等工具连接到EDK板的USB调试口。以在Ubuntu下使用picocom为例先查看串口设备名ls /dev/ttyUSB*通常会是/dev/ttyUSB0。然后连接picocom -b 115200 /dev/ttyUSB0按下板上的复位键S1终端里会开始滚动大量的内核启动信息。耐心等待直到出现登录提示类似journey5-edk login:。默认的用户名是root密码通常为空或也是root。登录成功后你就进入了征程5芯片内部的Linux世界首先我们可以把刚才编译的hello程序拷贝到板子上。在容器终端里使用scp命令确保EDK板和宿主机在同一网络scp hello rootedk_board_ip:/home/root/然后回到串口终端运行它cd /home/root chmod x hello ./hello当屏幕上打印出 “Hello, Journey 5 EDK!” 时恭喜你你已经完成了从环境搭建、交叉编译到程序运行的全链路验证这证明你的硬件、系统、网络和开发环境全部工作正常。4. 外设基础测试让板子“看见”和“显示”嵌入式AI项目尤其是视觉相关的离不开摄像头输入和显示输出。在运行复杂的AI模型之前我们必须确保这些基础外设工作正常。EDK板提供了两路MIPI摄像头接口和一个HDMI输出测试起来非常方便。摄像头测试如果你有配套的MIPI摄像头模组如OV5695将其通过FPC软排线连接到板子的FPC Connector 1对应MIPI RX0。在串口终端中地平线的BSP已经集成了丰富的媒体库工具。我们可以使用hobot_vio相关的测试程序来预览摄像头画面。一个简单的测试命令是使用hobot_vio的示例程序将摄像头数据直接送到HDMI显示# 运行一个简单的摄像头采集与显示管道 sample_vio 0这个命令会启动一个预览流程。如果一切正常你连接的HDMI显示器上应该会出现摄像头捕捉到的实时画面。如果没有画面请依次检查摄像头排线是否插紧且方向正确SW3拨码开关是否在默认的TX0位置系统日志中是否有摄像头传感器被成功识别和初始化的信息。HDMI显示测试除了通过摄像头测试显示也可以直接测试显示功能。BSP中通常包含一个fb_test或类似的帧缓冲测试工具。运行它可以在屏幕上显示彩条或渐变图案用于验证显示通路和分辨率设置是否正确。# 测试帧缓冲通常会显示彩色条纹 fb_test通过这些基础测试我们确认了数据采集摄像头和数据呈现显示器这两个关键硬件通道是畅通的。这就像确保了我们的“眼睛”和“嘴巴”功能正常接下来就可以让“大脑”J5的BPU来处理和理解看到的内容了。5. 第一个AI推理Demo部署与运行终于来到最激动人心的环节——在EDK上运行AI模型。地平线提供了完整的工具链能将你训练好的模型如PyTorch、TensorFlow、ONNX格式转换成能在J5 BPU上高效运行的模型。对于新手最快的方式是直接使用官方提供的示例模型比如一个经典的分类模型如MobileNet或目标检测模型如YOLO系列。假设我们从地平线模型库下载了一个已经转换好的、用于人形检测的模型person_detection.bin和对应的配置文件。部署和运行一个AI Demo通常包含以下几步第一步准备模型与数据在开发容器内或通过SCP将模型文件person_detection.bin、person_detection.json配置文件以及一张测试图片test.jpg拷贝到EDK板的文件系统中例如/home/root/models/目录下。第二步编写简单的推理应用程序AI推理需要调用地平线的hobot_dnn等运行时库。这里给出一个极度简化的代码框架展示核心流程#include stdio.h #include stdlib.h #include hobot_dnn/hobot_dnn.h int main() { // 1. 初始化DNN服务 dnn_initialize(); // 2. 加载模型 const char* model_path /home/root/models/person_detection.bin; dnn_handle_t handle; dnn_load(model_path, handle); // 3. 准备输入数据这里需要将test.jpg预处理成模型需要的张量格式 // ... 图像读取、缩放、归一化、转换为NCHW排列等操作 // 假设 input_tensor 是预处理好的数据指针 dnn_input_t input; input.data input_tensor; input.size input_size; // 4. 执行推理 dnn_output_t output; dnn_forward(handle, input, 1, output); // 5. 解析输出 // output.data 里包含了检测框、类别、置信度等信息 // 根据模型输出结构进行解析例如画框或打印结果 printf(Detection results: ...\n); // 6. 释放资源 dnn_unload(handle); dnn_deinitialize(); return 0; }当然实际工程中你需要参考SDK中的完整示例处理图像编解码、模型前后处理等细节。地平线的示例包sample_mobilenetv1或sample_yolov5提供了开箱即用的参考。第三步编译与运行在容器内使用交叉编译工具链编译你的应用程序aarch64-linux-gnu-gcc your_demo.c -o your_demo -I/path/to/include -L/path/to/lib -lhobot_dnn -lhobot_utils将生成的可执行文件your_demo拷贝到板子上并确保相关的动态库路径已设置。然后在串口终端运行cd /home/root ./your_demo如果一切顺利程序会输出推理结果比如在图片中检测到了几个人以及他们的位置和置信度。你可以将这个结果与原始图片叠加通过HDMI显示出来就完成了一个完整的“摄像头采集-AI推理-结果可视化”的端到端流程。6. 深入探索与性能调优入门成功运行第一个Demo后你可能已经不满足于“跑通”而是想知道“怎么能跑得更好”这里分享几个我初期探索时关注的点和踩过的坑。模型转换的细节直接使用官方转换好的模型最省事但如果你想部署自己的模型就必须使用地平线提供的模型转换工具hr_tools。这个过程需要在开发容器内完成。关键点在于1) 确保你的原始模型ONNX符合BPU支持的操作算子列表2) 正确编写模型转换的配置文件.json其中指定输入输出节点、数据预处理方式如RGB还是BGR归一化参数等。一个常见的错误是预处理参数不对导致模型虽然能运行但精度暴跌。我的经验是先用一个非常简单的模型比如只有几层的自定义网络走通转换-部署-推理的全流程再处理复杂的模型。性能分析工具的使用想知道你的模型在BPU上跑了多久内存占用多少地平线提供了hobot_perf等性能分析工具。在运行推理程序时可以通过环境变量或工具采集性能数据。# 一种简单的性能统计方式 export HB_PERF1 ./your_demo运行后日志中会打印出各阶段耗时如模型加载时间、推理时间包括BPU计算和CPU后处理。如果发现推理耗时不符合预期可能是模型本身计算量大或者输入数据搬运、后处理部分成了瓶颈。这时就需要考虑模型优化如量化、剪枝或代码优化如使用零拷贝内存、并行处理。多路视频流处理J5 EDK支持多路MIPI输入这意味着你可以同时处理两个摄像头的画面。在软件上你需要创建多个视频采集通道viopipeline并将它们绑定到不同的推理任务上。这里需要注意线程安全和资源管理避免多个线程竞争BPU资源。一个实用的架构是采用生产者-消费者模式采集线程负责获取图像推理线程池负责处理显示线程负责渲染。利用PCIe扩展EDK板上的PCIe x4接口潜力巨大。你可以接入高性能的NVMe SSD来扩展存储存放海量的视频数据集或模型库也可以接入千兆或万兆网卡实现高速数据回传或集群通信。在系统启动后使用lspci命令可以查看识别到的PCIe设备。驱动适配可能需要根据具体的设备型号在SDK的kernel源码中进行相应的配置和编译。从点亮第一个LED到运行复杂的多路视觉AI流水线基于征程5 EDK平台的开发是一个循序渐进、充满成就感的过程。这套工具链和硬件设计确实如它所宣称的那样极大地降低了原型验证的门槛。我自己的体会是不要试图一开始就搭建一个完美的系统而是先追求“跑起来”再逐步迭代优化。遇到问题多查社区论坛和官方文档很多坑前辈们都踩过并留下了解决方案。最重要的是动手去做在真实的代码和调试信息中你对这颗强大芯片的理解会飞速加深。