掌握EKF处理非线性系统的方法,理解雅可比矩阵与线性化误差。
线性: x = A·x + B·u → KF直接适用
非线性: x = f(x,u) → EKF线性化
f(x) ≈ f(x̂) + F·(x-x̂) F = ∂f/∂x (雅可比)
h(x) ≈ h(x̂) + H·(x-x̂) H = ∂h/∂xx̂⁻ = f(x̂,u) P⁻ = F·P·FT+Q
K = P⁻·HT·(H·P⁻·HT+R)-1
x̂ = x̂⁻ + K·(z-h(x̂⁻)) P = (I-K·H)·P⁻
x = [pos_N, pos_E, pos_D, # 位置(3)
vel_N, vel_E, vel_D, # 速度(3)
qw, qx, qy, qz, # 四元数(4)
gyro_bx, gyro_by, gyro_bz, # 陀螺零偏(3)
accel_bx, accel_by] # 加计零偏(2) = 15态def attitude_jacobian(q, omega):
"""姿态运动学雅可比"""
w,x,y,z = q
return np.array([
[0, -omega[0], -omega[1], -omega[2]],
[omega[0], 0, omega[2], -omega[1]],
[omega[1], -omega[2], 0, omega[0]],
[omega[2], omega[1], -omega[0], 0]
]) * 0.5=== EKF姿态估计性能 ===
5-10秒平均误差: 1.57°
最大误差: 2.88°
最终估计: Roll=-16.31° Pitch=2.47° Yaw=57.79°
真实姿态: Roll=-16.51° Pitch=1.65° Yaw=57.24°
| 方法 | 原理 | 优势 | 代价 |
|---|---|---|---|
| UKF | 无迹变换 | 无需雅可比,三阶精度 | 计算稍大 |
| IEKF | 迭代更新 | 减小线性化误差 | 多次迭代 |
| 粒子滤波 | 蒙特卡洛 | 任意非高斯 | 计算量大 |
✅ EKF通过雅可比线性化处理非线性
✅ 15态EKF:位置+速度+姿态+零偏
✅ 大角度机动注意线性化误差
1. 手动推导四元数微分雅可比。2. 完整15态EKF。3. EKF vs UKF大角度精度。
掌握EKF原理与无人机姿态估计
本课涉及的核心公式和算法需要反复练习才能真正掌握。建议通过修改仿真参数、添加扰动等方式深入理解每个参数对系统行为的影响。在实际飞行中,这些参数的选择往往需要在理论分析的基础上结合实验微调。
| 指标 | 消费级 | 工业级 | 研究级 |
|---|---|---|---|
| 姿态精度 | ±2° | ±0.5° | ±0.1° |
| 位置精度(GPS) | ±2m | ±0.5m | ±2cm(RTK) |
| 悬停精度 | ±1m | ±0.3m | ±0.05m |
| 控制频率 | 400Hz | 1kHz | 1kHz+ |
| 传感器融合 | 互补滤波 | EKF | EKF/VIO |
| 续航时间 | 20-30min | 30-45min | 视载荷而定 |
EKF的雅可比矩阵推导是工程实现中最容易出错的环节。常见错误包括:坐标系混淆(惯性系vs机体系)、旋转方向反号、角速度与姿态导数的混淆。建议:(1)用数值差分验证解析雅可比的正确性;(2)单元测试每个雅可比矩阵;(3)在SITL中用已知轨迹验证EKF精度。
| 参数 | 典型值 | 影响 |
|---|---|---|
| 控制频率 | 400-1000Hz | 稳定性/延迟 |
| EKF频率 | 200-500Hz | 估计精度 |
| 导航频率 | 10-50Hz | 路径跟踪 |
| 传感器延迟 | 5-200ms | 需时间补偿 |
| 电池警戒 | 25%→RTH | 安全返航 |
在实际飞控系统中,算法必须在有限的计算资源下实时运行。以下为本课核心算法的复杂度分析:
| 算法/模块 | 时间复杂度 | 空间复杂度 | 典型耗时 |
|---|---|---|---|
| 互补滤波 | O(1) | O(1) | <1μs |
| 卡尔曼滤波(15态) | O(n²) | O(n²) | ~50μs |
| EKF(15态) | O(n³) | O(n²) | ~200μs |
| 串级PID | O(1) | O(1) | <5μs |
| A*(N节点) | O(N log N) | O(N) | 1-100ms |
| RRT(N步) | O(N·K) | O(N) | 10-500ms |
| 最小snap(M段) | O(M³) | O(M²) | ~1ms |
无人机飞控是典型的实时嵌入式系统,必须满足严格的时序约束:
# 典型飞控任务优先级(高→低)
# 1. IMU采样+姿态估计 (1kHz, 优先级最高)
# 2. 角速度PID控制 (1kHz)
# 3. 姿态PID控制 (500Hz)
# 4. EKF状态更新 (200Hz)
# 5. 位置/速度控制 (100Hz)
# 6. 路径规划/避障 (10-50Hz)
# 7. 通信/日志 (1-10Hz)
# RTOS调度: 优先级抢占 + 时间片轮转
飞控软件是安全关键系统,代码质量要求极高:
# 单元测试示例
def test_pid_output():
pid = PID(kp=1.0, ki=0, kd=0)
assert pid.update(1.0, 0.01) == 1.0 # P=1*1.0
def test_pid_integral_limit():
pid = PID(kp=0, ki=1.0, kd=0, i_limit=5.0)
for _ in range(1000):
pid.update(1.0, 0.01) # 大量积分
assert abs(pid.integral) <= 5.0 # 不超过限幅
def test_kalman_convergence():
kf = KalmanFilter(...)
for _ in range(100):
kf.predict()
kf.update(measurement)
assert kf.P[0,0] < initial_P # 协方差下降
| 特性 | PX4 | ArduPilot | Betaflight |
|---|---|---|---|
| 定位 | 研究/工业 | 工业/爱好者 | 竞速穿越 |
| 代码量 | ~500K行 | ~800K行 | ~200K行 |
| 支持的机型 | 多旋翼/固定翼/VTOL | 多旋翼/固定翼/直升机/车/船 | 多旋翼/固定翼 |
| 导航能力 | 强(全面) | 强(最全面) | 弱(仅自稳) |
| 实时性 | NuttX RTOS | ChibiOS/RTOS | Bare-metal |
| 仿真支持 | SITL/Gazebo/AirSim | SITL/Gazebo | 有限 |
| 社区活跃度 | 高 | 最高 | 高(竞速圈) |
无人机系统属于安全关键(Safety-Critical)系统,设计时必须遵循以下原则:
本课所学技术在以下场景中直接应用:
将本课模块集成到完整系统时的注意事项:
要实践本课内容,需要搭建以下开发环境:
# 1. Python环境(仿真开发)
sudo apt install python3 python3-pip
pip3 install numpy scipy matplotlib
# 2. PX4开发环境(飞控开发)
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
bash ./PX4-Autopilot/Tools/setup/ubuntu.sh
make px4_sitl jmavsim # 验证安装
# 3. ArduPilot开发环境
git clone https://github.com/ArduPilot/ardupilot.git --recursive
pip3 install pymavlink MAVProxy dronekit
# 4. 仿真环境
# Gazebo: 3D物理仿真
sudo apt install gazebo11 libgazebo11-dev
# AirSim: 高保真视觉仿真
# 从GitHub Releases下载预编译版本
# 5. 地面站
# QGroundControl: sudo ./QGroundControl.AppImage
# Mission Planner: Windows平台
根据不同的学习目标,建议以下路径:
| 目标 | 重点课程 | 实践项目 |
|---|---|---|
| 飞控算法工程师 | 1-9,25-26 | 自定义PID+姿态估计算法 |
| 导航规划工程师 | 10-18,27 | A*+RRT避障巡检系统 |
| 集群系统工程师 | 19-24 | 多机编队协同任务 |
| 全栈无人机工程师 | 全部30课 | 完整自主巡检系统 |