多旋翼无人机在三维空间中的轨迹规划一直是个复杂问题。传统方法往往将无人机视为质点进行路径规划,忽略了旋转动力学对飞行性能的影响。这就像只考虑汽车的方向盘转角而忽略轮胎与地面的摩擦特性——虽然能规划出理论路径,但实际执行时会出现明显偏差。
我们团队在实际无人机控制项目中多次遇到这种情况:仿真中完美的轨迹,实际飞行时却出现响应延迟、轨迹偏移甚至失稳。经过反复测试发现,问题根源在于忽略了两个关键因素:
不考虑旋转动力学时,无人机运动可以简化为:
code复制m·a = R·F - m·g
其中m为质量,a为加速度,R为旋转矩阵,F为旋翼总推力,g为重力加速度。这个模型在低速平稳飞行时足够精确,但当需要快速机动时误差显著。
完整模型需增加欧拉方程描述旋转动力学:
code复制I·ω' + ω×(I·ω) = M
其中I为转动惯量矩阵,ω为角速度,M为外部力矩。这个非线性耦合方程组使得优化问题复杂度呈指数级增长。
关键发现:通过将x-z平面运动与俯仰运动解耦,可将6自由度模型简化为3自由度双旋翼模型,计算量减少70%同时保持90%以上的精度。
将轨迹规划转化为最优控制问题:
code复制min J = tf
s.t. 动力学方程约束
状态/输入约束
边界条件
采用Pontryagin极小值原理推导必要条件,得到哈密顿函数:
code复制H = λ'·f(x,u) + 1
实际求解时采用多重打靶法:
matlab复制% 打靶法核心代码示例
options = optimoptions('fmincon','Algorithm','sqp');
[x_opt, fval] = fmincon(@objective, x0, [], [], [], [], lb, ub,...
@nonlcon, options);
不同物理量纲导致数值不稳定,需进行归一化:
matlab复制% 状态变量归一化
x_norm = [px/10; vx/5; pz/10; vz/5; theta/pi];
u_norm = [uT/maxThrust; uR/maxTorque];
通过计算代价函数对参数的灵敏度,指导优化方向:
matlab复制function [J, grad] = objectiveWithGradient(x)
[J, ~] = simulateSystem(x);
h = 1e-6;
grad = zeros(size(x));
for i = 1:length(x)
x_perturbed = x;
x_perturbed(i) = x(i) + h;
J_perturbed = simulateSystem(x_perturbed);
grad(i) = (J_perturbed - J)/h;
end
end
当哈密顿函数对控制输入线性依赖时会出现奇异弧。我们的解决方案:
遇到高度约束时(如避障),采用以下策略:
| 模型类型 | 平均求解时间(s) | 迭代次数 |
|---|---|---|
| 基础平移模型 | 12.7 | 45 |
| 旋转动力学模型 | 38.2 | 112 |
| 双模型混合 | 21.5 | 68 |
在5m×5m空间内进行急转弯测试:
| 速度(m/s) | 基础模型误差(cm) | 增强模型误差(cm) |
|---|---|---|
| 2 | 15.2 | 3.7 |
| 4 | 62.8 | 8.5 |
| 6 | 碰撞 | 19.3 |
实际部署中发现,电机温度超过60°C时推力会下降约8%。我们在代价函数中添加了温度预测项:
matlab复制J = tf + 0.01*sum(uT.^2)*temp_factor;
这套方法已经成功应用于:
特别是在医疗物资运输场景中,将紧急降落时间缩短了40%,同时保证着陆冲击力小于2G。