
1. 这套讲座到底在讲什么适合谁看先把结论摆在前面这套16讲的《从零开发一架会AI的无人机》本质上是一条把无人机飞控、ROS、Python、视觉感知串起来的入门路线而不是那种“三天教你造出大疆”的营销课。它解决的核心问题是——大部分小白学无人机要么只会飞成品机要么只会跑仿真中间那条“从硬件到算法再到智能决策”的链路是断的。这套讲座试图把这条链路补上。我接触过不少想入门无人机开发的朋友普遍卡在三个地方第一飞控固件PX4、ArduPilot参数一大堆不知道从哪下手第二ROS 环境装一次崩一次节点、话题、消息这些概念听着就头大第三Python 会写一点但不知道怎么跟真实硬件对话。这套讲座的定位就是冲着这三类人去的——有基本编程概念、想往机器人/无人机方向转的在校学生或者做嵌入式想拓展到智能无人系统的工程师。它“会AI”的部分我理解主要落在视觉感知和路径规划两块。视觉感知负责让无人机“看见”比如识别目标、避障、跟踪路径规划负责让它“想清楚怎么走”比如三维空间里的 A*、RRT 这类算法。这两块加上飞控的底层控制就构成了一个最小可用的智能无人机闭环。关键词里的 ROS、Python、飞控、视觉感知基本就是这套内容的技术骨架。需要提前说清楚的是这套讲座的“从零”指的是开发流程从零不是“连电烙铁都没摸过”的那种零。你至少得能看懂 Python 代码、知道 Linux 基本命令、理解什么是坐标系。如果这些都没有建议先补两周基础再回来不然第5讲之后会非常痛苦。下面我按自己的理解把这套内容拆成几个能落地的模块顺带把踩过的坑和参数逻辑讲透。2. 整体技术路线拆解与选型逻辑2.1 为什么是 PX4 ROS Python 这个组合无人机开发圈子里飞控固件主要就两个流派PX4 和 ArduPilot。这套讲座选 PX4我认为核心原因是它对 ROS 2 的支持更现代uORB 消息机制和 ROS 的话题机制在思路上很接近学一个能顺带理解另一个。ArduPilot 历史更久、社区更庞大但代码结构相对老派对新手读源码不太友好。ROS 这边现在主流是 ROS 2Humble 或 Foxy。ROS 1 虽然资料多但已经停止维护新项目没必要再入坑。ROS 2 的 DDS 通信机制让多机通信、分布式部署变得简单很多这对后面做多无人机协同是刚需。Python 作为主语言是因为它在视觉和算法原型上效率极高——OpenCV、NumPy、SciPy 这些库拿来就用不用像 C 那样纠结编译和内存管理。这个组合的典型数据流是这样的飞控PX4负责底层姿态和位置控制 → MAVROS/MicroXRCE-DDS 做桥接 → ROS 2 节点跑视觉和规划算法 → 通过话题把控制指令发回飞控。理解这条链路后面所有内容都能挂上去。2.2 仿真先行为什么强烈建议从模拟器起步真机炸一次轻则断桨重则烧电调钱包和心态双重打击。所以这套讲座大概率会安排仿真环节关键词里的“凤凰无人机模拟器”和“spacedrone 开源无人机”就是两个可选项。仿真环境的价值在于你可以用零成本反复验证控制逻辑和算法把“代码 bug”和“硬件故障”这两类问题分开排查。仿真选型上我建议优先考虑Gazebo PX4 SITL这套官方组合资料最全和 ROS 2 的桥接最成熟。凤凰模拟器更偏飞行手感训练适合练手动飞行但做算法开发不如 Gazebo 灵活。如果你只是想先感受一下无人机怎么飞凤凰够用如果要跑视觉和规划直接上 Gazebo。提示仿真里跑通的代码搬到真机前一定要做“参数对齐”。仿真里的电机响应、传感器噪声和真机差别很大尤其是 PID 参数直接照搬大概率会震荡。2.3 硬件选型的几个关键决策点关键词里出现了“pixhawk飞控”和“基于rk3588 px4飞控开发”这其实是两种不同定位的方案。Pixhawk 是标准飞控硬件负责实时控制RK3588 是机载计算平台负责跑视觉和 AI 算法。两者是配合关系不是替代关系。部件常见选型选型逻辑飞控Pixhawk 6C / 6X生态成熟MAVLink 支持好社区问题好查机载电脑RK3588 / 树莓派5 / Jetson Orin Nano看算力需求纯视觉 RK3588 够跑深度学习上 Jetson电机无刷电机 2212/2312 等按机架尺寸和载重反推 KV 值和桨叶电调四合一 BLHeli集成度高走线简单通信数传 图传数传传指令图传传视频别混用电机选型这块展开说一下因为关键词里有“如何自制载重20公斤的八旋翼无人机机架”这是很多人的真实需求。载重 20 公斤的八旋翼单轴拉力至少要留 2 倍余量也就是单电机最大拉力得在 5 公斤以上。按这个反推桨叶一般要 28 寸以上电机 KV 值会很低100 左右甚至更低电池得用 12S 甚至 14S。这个计算逻辑是总拉力 单电机拉力 × 电机数总拉力要 ≥ (机架重 载重 电池重) × 2。余量留 2 倍是为了悬停时油门在 50% 左右控制响应才够快。3. 环境搭建ROS 2 和 Python 的实操细节3.1 ROS 2 安装的坑与“一键脚本”的取舍关键词里“鱼香ros一键安装”出现频率很高说明很多人卡在 ROS 安装这一步。我的态度是一键脚本可以用但你要知道它干了什么否则出问题完全没法排查。ROS 2 在 Ubuntu 22.04 上的标准安装流程大致是配置软件源 → 安装 ros-humble-desktop → 配置环境变量 → 安装 colcon 构建工具。一键脚本省掉的是配置源和依赖处理这些琐事但它可能帮你装了你不想要的版本或者改了系统源导致其他软件出问题。我建议第一次装的时候手动走一遍官方流程把每一步的报错都看懂第二次再用脚本提效。# 配置 ROS 2 源以 Humble 为例 sudo apt install software-properties-common sudo add-apt-repository universe sudo apt update sudo apt install curl -y sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release echo $UBUNTU_CODENAME) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null sudo apt update sudo apt install ros-humble-desktop -y装完之后source /opt/ros/humble/setup.bash这行一定要写进.bashrc否则每开一个终端都要手动 source非常容易忘。3.2 Python 环境隔离别再用系统 Python 了关键词里“python安装”“python安装numpy库的方法”“python下载cv2”这些反映的是新手最常见的环境问题。系统自带的 Python 是给操作系统用的你往里装包轻则版本冲突重则把系统工具搞崩。正确做法是用conda 或 venv建独立环境。# 用 venv 建环境轻量推荐 python3 -m venv drone_env source drone_env/bin/activate pip install numpy opencv-python matplotlib # 或者用 conda管理科学计算库更方便 conda create -n drone python3.10 conda activate drone pip install numpy opencv-python装 OpenCV 的时候opencv-python和opencv-contrib-python的区别要搞清楚后者包含 SIFT、SURF 这些专利算法做视觉感知建议装 contrib 版。如果要用 CUDA 加速得从源码编译那个过程比较折腾新手先用 CPU 版跑通逻辑再说。注意ROS 2 的 Python 节点默认用的是系统 Python如果你在 conda 环境里写节点要确保 ROS 的 Python 包也能被找到否则会报ModuleNotFoundError: No module named rclpy。解决办法是在 conda 环境里也装一遍 ROS 的 Python 接口或者用--system-site-packages建 venv。3.3 飞控固件烧录与地面站配置PX4 固件烧录用 QGroundControl 最省事。烧录前确认飞控型号和固件版本匹配Pixhawk 6C 就选对应的板子别选错。烧录完成后传感器校准是必须的加速度计、陀螺仪、磁罗盘、水平校准一个都不能少。磁罗盘校准尤其重要没校准好的话无人机起飞后可能直接往一个方向飘。校准完之后建议先在仿真里验证一遍参数再上真机。真机首次解锁前一定要拆桨这是铁律。我见过太多人第一次解锁没拆桨电机一转桨叶直接削到手指或者打翻设备。4. 视觉感知与路径规划的核心实现4.1 视觉感知从摄像头到目标识别关键词里“无人机视觉感知”“ros打开电脑自带摄像头”“python下载cv2”指向的是视觉链路的起点。ROS 2 里打开摄像头最直接的方式是用usb_cam或v4l2_camera包把摄像头图像发布成/image_raw话题然后 Python 节点订阅这个话题做处理。import rclpy from rclpy.node import Node from sensor_msgs.msg import Image from cv_bridge import CvBridge import cv2 class VisionNode(Node): def __init__(self): super().__init__(vision_node) self.subscription self.create_subscription( Image, /image_raw, self.image_callback, 10) self.bridge CvBridge() def image_callback(self, msg): frame self.bridge.imgmsg_to_cv2(msg, bgr8) # 这里做你的视觉处理比如颜色识别、目标检测 gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow(view, gray) cv2.waitKey(1) def main(): rclpy.init() node VisionNode() rclpy.spin(node) rclpy.shutdown()这段代码是视觉节点的最小骨架。cv_bridge是 ROS 图像消息和 OpenCV 图像格式之间的转换桥梁没有它你就得手动解析图像数据非常麻烦。实际做目标识别时传统方法用颜色阈值 轮廓检测深度学习用 YOLO 系列。YOLOv8 在 RK3588 上跑需要转成 RKNN 格式才能用 NPU 加速直接用 PyTorch 模型跑 CPU 会很慢。视觉感知里一个容易被忽略的点是相机标定。没标定的相机测距和定位都会有系统误差。标定用 ROS 的camera_calibration包打印一张棋盘格从不同角度拍十几张生成内参矩阵和畸变系数。这个内参后面做视觉里程计或者目标定位时是必需的。4.2 路径规划三维空间里的算法选择关键词里“无人机路径规划”“无人机三维路径规划数学模型matlab代码”说明很多人关心这块。路径规划分全局和局部两层全局规划负责从起点到终点找一条大致可行的路径局部规划负责实时避障和轨迹微调。全局规划常用 A*、Dijkstra、RRT。A* 在栅格地图上效率高但三维栅格内存消耗大RRT 适合高维空间但路径不平滑需要后处理。实际工程里我见过比较多的是A做全局 局部用 MPC 或人工势场法*。三维 A* 的启发函数一般用欧氏距离代价函数要考虑飞行高度变化带来的能量消耗。import heapq import numpy as np def astar_3d(start, goal, grid, resolution1.0): # grid: 3D numpy array, 0 可通行, 1 障碍 open_set [(0, start)] came_from {} g_score {start: 0} f_score {start: np.linalg.norm(np.array(start) - np.array(goal))} while open_set: _, current heapq.heappop(open_set) if current goal: # 回溯路径 path [current] while current in came_from: current came_from[current] path.append(current) return path[::-1] for dx in [-1, 0, 1]: for dy in [-1, 0, 1]: for dz in [-1, 0, 1]: if dx dy dz 0: continue neighbor (current[0]dx, current[1]dy, current[2]dz) if not (0 neighbor[0] grid.shape[0] and 0 neighbor[1] grid.shape[1] and 0 neighbor[2] grid.shape[2]): continue if grid[neighbor] 1: continue tentative_g g_score[current] np.linalg.norm([dx, dy, dz]) * resolution if neighbor not in g_score or tentative_g g_score[neighbor]: came_from[neighbor] current g_score[neighbor] tentative_g f tentative_g np.linalg.norm(np.array(neighbor) - np.array(goal)) heapq.heappush(open_set, (f, neighbor)) return None这段三维 A* 是教学用的简化版实际用的时候要注意搜索空间太大会爆内存一般会做降采样或者用八叉树压缩。另外规划出来的路径是折线无人机飞起来会一顿一顿的需要用样条曲线或者多项式做平滑同时满足无人机的动力学约束最大速度、最大加速度、最大偏航角速度。4.3 飞控与算法的桥接MAVROS 和话题设计飞控和 ROS 之间的桥接ROS 1 时代用 MAVROSROS 2 时代可以用 MicroXRCE-DDS 或者 MAVROS 的 ROS 2 版本。桥接的核心是把飞控的位姿、速度、电池状态等消息转成 ROS 话题同时把 ROS 的控制指令转成 MAVLink 消息发给飞控。话题设计上我建议遵循这几个原则位姿用/mavros/local_position/pose控制用/mavros/setpoint_position/local或/mavros/setpoint_raw/local。前者是位置控制后者可以指定速度、加速度、姿态更灵活。做视觉伺服的时候通常用setpoint_raw发速度指令因为视觉反馈的频率和位置控制的频率不一定匹配。提示飞控的 offboard 模式需要持续收到设定点消息如果超过 0.5 秒没收到飞控会自动切回手动模式或者降落。所以你的控制节点必须保证发布频率稳定一般建议 20Hz 以上。5. 常见问题排查与避坑经验5.1 环境类问题速查现象可能原因解决思路rclpy找不到Python 环境不对确认 source 了 ROS 环境或用系统 Python摄像头打不开设备被占用或权限不足ls /dev/video*确认设备加用户到 video 组仿真里无人机不动没切 offboard 或没解锁检查模式切换和解锁指令顺序话题收不到数据话题名不匹配或 QoS 不一致ros2 topic list确认检查 QoS 配置编译报错缺依赖rosdep 没跑rosdep install --from-paths src --ignore-src -r -y5.2 真机调试的几条铁律第一条拆桨调试。任何涉及电机转动的测试桨叶必须拆掉。第二条先仿真后真机。仿真里跑不通的逻辑真机大概率也跑不通别抱侥幸心理。第三条参数改动一次只改一个。PID 三个参数一起调你根本不知道是哪个起了作用。第四条记录每次飞行的日志。PX4 的飞行日志用 Flight Review 分析炸机之后能回溯原因。我踩过最坑的一次是磁罗盘干扰。机载电脑的电源线离磁罗盘太近导致罗盘读数偏移无人机起飞后一直往一个方向偏。排查了半天才想到是电磁干扰。后来把罗盘用支架架高远离电源线问题就解决了。这种问题在仿真里永远遇不到只有真机才会暴露。5.3 视觉算法的性能优化RK3588 的 NPU 算力有限YOLOv8n 跑 1080p 大概能到 30fps 左右但如果你同时跑多个模型或者做复杂的后处理帧率会掉得厉害。优化思路有几个降低输入分辨率640×640 对检测任务通常够用、用 INT8 量化、把预处理和后处理放到 CPU 上并行。另外图像从摄像头到 NPU 的内存拷贝是瓶颈用零拷贝的 DMA 通道能省不少时间。路径规划这边三维 A* 在大地图上很慢可以考虑用JPS跳点搜索加速或者先用低分辨率地图规划粗路径再在局部用高分辨率细化。如果场景是动态的还得加滚动窗口重规划不然规划出来的路径可能已经撞上障碍了。6. 从这套内容能延伸出的几个方向学完这套基础内容往深了走有几个方向。一个是多机协同关键词里“ros多机通信配置”“ros多个节点发布移动指令话题时底盘节点如何取舍”就是这块的入口。多机协同的核心是命名空间隔离和时间同步每架无人机的话题加前缀用 ROS 2 的 DDS 域隔离不同机器时间同步用 PTP 或 NTP。另一个方向是倾转旋翼关键词里出现了“倾转旋翼无人机”。这种机型结合了多旋翼的垂直起降和固定翼的巡航效率但控制复杂度高很多过渡阶段的姿态控制是难点。如果你已经玩熟了四旋翼可以往这个方向挑战。还有一个是AI Agent 与无人机的结合。现在大模型能做任务规划把自然语言指令拆解成一系列飞行动作再通过 ROS 接口执行。这个方向很新工程上还不成熟但作为个人项目探索挺有意思。比如你说“去检查一下那片区域有没有人”Agent 拆解成“起飞 → 飞到目标区域 → 开启视觉检测 → 返回”然后调用对应的 ROS 服务。最后分享一个我在实际项目里的体会无人机开发最难的不是写代码而是让代码在真实物理世界里稳定运行。仿真里完美的算法到了真机上会被振动、风、电磁干扰、传感器噪声各种因素影响。所以别追求一次写出完美代码而是建立一套快速迭代和排查的流程——仿真验证逻辑真机小步测试日志驱动优化。这套16讲的内容如果能把这条流程跑通一遍比记住多少算法都值。