无人机 · 大学进阶教程
适合大学本科及以上学生,深入无人机系统的核心技术:飞控算法、自主导航、多机协同、视觉 SLAM、深度强化学习避障,以及无人机在行业中的工程化应用。
第一章 无人机系统架构深度解析
1.1 完整无人机系统组成
一个完整的自主无人机系统包含以下层次:
┌─────────────────────────────────────────┐
│ 任务规划层 │
│ (Mission Planning / Ground Control) │
├─────────────────────────────────────────┤
│ 导航决策层 │
│ (Path Planning / Behavior Tree) │
├─────────────────────────────────────────┤
│ 状态估计层 │
│ (State Estimation / Sensor Fusion) │
├─────────────────────────────────────────┤
│ 飞行控制层 │
│ (Flight Control / PID / MPC) │
├─────────────────────────────────────────┤
│ 执行机构层 │
│ (Motor / ESC / Servo) │
─────────────────────────────────────────┘
1.2 飞控软件架构对比
| 飞控系统 | 开发语言 | 特点 | 适用场景 |
| PX4 | C++ | 模块化、支持多种硬件、ROS2 集成 | 科研、工业、竞赛 |
| ArduPilot | C++ | 功能全面、社区庞大、文档丰富 | 多旋翼/固定翼/车/船 |
| Betaflight | C | 极致性能、低延迟 | FPV 竞速 |
| iNav | C | 导航能力强 | 固定翼长航时 |
| 自研飞控 | 任意 | 完全定制 | 学术研究 |
1.3 PX4 架构深入
PX4 采用微内核 + 应用架构,核心概念:
- uORB(micro Object Request Broker):模块间通信机制,类似 ROS 的 Topic
- 模块(Module):每个功能是一个独立模块(姿态估计、位置控制等)
- 参数系统:运行时可调参数,无需重新编译
- MAVLink:与地面站通信的标准协议
PX4 核心模块数据流:
传感器原始数据 → 传感器融合(EKF2)→ 姿态估计
↓
位置/速度估计
↓
位置控制器 → 姿态控制器 → 混控器 → 电机
第二章 飞行控制算法
2.1 PID 控制器
PID(比例-积分-微分)控制器是无人机飞控的基础:
公式:
u(t) = Kp·e(t) + Ki·∫e(t)dt + Kd·de(t)/dt
其中:
- Kp(比例):对当前误差的响应,太大导致振荡
- Ki(积分):消除稳态误差,太大导致超调
- Kd(微分):预测趋势、抑制振荡,太大放大噪声
无人机中的应用:
- 外环(位置环):位置 PID → 输出期望速度
- 中环(速度环):速度 PID → 输出期望姿态角
- 内环(姿态环):姿态 PID → 输出期望角速度
- 最内环(角速度环):角速度 PID → 输出电机 PWM
2.2 级联 PID 调参
调参顺序(从内到外):
- 角速度环:先调 Kp 直到快速响应,加 Kd 抑制振荡
- 姿态环:调 Kp 使姿态快速跟踪期望值
- 速度环:调 Kp 和 Ki 实现精确速度控制
- 位置环:调 Kp 实现平滑的位置跟踪
2.3 高级控制方法
| 方法 | 原理 | 优势 | 挑战 |
| MPC(模型预测控制) | 基于动力学模型预测未来状态,优化控制序列 | 处理约束、多变量耦合 | 计算量大 |
| 自适应控制 | 在线估计模型参数,自动调整控制器 | 应对载荷变化、风扰 | 稳定性证明困难 |
| 滑模控制 | 设计滑模面,强制系统状态趋向滑模面 | 鲁棒性强 | 抖振问题 |
| LQR(线性二次调节器) | 最优控制理论,最小化代价函数 | 理论保证、性能优 | 需要精确模型 |
| 深度强化学习 | 神经网络学习控制策略 | 处理复杂非线性 | 训练困难、安全性 |
2.4 实践:用 Python 仿真 PID 控制器
import numpy as np
import matplotlib.pyplot as plt
class DronePID:
def __init__(self, kp, ki, kd):
self.kp = kp
self.ki = ki
self.kd = kd
self.integral = 0
self.prev_error = 0
def update(self, target, current, dt):
error = target - current
self.integral += error * dt
derivative = (error - self.prev_error) / dt
output = self.kp * error + self.ki * self.integral + self.kd * derivative
self.prev_error = error
return output
# 仿真无人机高度控制
dt = 0.01
time = np.arange(0, 10, dt)
target_height = 5.0 # 目标高度 5 米
current_height = 0.0
velocity = 0.0
mass = 1.0 # kg
gravity = 9.8
heights = []
pid = DronePID(kp=8.0, ki=0.5, kd=2.0)
for t in time:
thrust = pid.update(target_height, current_height, dt)
thrust = np.clip(thrust + mass * gravity, 0, 30) # 限制推力
acceleration = (thrust - mass * gravity) / mass
velocity += acceleration * dt
current_height += velocity * dt
heights.append(current_height)
plt.plot(time, heights, label='实际高度')
plt.axhline(y=target_height, color='r', linestyle='--', label='目标高度')
plt.xlabel('时间 (s)')
plt.ylabel('高度 (m)')
plt.legend()
plt.title('无人机高度 PID 控制仿真')
plt.show()
第三章 自主导航与感知
3.1 状态估计:EKF(扩展卡尔曼滤波)
无人机需要精确知道自己在哪、姿态如何。EKF2 是 PX4 中使用的状态估计算法:
融合的数据源:
- IMU(加速度计 + 陀螺仪):高频但漂移
- 气压计:高度测量
- GPS:位置测量,低频但有绝对参考
- 光流/视觉里程计:相对位移
- 磁力计:航向参考
EKF 核心思想:
- 预测步:用动力学模型预测下一状态
- 更新步:用传感器测量值修正预测
3.2 视觉 SLAM
SLAM(Simultaneous Localization and Mapping):同时定位与建图。
无人机视觉 SLAM 方案:
| 方案 | 类型 | 特点 | 代表系统 |
| 特征点法 | 间接法 | 精确、计算量大 | ORB-SLAM3 |
| 直接法 | 直接法 | 不需要特征提取 | DSO |
| 视觉惯性 | 融合 IMU | 鲁棒性强 | VINS-Mono, VINS-Fusion |
| 深度学习 | 端到端 | 前沿研究方向 | DeepVO |
VINS-Mono 工作流程:
相机图像 → 特征提取与跟踪 → IMU 预积分
↓ ↓
视觉约束 惯性约束
↓ ↓
联合优化(滑动窗口非线性优化)
↓
位姿估计 + 稀疏地图
3.3 路径规划算法
| 算法 | 类型 | 适用场景 | 复杂度 |
| A* | 图搜索 | 已知地图、静态环境 | O(E log V) |
| Dijkstra | 图搜索 | 最短路径 | O(V²) |
| RRT | 采样 | 高维空间、复杂约束 | 概率完备 |
| RRT* | 采样优化 | 渐进最优路径 | 收敛慢 |
| APF(人工势场) | 局部规划 | 实时避障 | 局部极小值 |
| DWA | 局部规划 | 动态窗口法 | 实时性好 |
| Hybrid A* | 混合 | 考虑运动学约束 | 较复杂 |
3.4 实践:RRT 路径规划仿真
import numpy as np
import matplotlib.pyplot as plt
class RRTPlanner:
def __init__(self, start, goal, bounds, max_iter=1000, step_size=0.5):
self.start = np.array(start)
self.goal = np.array(goal)
self.bounds = bounds
self.max_iter = max_iter
self.step_size = step_size
self.nodes = [self.start]
self.edges = []
def random_point(self):
return np.array([
np.random.uniform(self.bounds[0], self.bounds[1]),
np.random.uniform(self.bounds[2], self.bounds[3])
])
def nearest(self, point):
nodes = np.array(self.nodes)
dists = np.linalg.norm(nodes - point, axis=1)
return self.nodes[np.argmin(dists)]
def steer(self, from_point, to_point):
direction = to_point - from_point
length = np.linalg.norm(direction)
if length > self.step_size:
direction = direction / length * self.step_size
return from_point + direction
def plan(self, obstacles=None):
obstacles = obstacles or []
for _ in range(self.max_iter):
rand = self.random_point()
near = self.nearest(rand)
new = self.steer(near, rand)
# 碰撞检测
collision = False
for obs in obstacles:
if self._check_collision(near, new, obs):
collision = True
break
if not collision:
self.nodes.append(new)
self.edges.append((near, new))
if np.linalg.norm(new - self.goal) < self.step_size:
self.nodes.append(self.goal)
self.edges.append((new, self.goal))
return True
return False
def _check_collision(self, p1, p2, obs):
# 简化的圆形障碍物碰撞检测
center, radius = obs
for t in np.linspace(0, 1, 10):
point = p1 + t * (p2 - p1)
if np.linalg.norm(point - center) < radius:
return True
return False
# 使用示例
planner = RRTPlanner(
start=(1, 1), goal=(9, 9),
bounds=(0, 10, 0, 10),
max_iter=2000
)
obstacles = [(5, 5, 1.5), (3, 3, 1), (7, 7, 1)]
planner.plan(obstacles)
# 可视化
fig, ax = plt.subplots(figsize=(8, 8))
for edge in planner.edges:
ax.plot([edge[0][0], edge[1][0]], [edge[0][1], edge[1][1]],
'b-', alpha=0.3, linewidth=0.5)
for obs in obstacles:
circle = plt.Circle(obs[:2], obs[2], color='red', alpha=0.3)
ax.add_patch(circle)
ax.plot(1, 1, 'go', markersize=10, label='起点')
ax.plot(9, 9, 'r*', markersize=15, label='终点')
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.legend()
ax.set_title('RRT 路径规划')
plt.show()
第四章 多机协同与蜂群
4.1 多机协同的挑战
| 挑战 | 说明 | 解决方案 |
| 通信带宽 | 多机数据传输量大 | 分布式决策、局部通信 |
| 碰撞避免 | 多机空间冲突 | 速度障碍法(VO)、CBS |
| 任务分配 | 如何分配任务给各机 | 匈牙利算法、拍卖算法 |
| 编队控制 | 保持队形 | 领航-跟随、虚拟结构 |
| 一致性 | 多机状态同步 | 共识算法 |
4.2 编队控制方法
领航-跟随法(Leader-Follower):
- 指定一架无人机为领航者
- 其他跟随者保持与领航者的相对位置
- 优点:简单直观
- 缺点:领航者故障则整个编队失效
虚拟结构法(Virtual Structure):
- 定义一个虚拟的几何结构
- 每架无人机跟踪结构中的一个虚拟点
- 优点:队形保持精确
- 缺点:灵活性差
基于行为法(Behavior-Based):
- 每架无人机有多个行为(避障、编队、目标跟踪)
- 通过权重融合多个行为的输出
- 优点:灵活、分布式
- 缺点:行为冲突难以分析
4.3 ROS2 多机仿真
使用 Gazebo + PX4 + ROS2 进行多机协同仿真:
# 启动多机 PX4 SITL 仿真
cd PX4-Autopilot
./Tools/simulation/gz/sitl_multiple_run.sh -m iris -n 3
# 在 ROS2 中控制多机
ros2 run px4_ros_com offboard_control --ros-args -p namespace:=px4_1
ros2 run px4_ros_com offboard_control --ros-args -p namespace:=px4_2
ros2 run px4_ros_com offboard_control --ros-args -p namespace:=px4_3
第五章 深度学习与无人机
5.1 端到端飞行控制
概念: 用深度神经网络直接从传感器输入(图像)映射到控制输出(油门、偏航等),跳过传统的感知-规划-控制流水线。
优势:
- 不需要精确的环境模型
- 能学习人类飞行员的隐含知识
- 对复杂场景有更好的泛化能力
挑战:
- 可解释性差
- 安全性难以保证
- 需要大量训练数据
5.2 深度强化学习避障
DRL(Deep Reinforcement Learning) 在无人机避障中的应用:
- 状态空间:无人机位置、速度、深度图/激光扫描
- 动作空间:速度指令(vx, vy, vz)或姿态指令
- 奖励函数:到达目标 +100、碰撞 -100、每步 -1(鼓励快速到达)
常用算法:
- PPO(Proximal Policy Optimization):稳定、适合连续控制
- SAC(Soft Actor-Critic):样本效率高
- TD3(Twin Delayed DDPG):解决过估计问题
5.3 目标检测与跟踪
在无人机上部署轻量级目标检测模型:
| 模型 | 参数量 | FPS(Jetson Nano) | 精度(mAP) |
| YOLOv8-nano | 3.2M | 30+ | 37.3 |
| YOLOv5-s | 7.2M | 20+ | 37.4 |
| MobileNet-SSD | 5.8M | 25+ | 25.1 |
| EfficientDet-D0 | 3.9M | 15+ | 33.8 |
部署流程:
- 在 GPU 服务器上训练模型
- 使用 TensorRT 或 ONNX Runtime 优化
- 部署到无人机边缘计算平台(Jetson Nano/Xavier)
- 通过 MAVSDK 将检测结果反馈给飞控
第六章 工程实践:从仿真到实飞
6.1 完整开发流程
1. 算法设计与仿真(Python/MATLAB)
↓
2. SIL 仿真(Software-in-the-Loop)
PX4 SITL + Gazebo/JMavSim
↓
3. HIL 仿真(Hardware-in-the-Loop)
真实飞控硬件 + 仿真环境
↓
4. 系留飞行测试
无人机用绳索固定,限制飞行范围
↓
5. 自由飞行测试
开阔场地、安全网、紧急停机
↓
6. 实际任务执行
6.2 推荐开发平台
| 平台 | 用途 | 成本 |
| PX4 SITL + Gazebo | 算法仿真 | 免费 |
| NVIDIA Jetson Nano | 边缘 AI 计算 | ~1000 元 |
| Holybro X500 V2 | 科研级四旋翼 | ~5000 元 |
| DJI Manifold 2 | 机载计算 + 飞控 | ~8000 元 |
| Intel RealSense D435i | 深度相机 + IMU | ~2000 元 |
6.3 研究前沿方向
- 视觉语言模型 + 无人机:用自然语言指令控制无人机
- 神经辐射场(NeRF)+ 无人机:三维场景重建
- 大模型 + 无人机决策:LLM 用于高层任务规划
- 仿生飞行:扑翼无人机、柔性翼无人机
- 太阳能长航时:平流层无人机,续航数月
- 无人机 + 5G/6G:低延迟远程操控、空中基站
推荐学习资源
- 书籍:《Small Unmanned Aircraft: Theory and Practice》(Beard & McLain)
- 课程:ETH Zurich "Robotics: Perception"(Coursera)
- 课程:UPenn "Robotics: Aerial Robotics"(Coursera)
- 开源:PX4-Autopilot(GitHub)、ArduPilot(GitHub)
- 仿真:Gazebo、AirSim(Microsoft)、Flightmare
- 竞赛:RoboMaster、DJI RoboMaster 机甲大师赛、ICRA UAV 竞赛