1. 建立飞行器轨迹优化的基本工作流

建立飞行器轨迹优化的基本工作流 学习卡片

任务定义

本案例将构建一个完整的飞行器轨迹优化最小工作流:给定飞行器从起点到终点的水平位移、飞行时间与初始/终端速度约束,以最小化能量消耗为目标,使用三次多项式参数化垂直轨迹,并通过SciPy的minimize求解最优参数,最终绘制优化前后的轨迹对比图。

问题建模

设飞行器在水平方向匀速运动,水平速度 Vx = 100 m/s,总飞行时间 T = 10 s,水平位移 L = 1000 m。垂直方向位移 y(t) 用三次多项式表示:

y(t) = a0 + a1·t + a2·t² + a3·t³

边界约束:起点高度 y(0)=0,终点高度 y(T)=0,起点垂直速度 y'(0)=0,终点垂直速度 y'(T)=0。由这四个约束可唯一消去 a0, a1, a2, a3,仅剩一个自由参数 a3(实际为中间点抬升高度)。优化目标为最小化垂直方向加速度平方的积分(表征能量消耗):

J = ∫₀ᵀ [y''(t)]² dt

通过解析推导,y''(t) = 6·a3·t + 2·a2,代入边界条件后目标函数可化为关于 a3 的二次函数,最优解存在解析值。但为演示通用优化工作流,我们仍使用SciPy数值求解。

代码实现

import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt

# 飞行参数
Vx = 100.0      # 水平速度 m/s
T = 10.0        # 飞行时间 s
L = Vx * T      # 水平位移 m

# 边界条件: y(0)=0, y(T)=0, y'(0)=0, y'(T)=0
# 三次多项式 y(t)=a0+a1*t+a2*t^2+a3*t^3
# 由边界条件消去 a0,a1,a2,仅剩自由参数 a3
def compute_coeffs(a3):
    """根据自由参数 a3 计算多项式系数 [a0,a1,a2,a3]"""
    a2 = -1.5 * a3 * T          # 由 y'(T)=0 推出
    a1 = 0.0                    # 由 y'(0)=0
    a0 = -a2 * T**2 - a3 * T**3 # 由 y(T)=0
    return np.array([a0, a1, a2, a3])

def y_t(t, coeffs):
    """计算多项式在 t 处的值"""
    return coeffs[0] + coeffs[1]*t + coeffs[2]*t**2 + coeffs[3]*t**3

def y2_t(t, coeffs):
    """计算二阶导数 y''(t)"""
    return 2*coeffs[2] + 6*coeffs[3]*t

# 目标函数: 加速度平方的积分 (能量消耗)
def objective(a3):
    coeffs = compute_coeffs(a3[0])
    # 使用高斯-勒让德数值积分 (5点)
    t_pts, w_pts = np.polynomial.legendre.leggauss(5)
    # 映射到 [0, T]
    t_map = 0.5*T*(t_pts + 1)
    w_map = 0.5*T*w_pts
    accel = np.array([y2_t(t, coeffs) for t in t_map])
    return np.sum(w_map * accel**2)

# 初始猜测
x0 = np.array([1.0])

# 求解
res = minimize(objective, x0, method='BFGS')
a3_opt = res.x[0]
coeffs_opt = compute_coeffs(a3_opt)

# 输出结果
print(f"优化成功: {res.success}")
print(f"最优 a3 = {a3_opt:.6f}")
print(f"多项式系数 [a0,a1,a2,a3] = {np.round(coeffs_opt, 4)}")
print(f"最小能量指标 J = {objective(res.x):.6f}")

# 解析解验证 (由 dJ/da3=0 推出)
a3_analytic = 0.0  # 实际解析解为0 (直线轨迹)
print(f"解析最优 a3 = {a3_analytic} (直线飞行)")

# 可视化
t_dense = np.linspace(0, T, 100)
y_opt = [y_t(t, coeffs_opt) for t in t_dense]
# 对比: 未优化的初始猜测 (a3=1.0)
coeffs_init = compute_coeffs(1.0)
y_init = [y_t(t, coeffs_init) for t in t_dense]

plt.figure(figsize=(8, 4))
plt.plot(t_dense, y_init, '--', label='初始猜测 (a3=1.0)', alpha=0.7)
plt.plot(t_dense, y_opt, '-', linewidth=2, label='优化轨迹 (a3=0)')
plt.xlabel('时间 t (s)')
plt.ylabel('垂直位移 y (m)')
plt.title('飞行器垂直轨迹优化结果')
plt.legend()
plt.grid(True, alpha=0.3)
plt.savefig('trajectory_opt.png', dpi=100)
print("轨迹图已保存为 trajectory_opt.png")

运行与验证

依赖安装:需要 numpy, scipy, matplotlib。执行 pip install numpy scipy matplotlib 即可。

运行方式:将上述代码保存为 trajectory_opt.py,在终端执行 python trajectory_opt.py。

预期输出:程序应打印优化成功标志、最优 a3≈0.0(直线轨迹),并生成 trajectory_opt.png 图像。图像中优化轨迹为一条从 (0,0) 到 (10,0) 的水平直线,而初始猜测为弯曲曲线。

判定标准:观察终端输出中 res.success 为 True,且 a3_opt 接近 0(误差小于 1e-4)。图像文件成功生成且优化轨迹为直线,即表示工作流闭环验证通过。

飞行器轨迹优化工作流验证流程 1. 问题定义 边界条件 y(0)=y(T)=0 y'(0)=y'(T)=0 2. 轨迹参数化 三次多项式 y(t) 消元后剩自由参数 a3 3. SciPy 求解 minimize(objective) BFGS 方法迭代 4. 验证与可视化 检查 a3≈0 绘制轨迹图 关键数据流 输入: Vx=100 m/s, T=10 s, L=1000 m 约束: 边界条件 → 消元 → 自由参数 a3 目标: J = ∫₀ᵀ [y''(t)]² dt → 最小化 输出: 最优 a3≈0 (直线轨迹), 能量指标 J≈0, 轨迹图 PNG

结果分析

优化结果表明,在给定边界条件下,最小能量轨迹为直线飞行(a3=0),此时垂直加速度恒为零,能量消耗为零。这与物理直觉一致:无中间约束时,直线轨迹最省能量。本案例通过最小可复现实现,完整演示了“问题定义→参数化→数值求解→结果验证”的轨迹优化标准工作流,该流程可直接扩展到更复杂的约束(如障碍物规避、动力学模型)与更高阶的参数化方法。