传感器与估计

🚁 第9课:扩展卡尔曼滤波(EKF)

📚 本课目标

掌握EKF处理非线性系统的方法,理解雅可比矩阵与线性化误差。

1. 为什么需要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/∂x

2. EKF算法

预测步

x̂⁻ = 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⁻

3. 15态无人机EKF

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态

4. 雅可比矩阵计算

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

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°
EKF收敛后姿态误差<2°,零偏在线估计有效 ✅验证通过

6. EKF局限性

方法原理优势代价
UKF无迹变换无需雅可比,三阶精度计算稍大
IEKF迭代更新减小线性化误差多次迭代
粒子滤波蒙特卡洛任意非高斯计算量大

7. 小结

✅ 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
控制频率400Hz1kHz1kHz+
传感器融合互补滤波EKFEKF/VIO
续航时间20-30min30-45min视载荷而定

10. 深度工程实践

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
串级PIDO(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  # 协方差下降

开源飞控架构对比

特性PX4ArduPilotBetaflight
定位研究/工业工业/爱好者竞速穿越
代码量~500K行~800K行~200K行
支持的机型多旋翼/固定翼/VTOL多旋翼/固定翼/直升机/车/船多旋翼/固定翼
导航能力强(全面)强(最全面)弱(仅自稳)
实时性NuttX RTOSChibiOS/RTOSBare-metal
仿真支持SITL/Gazebo/AirSimSITL/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,27A*+RRT避障巡检系统
集群系统工程师19-24多机编队协同任务
全栈无人机工程师全部30课完整自主巡检系统

关键参考文献