十四讲讲到这里飞机已经能稳定起飞、能悬停、能在地面站里看到状态数据了不少朋友开始追问同一个问题什么时候让飞机自己看东西自己躲障碍自己判断目标这一讲就专门聊这件事——机载AI部署也就是把训练好的AI模型装到无人机机载计算平台上让它在飞行过程中实时跑推理而不是把画面回传地面站再等结果。我见过太多人一开始信心满满地在PC上跑demo模型精度高得很一搬到飞机上就各种崩功耗撑不住、推理太慢、时序对不上、串口收不到指令。这篇内容适合正在从零开发无人机、准备给飞机加视觉能力的开发者也适合做毕设或竞赛项目的学生讲的是整条链路的工程细节不是只点一下理论。1. 机载AI部署为什么这么特殊1.1 算力不在云端机载AI部署的核心逻辑很多人会觉得既然我有一台性能很强的地面站为什么非要把模型塞到飞机上那点可怜的算力里去跑原因很简单无人机飞行是闭环控制问题不是离线分析问题。举个例子你让飞机自己避开前方一棵树。画面从摄像头出图到AI识别出前方障碍再到飞行控制执行刹车或绕飞这个完整回路能接受的延迟是非常有限的。人对正在接近的障碍物反应需要一两百毫秒都显得慢无人机在空中动辄每秒几米到十几米的速度一百毫秒就会多飞出大半米到一米。如果这条路走的是地面站——摄像头画面通过图传链路回传、地面站推理、再发控制指令回传——中间至少要经过两次无线链路加一次完整AI推理延迟很容易跳到几百毫秒甚至一秒以上。想要让飞机真正对外界做出及时反应推理必须发生在飞机上。另外还有一层原因图传链路和数传链路的带宽都不宽裕飞行中大量回传高分辨率画面并不现实。机载AI部署的本质就是把感知能力搬到端侧让飞机自带“眼睛”和“脑子”。这是从“会飞的遥控车”变成“会思考的无人机”最关键的一道分水岭。1.2 先看物理预算你能往飞机上塞多大的算力无人机给AI的物理预算极其苛刻。这不是台式机上插一块显卡那么简单你得考虑重量、功耗、散热、供电、结构强度还有飞行时间。电池就那么几块电机电调本来就抢电AI板卡再多吃几十瓦整机续航可能直接砍半。所以机载AI平台选型第一件事不是看谁算力最高而是算清楚你飞机的有效载荷和可用功耗。我自己习惯把这个过程叫“算物理预算”先确定你能接受加装多少克载荷再从功耗和性能两个维度反推平台。下面这张表是几个常见方案的典型参数可以做个参考机载AI平台典型算力典型功耗适合机型Jetson Orin Nano Developer Kit约40 TOPSINT87W-25W可调功率模式450轴距以上四轴、常规科研机Jetson Xavier NX约21 TOPSINT810W-21W大轴距四轴、六轴瑞芯微 RK35886 TOPS NPU GPU约5W-8W整板更低小四轴、轻载平台树莓派5 Coral Edge TPUTPU约4 TOPS板卡加USB整体10W左右熟悉Linux生态的学习验证注意TOPS不是唯一指标。有些平台理论算力很夸张但实际跑某个模型时框架适配不好照样跑不快有些平台算力一般但因为TensorRT或NPU适配成熟实际帧率反而很稳。我建议选型时先确定你跑的模型再用真实推理帧率和功耗去衡量不要只看厂商宣传的TOPS。功耗方面还有个容易被忽略的点散热。Jetson系列在25W功耗下若不做好风道或散热片高温后会自动降频性能掉到只剩三分之一。飞机又是一个相对密闭、震动强、空气流动不稳定的环境不能照搬开发板桌面跑测试的方式。装机时宁可多花一点重量给散热也别省。2. 模型选型与优化不是把桌面demo直接塞上去2.1 按任务选模型别一上来就上大模型机载AI的模型选择核心不是“越准越好”而是“在限定算力和延迟内够用就好”。无人机场景常见任务无非几类目标检测、目标跟踪、语义分割地面/障碍物判定、简单的分类。不同任务有非常成熟的轻量化选项比如目标检测用YOLOv8n或YOLOv5s语义分割用带MobileNet编码器的轻量分割网络目标跟踪用轻量检测器加ByteTrack或DeepSORT这类经典框架。不要一上来上一个大模型然后天真地以为量化一下就能变成实时。输入分辨率也是一个容易被忽视的超参。许多人在PC demo里习惯用1080P原图推理往飞机上一跑发现速度惨不忍睹。实际机载视觉几乎不需要那么高输入分辨率640×640对大多数避障和目标识别任务已经足够更低至416×416甚至320×320也常被用来换帧率。模型参数量、输入分辨率、帧率、精度四个指标是互相牵制的先想清楚你的任务到底需要什么而不是追求“看起来豪华”的模型。2.2 压缩三件套量化、剪枝、蒸馏都是怎么落地的模型直接搬到嵌入式设备上往往跑不动压缩基本是必须走的流程。机载部署里最常用、见效最快的是量化。FP32模型转到FP16通常是无损或近乎无损的加速手段在TensorRT里一条命令就能开启从FP16再压到INT8模型体积能再缩小一半推理速度明显提升但精度多少会掉一点且不同模型掉点程度差很多。我在实际项目中有一个原则先在FP16下把整条链路跑通再看延迟还有多少余量再来评估是否需要INT8。如果INT8量化后精度掉得比较厉害就得考虑剪枝和蒸馏。剪枝就是剔除网络中对输出影响较小的通道或权重把模型本身变薄蒸馏则是用一个精度高的大模型当老师去教一个小模型学任务让小模型在同等体积下学得更聪明。三者可以配合使用先训练一个大模型的老师蒸馏出一个较小的学生再做剪枝和量化最后部署到机载平台。每一步压缩之后都要在固定测试集上对比精度不要等到装机以后才发现模型已经“失智”了。量化还有一点要特别提醒尽量在量化后做验证时保留同一组图片和标注。很多人在PC上跑量化模型时精度好像不错到了无人机上因为输入画面光照完全不同表现立刻打回原形。压缩前准备一个贴近飞行环境的小验证集成本很低收益很大。2.3 数据采集无人机视角和你会以为的视角差别很大我在给不少队伍做技术方案时都强调过无人机AI模型不能只拿公开的桌面视角数据集来训练。无人机看东西是高位俯视视角目标尺度变化快光照会因为飞行朝向而剧烈变化画面里还可能带运动模糊和螺旋桨震动。这些都是Open Images、COCO这些常规数据集很少覆盖的。数据来源一般有三条路一是用自己飞机挂相机实地采集这在后期微调阶段最可靠二是用AirSim、Gazebo或UE合成仿真数据适合早期把链路跑通三是在公开的无人机视角数据集上做预训练再叠加少量真实场景微调。三条路可以结合但一定要形成“采集—标注—训练—部署—飞行验证—再采集”的闭环模型越贴近实际环境最终部署时的误差才越小。数据闭环听起来不性感却比调参更能决定最终系统能不能用。3. 主控与AI处理器之间的“接头暗号”3.1 飞控和AI主板的通信链路UART与MAVLink模型推理出结果后还需要把结果交给飞控去执行。绝大多数开源自组无人机的架构是“STM32或类似芯片的飞控 Linux机载AI主板”的组合这两者之间的通信链路通常就是UART串口走MAVLink协议。飞控上跑PX4或ArduPilotAI主板上跑一个MAVLink库通过串口收发消息。为什么不用USB甚至以太网因为UART简单、稳定、实时性强数据量对飞行控制指令来说并不大完全够用而且调试也方便。接线其实不难但方向反了是新手最常犯的错AI主板的TX要接飞控的RXRX接飞控的TX地线要共地。波特率要两边设置一致我常用921600数据量较大时也稳定。注意串口在Linux里默认没有访问权限需要把当前用户加入dialout组或者写udev规则放开对应设备节点。这一步不做你会发现代码逻辑完全没问题但每次打开端口都报权限错误。3.2 传感器数据喂给模型要过哪些关视觉AI模型不是只接收一张图片就能干活的机载系统里往往要同时接入摄像头、IMU甚至GPS数据让AI的输出结果能和飞机当前姿态、位置对应上。这里需要设计一个合理的数据流架构我习惯把它拆成几个相互独立的处理线程采集线程从摄像头读帧维护一个固定大小的最新帧缓冲区姿态线程以较高频率读取IMU维护姿态和时间戳推理线程从缓冲区取最新帧做预处理和推理输出目标信息决策/通信线程把推理结果封装成MAVLink消息发给飞控。这样拆的好处是每个环节可以独立调节摄像头掉帧不会直接影响IMU采集推理速度慢也不会卡死飞控通信。线程之间尽量不要用一个大锁把所有流程串起来否则又退化成单线程了延迟蹭蹭往上涨。3.3 掉帧与时间同步模型看到的和飞机感受到的对不上机载系统有个很隐蔽的问题IMU和相机的时间戳如果对不上急转弯或剧烈抖动时AI给出的目标位置和飞机真实姿态会产生明显偏差。比如视觉已经识别出正前方障碍物但飞控认的是0.5秒前的姿态等你再叠加控制逻辑时就很容易出问题。解决办法是在传感器驱动层统一打时间戳以主控的系统时间为基准给每一帧图像和每一条IMU数据都贴上毫秒级时间标签。视觉里程测速和姿态融合时如果涉及多传感器滑窗处理可以用一个固定长度的滑窗缓冲区来做时间对齐这也是“滑动窗口滤波模型”这个说法在机载感知里最常见的落地点。图像端还需要做掉帧处理不要用队列把旧帧越积越多推理追不上采集速度时优先保留最新帧、主动丢老帧。对实时控制来说延迟半秒的“新数据”比晚来半秒的“旧数据”更危险。4. 实操把模型真正部署到机载AI设备上4.1 环境准备一个能省三小时起步的依赖清单部署的第一步最容易劝退人因为在嵌入式设备上装深度学习环境和在PC上完全不同。以Jetson系列为例JetPack系统里会自带匹配版本的CUDA、cuDNN和TensorRT这时候切忌用PC上的习惯直接pip install torch一把梭。许多歪打误撞的报错都是因为装到了不匹配CUDA架构的wheel包。嵌入式平台上安装PyTorch优先从NVIDIA提供的索引地址下载wheel或者直接用官方JetPack镜像里预置的Python环境。确认硬件信息可以先看架构和GPU算力在设备上跑几行命令uname -m cat /etc/nv_tegra_release python3 -c import torch; print(torch.cuda.get_device_capability(0))这样你至少能确认CPU架构、系统版本和GPU算力后面安装依赖时心里有数。跑模型前建议用虚拟环境隔离别把所有包都装在系统Python里不然装错一次版本后面排查会非常痛苦。4.2 模型转换PyTorch到ONNX再到TensorRT的三步走在PC上训练好的PyTorch模型要真正发挥机载GPU或NPU的性能通常得转成推理引擎。TensorRT是NVIDIA平台上最常用的方案转换路径是PyTorch权重导出为ONNX通用格式再由ONNX转为TensorRT engine。导出ONNX的关键是固定输入尺寸和正确处理动态轴。对YOLO类模型我通常固定成1×3×640×640的输入形状导出时明确指定输入名和输出名比如import torch model load_yolo_model(yolov8n.pt) model.eval() dummy_input torch.randn(1, 3, 640, 640) torch.onnx.export( model, dummy_input, yolov8n.onnx, input_names[images], output_names[output], opset_version17, dynamic_axesNone )然后再到机载设备上用TensorRT自带的trtexec命令行工具把ONNX转成enginetrtexec --onnxyolov8n.onnx --saveEngineyolov8n.engine --fp16 --workspace2048这段命令会在当前设备上生成一个绑定了GPU架构、CUDA和TensorRT版本的engine文件这个文件换个板子大概率加载失败。所以谁在飞机上跑就尽量在谁的环境里转换。你做项目时如果先在台式机上把engine生成好再拷到板子上能跑起来是运气跑不起来是常态。4.3 最小推理闭环一段能让你少走弯路的代码框架部署推理代码没必要把框架搞得太复杂但有几个关键点必须处理好。下面是一个最简单但完整的循环骨架核心是在初始化时加载引擎循环里只做取帧、预处理、推理、后处理、发送结果五件事。import tensorrt as trt import numpy as np import cv2 # 初始化阶段只做一次 runtime trt.Runtime(trt.Logger(trt.Logger.WARNING)) with open(yolov8n.engine, rb) as f: engine runtime.deserialize_cuda_engine(f.read()) context engine.create_execution_context() # 预分配输入输出缓冲不要每次推理都重复申请 h_input np.empty((1, 3, 640, 640), dtypenp.float32) h_output np.empty((1, 84, 8400), dtypenp.float32) d_input, d_output cuda_allocate_buffers(...) while True: frame camera_read() # 从摄像头取最新帧 blob preprocess(frame) # resize/letterbox/BGR2RGB/归一化 np.copyto(h_input, blob) cuda_memcpy_h2d(d_input, h_input) context.execute_v2(bindings[d_input, d_output]) cuda_memcpy_d2h(h_output, d_output) detections postprocess(h_output, frame.shape) # 解析bounding box send_to_fc(detections, attitude) # 封装MAVLink消息这个框架里最重要的两点一是缓冲区只分配一次不要在while循环里反复创建数组否则掉帧和碎片会一起找上门二是在板端推理时尽可能采用异步Stream 双缓冲让数据搬运和GPU计算重叠起来。单线程也能用但性能会差不少尤其在帧率要求超过30FPS时。4.4 调优与实测别只看TOPS要看FPS部署完成后要做的第一件事是实测而不是对着理论算力脑补。我通常做一张表把输入分辨率、精度模式、推理延迟、单帧处理总耗时、CPU占用记录清楚。以轻量检测模型在Jetson Orin Nano上的典型表现为例FP16和640×640输入时单次推理大约能跑到20到40FPS之间具体数字取决于模型和框架版本。如果你发现速度上不去优先检查三个地方是否真的用了FP16/INT8、输入分辨率是否过高、后处理是否全在Python里逐框循环。还有一个隐藏性能杀手是日志。推理循环里每帧都print一两条调试信息若干毫秒的CPU占用看似不起眼但会和IMU读取、串口发送抢CPU时间整体帧率直接被拽下来。部署到飞机上之前把所有调试输出收敛到单独一个日志进程或直接关闭这个细节能让你少踩很多坑。5. 常见问题与排查技巧实录5.1 部署问题速查表机载AI部署的过程绝不是一帆风顺的我把几个高频问题整理成表格方便你对着自查现象可能原因解决方式engine加载失败TensorRT版本或GPU架构与转换时不匹配在同一设备/同一JetPack版本下重新转换推理速度远低于预期仍在使用FP32或后处理拖慢总体开启FP16/INT8后处理向量化或批处理输出结果全错或NaN预处理不一致如归一化系数、通道顺序不对将预处理参数与训练时严格对齐串口收不到数据TX/RX接反、波特率不一致、权限没放开检查交叉接线、统一波特率、加入dialout组飞机一上电AI板卡重启供电电压被电机电调拉垮用独立稳压模块给AI板卡供电避免共电源瞬断推理一段时间后越来越慢温度降频或内存泄漏检查散热、限制TDP、确认引擎只加载一次5.2 四个容易忽视的“隐形坑”除了表格里能直接对上号的问题还有几个我踩过多次的坑值得单独拿出来说。第一个是功耗墙。很多开发板默认运行在满功耗模式但无人机上电池电压波动大持续高功耗会引发过热降频。需要在系统里明确选择一种功率模式并锁定比如Jetson系列可以通过nvpmodel -m来设置15W档而不是任它自己切换。稳定比峰值性能重要得多。第二个是供电毛刺。电机突然全速加载时整机电压瞬时跌落非常明显AI板卡可能直接重启或者在错误状态下悬挂。我给机载AI板卡单独接一个稳压模块尽量不走飞控的电源轨能有效避免这种“查不出原因的死机”。第三个是内存泄漏。推理循环如果反复创建engine、反复申请TensorRT上下文或每次循环都新建numpy数组内存会以肉眼可见速度涨。飞控程序可能连续运行几十分钟内存泄漏带来的崩溃往往在测试最难复现的时候突然出现。第四个是打印和日志。在开发阶段print很自然但拍照式打印到生产环境会严重挤占CPU。建议把日志级别和开关配置化默认关闭或只保留错误级输出。这个坑小但最容易在最后实测时给你来一刀。5.3 一个真实的排障记录我在某次野外测试中遇到过最抓狂的问题模型在调试机上跑50毫秒一次推理换到装机状态后变成300毫秒检查CPU占用、显存、功率全部正常最后发现是排线接触不良导致摄像头偶尔掉帧而我的预处理流程一遇到坏帧就阻塞等待把整条链路拖慢了。这类问题很难在桌面上复现只能靠日志里加时间戳逐步定位。从那以后我在所有采集和推理环节都打了毫秒级时间戳并在掉帧时主动丢弃坏帧而不是死等后面就再没出现过类似诡异问题。如果你按这条思路把自己的机载AI链路搭起来接下来可以做的一件事是把模型的检测结果从像素坐标转到无人机坐标系比如东北天坐标系里再和飞控的姿态环做一个简单的融合。我自己在做这个系列时最大的感受是模型精度和推理速度只是地基真正决定系统能不能稳定飞出去的是数据和硬件之间各种细枝末节的配合。我也希望这一讲能帮你把那些没有写在论文里的工程坑提前踩一遍少走一段弯路。
企业数字化 ERP 产品动态
相关推荐
Selenium浏览器驱动自动化管理实践指南 1. 为什么我们需要自动化管理浏览器驱动? 作为一名长期使用Selenium进行自动化测试的开发者,我深刻理解浏览器驱动管理带来的痛苦。每次Chrome自动更新后,测试脚本突然无法运行,控制台抛出"SessionNotCreatedException"… · 2026/11/4 13:28:23
中国装卸机器人技术突破与物流自动化应用 1. 装卸机器人行业的新突破:中国企业如何攻克"最后20米"难题 在物流自动化领域,装卸环节长期被视为"最难啃的骨头"。传统自动化设备在分拣、运输等环节已经相当成熟,但当货物到达货车装卸这个"最后20米"时&… · 2026/11/4 13:28:23
线性表与顺序表:数据结构基础与工程实践 1. 线性表基础概念解析 线性表作为数据结构中最基础也最重要的组织形式之一,是每个程序员必须掌握的"内功心法"。我在实际教学和工程实践中发现,很多初学者对线性表的理解往往停留在表面,导致后续学习更复杂数据结构时出现理解障碍… · 2026/11/4 13:28:23
Zotero PDF Translate 划词翻译指南:4 步从安装到划词即译 Zotero PDF Translate 划词翻译指南:4 步从安装到划词即译 【免费下载链接】zotero-pdf-translate Translate PDF, EPub, webpage, metadata, annotations, notes to the target language. Support 20 translate services. 项目地址: https://gitcode.com/gh_mirr… · 2026/11/4 15:38:42
Folia 手机PWA安装方法:零代码部署全屏歌词动画播放器到手机主屏 Folia 手机PWA安装方法:零代码部署全屏歌词动画播放器到手机主屏 【免费下载链接】folia-major 专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major
Folia 是一款全屏… · 2026/11/4 15:38:42
March7thAssistant:星穹铁道日常与周常自动化托管的完整实践指南 March7thAssistant:星穹铁道日常与周常自动化托管的完整实践指南 【免费下载链接】March7thAssistant 日常交给三月七,开拓留给你。《崩坏:星穹铁道》开源自动化助手。 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant … · 2026/11/4 15:38:42
LinkSwift 指南:3 步拿到九大网盘直链 LinkSwift 指南:3 步拿到九大网盘直链 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云盘… · 2026/11/4 15:38:42
Apache Doris 监控实战:从一次查询延迟告警看懂 3 个关键指标 Apache Doris 监控实战:从一次查询延迟告警看懂 3 个关键指标 【免费下载链接】doris Apache Doris is an easy-to-use, high performance and unified analytics database. 项目地址: https://gitcode.com/gh_mirrors/dori/doris
一次线上事故复盘ÿ… · 2026/11/4 15:37:41
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38