掌握四旋翼6自由度动力学方程,理解推力/力矩到电机转速的映射。
前(+x)
①↺ ②↻
\ /
\/ 机身
/\
/ \
④↻ ③↺
后(-x)
1,3逆时针 | 2,4顺时针惯性系(NED):X北 Y东 Z下
机体系:X前 Y右 Z下
欧拉角:φ(roll)绕X | θ(pitch)绕Y | ψ(yaw)绕Z
m·ẍ = (cosψ·cosθ)·U₁
m·ÿ = (sinψ·cosθ)·U₁
m·z̈ = mg - (cosφ·cosθ)·U₁
Ixx·φ̈ = U₂ Iyy·θ̈ = U₃ Izz·ψ̈ = U₄
U₁ = kf(ω₁²+ω₂²+ω₃²+ω₄²) # 总推力
U₂ = kf·L(-ω₁²+ω₂²+ω₃²-ω₄²) # 滚转
U₃ = kf·L(-ω₁²-ω₂²+ω₃²+ω₄²) # 俯仰
U₄ = km(-ω₁²+ω₂²-ω₃²+ω₄²) # 偏航
矩阵形式: U = M · Ω²
悬停转速: 606.5 rad/s = 5792 RPM
转速偏差50rad/s时:
滚转力矩 = 0.1516 N·m
滚转角加速度 = 10.68 rad/s²
持续1秒后滚转角: 309.0°
class Quadrotor:
def __init__(self):
self.m=1.5; self.g=9.81; self.L=0.25
self.Ixx=0.0142; self.Iyy=0.0142; self.Izz=0.0284
self.kf=1e-5; self.km=1.5e-7
def mixing_matrix(self):
kf,km,L = self.kf,self.km,self.L
return [[kf,kf,kf,kf],[-kf*L,kf*L,kf*L,-kf*L],
[-kf*L,-kf*L,kf*L,kf*L],[-km,km,-km,km]]
def dynamics(self, state, omega_sq):
x,y,z,vx,vy,vz,phi,theta,psi,p,q,r = state
U = self.mixing_matrix() @ omega_sq
# 平移 + 旋转动力学...
return derivatives✅ 6自由度运动由4个电机控制(欠驱动)
✅ 混控矩阵将虚拟控制量映射到电机转速
✅ 旋转动力学含陀螺耦合项
✅ RK4数值积分实现高精度仿真
1. 推导混控矩阵的逆矩阵。
2. 10°pitch倾斜时观察轨迹变化。
3. 一个电机失效还能稳定吗?
掌握6DOF动力学与混控矩阵
# 推力测试台实验
1. 固定电机+桨到测试台
2. 从0到最大油门采样20个点
3. 记录: PWM, RPM, 推力N, 扭矩N·m, 电流A, 电压V
4. 拟合: T = kf*ω², M = km*ω²
# 典型值(2212电机+9045桨):
kf ≈ 1.0e-5 N/(rad/s)²
km ≈ 1.5e-7 N·m/(rad/s)²
km/kf ≈ 0.015
| 参数 | 影响 | 设计原则 |
|---|---|---|
| KV值 | 转速/扭矩 | 大桨低KV, 小桨高KV |
| 桨直径 | 推力/效率 | 越大效率越高但响应慢 |
| 桨螺距 | 推力/速度 | 大螺距推力大但效率低 |
| 电调电流 | 最大电流 | ≥电机最大电流×1.2 |
本课涉及的核心公式和算法需要反复练习才能真正掌握。建议通过修改仿真参数、添加扰动等方式深入理解每个参数对系统行为的影响。在实际飞行中,这些参数的选择往往需要在理论分析的基础上结合实验微调。
| 指标 | 消费级 | 工业级 | 研究级 |
|---|---|---|---|
| 姿态精度 | ±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 | 视载荷而定 |
| 部件 | 型号 | 参数 |
|---|---|---|
| 机架 | F450 | 450mm轴距/350g |
| 电机 | 2212 920KV | 最大推力800g/个 |
| 电调 | 30A | BLHeli_S |
| 螺旋桨 | 9045 | 9寸/4.5螺距 |
| 电池 | 4S 4000mAh | 25C/370g |
| 飞控 | Pixhawk 4 | 168MHz/512KB |
| 遥控 | SBUS接收机 | 16通道 |
总重约1.5kg,悬停时间约25分钟,推重比约2.1:1
碳纤维臂在大载荷下可能弯曲5-10mm,改变有效力臂长度。高精度控制需考虑:
# 柔性臂模型(简化)
# L_eff = L_0 - k_bend * (T^2 + tau^2)^0.5
# k_bend: 弯曲刚度系数,典型值0.001-0.005 m/(N^2)
# 高载荷时臂弯曲使控制增益偏移约5-10%
# PX4 SITL环境搭建
git clone https://github.com/PX4/PX4-Autopilot.git
cd PX4-Autopilot
make px4_sitl jmavsim # 启动jMAVSim仿真
# 或使用Gazebo(更逼真)
make px4_sitl gazebo # 启动Gazebo仿真
# 连接QGroundControl
# QGC自动连接UDP 14550端口
# 微软AirSim - 基于Unreal Engine的高保真仿真
# 支持多旋翼/固定翼/汽车
# 特点: 逼真视觉/物理/天气模拟
pip install airsim
# 启动Unreal环境后连接
# 轻量级6DOF仿真(本课程使用)
# 优势: 快速验证算法,无需安装复杂环境
# 缺点: 精度有限,不含气动效应
# 适合: 控制算法开发和快速原型验证
import numpy as np
class QuadSim:
def __init__(self):
self.state = np.zeros(12) # [pos,vel,attitude,rate]
self.params = self.load_params()
def step(self, motor_cmds, dt=0.005):
# 1. 电机模型(一阶延迟)
# 2. 推力/力矩计算
# 3. 6DOF动力学
# 4. RK4积分
return self.state| 平台 | CPU | 传感器 | 价格 |
|---|---|---|---|
| Pixhawk 4 | STM32F765 | IMU×3/Baro/Mag | ¥400 |
| Pixhawk 6C | STM32H743 | IMU×3/Baro/Mag | ¥600 |
| Cube Orange | STM32H743 | IMU×3/Baro/Mag | ¥800 |
| DJI N3 | 专有 | 集成IMU/GPS | ¥1500 |
| SpeedyBee F405 | STM32F405 | IMU/Baro | ¥150 |
选择建议:研究开发选Pixhawk(开源+灵活),竞速穿越选F4/F7飞控(低延迟),商业产品选DJI(可靠性)。
在实际飞控系统中,算法必须在有限的计算资源下实时运行。以下为本课核心算法的复杂度分析:
| 算法/模块 | 时间复杂度 | 空间复杂度 | 典型耗时 |
|---|---|---|---|
| 互补滤波 | 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)系统,设计时必须遵循以下原则: