无人机轨迹优化算法及其MATLAB实现:单用户与多用户通信增强 简介面向无人机(UAV)无线通信场景的轨迹优化算法解析与MATLAB实现文档以PDF格式呈现适合通信工程、无人驾驶航空器系统、机器人运动规划及优化理论领域的科研人员和高校师生。内容紧扣非凸轨迹优化难题通过对信道增益、速度限制等参数建模引入松弛变量μ[n]并采用序列凸逼近(SCA)法将原非凸问题转化为可求解的凸优化问题同时给出不同时间片T和起始位置设置下针对单个及多个用户的最佳飞行路径仿真结果。包体仅含1个PDF文件大小103KB便于下载与阅读。该文档已有163人学习。全文不仅详细记录了从原始模型到等价变换、再到SCA得到新目标函数的推导过程还配有具体MATLAB代码段并利用图表对比展示不同条件下的优化效果可帮助读者理解算法机理并复现轨迹优化实验适用于物流配送、应急响应、视频直播等链路质量优化场景。1. 无人机轨迹优化到底在优化什么做通信增强的无人机轨迹规划很多人第一反应是画一条好看的飞行路径再沿着路径算吞吐量。这个顺序其实是反的。飞行轨迹本身不是目标它是让通信质量达到最优的优化变量。所谓“无人机(UAV)轨迹优化算法及其MATLAB实现-针对单用户与多用户的通信增强”是一类数值优化问题在无人机位置、速度、通信功率等约束下通过调整无人机在每个时刻的坐标最大化用户可达速率或覆盖公平性。这类问题在MATLAB里最常见、最可靠的落地方式不是推导闭式解而是把时间轴离散成时隙把轨迹变成可迭代的位置序列再用优化工具箱做数值求解。下面从头建信道模型、写目标函数、跑通单用户场景再扩展到多用户最后给出一套能直接改参数复现的代码框架。2. 通信增强建模先给信道一个可计算的表达式2.1 为什么轨迹会影响通信速率无人机和地面用户之间如果距离近、仰角大视距(LoS)概率高路径损耗接近自由空间距离远、仰角小时非视距(NLOS)分量的额外穿透损耗会显著拉低接收信噪比。同一个无人机从高处飞到低处绕行用户速率可能差出10倍以上。通信增强里的轨迹优化本质就是利用这个特性让无人机尽量停留在“对用户有利”的空间区域。常见做法是把无人机飞行时间划分为M个时隙每个时隙内认为无人机位置固定优化变量就是这M个位置序列。这样飞行轨迹优化变成一个非线性约束优化问题可以用MATLAB的fmincon或者CVX工具求解。本文以fmincon为主因为不需要额外安装工具优化工具箱是MATLAB的基础组件。2.2 信道模型与可达速率的数学形式对单个地面用户设无人机在第n个时隙的位置为$\mathbf{q}[n](x[n], y[n], H)$用户位置为$\mathbf{w}(u,v,0)$水平距离为$$ d_{2D}[n] \sqrt{(x[n]-u)^2 (y[n]-v)^2} $$无人机高度H固定时仰角为 $\theta[n] \arctan(H / d_{2D}[n])$。LoS概率可近似为$$ P_{\mathrm{LoS}}(\theta[n]) \frac{1}{1 a \exp(-b(\theta[n]-a))} $$其中a、b是取决于环境的常数常见市区取值a9.61b0.16。平均路径损耗为LoS和NLOS的加权平均$$ L[n] P_{\mathrm{LoS}} L_{\mathrm{LoS}} (1-P_{\mathrm{LoS}}) L_{\mathrm{NLOS}} $$每条链路的损耗分别是自由空间损耗加上各自附加衰减$$ L_{\mathrm{LoS}} 20\log_{10}(4\pi f_c d / c) \eta_{\mathrm{LoS}} $$$$ L_{\mathrm{NLOS}} 20\log_{10}(4\pi f_c d / c) \eta_{\mathrm{NLOS}} $$接收信噪比(SNR)为$$ \gamma[n] \frac{P_t / L[n]}{N_0 B} $$可达速率近似为$$ R[n] B \log_2(1\gamma[n]) $$这条链路能不能成立取决于路径损耗计算是否准确。表2.1给出了一组经过多篇飞行测试论文校验的参数初始建模可以直接照用。表2.1 通信信道与无人机模型默认参数参数符号默认值说明载波频率f_c2 GHz频段影响自由空间损耗带宽B10 MHz香农公式中的带宽发射功率P_t0.1 W (20 dBm)无人机发射功率噪声功率谱密度N_0-174 dBm/Hz热噪声底无人机高度H100 m固定高度降低变量维度环境参数a, b9.61, 0.16城市环境LoS拟合系数LoS附加衰减η_LoS1 dB视距链路附加损耗NLoS附加衰减η_NLOS20 dB非视距链路附加损耗用户数量K1 / 5单用户和多用户场景2.3 MATLAB里先写好信道函数把上面的公式写成一个可复用函数后续所有优化目标都调用它。这里我给出一个基于三维位置输入的信道计算函数function [gamma, rate] uav_channel(uav_pos, user_pos, params) % uav_pos: 无人机三维坐标 [x, y, H] % user_pos: 用户三维坐标 [x, y, 0] % params: 结构体包含频率、带宽、功率等参数 d_3d norm(uav_pos - user_pos); d_2d norm(uav_pos(1:2) - user_pos(1:2)); theta atan2(params.H, d_2d); % 仰角单位弧度 p_los 1 / (1 params.a * exp(-params.b * (rad2deg(theta) - params.a))); % 自由空间损耗频率单位Hz fspl 20*log10(4*pi*params.fc*d_3d/3e8); L_los fspl params.eta_los; L_nlos fspl params.eta_nlos; L_mean p_los * (10^(L_los/10)) (1-p_los) * (10^(L_nlos/10)); % 线性域平均损耗转dB再算SNR L_mean_db 10*log10(L_mean); snr params.pt_lin / (10^(L_mean_db/10) * params.N0 * params.B); gamma snr; rate params.B * log2(1 snr); end函数输入是单个位置点输出SNR和速率。注意这里用线性域做平均损耗再转回dB计算SNR比直接对dB损耗求平均更准确。路径损耗的dB值本身不是线性可加的LoS和NLOS分量要按概率在功率域加权。参数结构体的构造在调用前完成例如params.fc 2e9; params.B 10e6; params.pt 0.1; params.pt_lin params.pt; % 线性功率单位W params.N0 10^(-174/10); % W/Hz params.H 100; params.a 9.61; params.b 0.16; params.eta_los 1; params.eta_nlos 20;后续单用户和多用户的主脚本都复用这个信道函数避免每个优化脚本里重复写路径损耗公式。3. 单用户轨迹优化让无人机追着用户飞3.1 单用户问题怎么化为标准优化形式单用户通信增强的目标是在无人机飞行全程保持高吞吐量。优化变量是所有时隙的无人机水平坐标记为$\mathbf{X} [x_1, x_2, ..., x_M]$$\mathbf{Y} [y_1, y_2, ..., y_M]$。目标函数取整个飞行过程的总速率或平均速率。为了直接套用MATLAB的fmincon变量要整理成一个一维向量$\mathbf{z} [x_1, y_1, x_2, y_2, ..., x_M, y_M]$目标函数写成所有时隙速率的负和因为fmincon默认做最小化。约束条件包括无人机水平坐标在可行区域内$x_{\min} \le x_i \le x_{\max}$同理对$y$相邻时隙最大距离受飞行速度限制$| [x_{i1}, y_{i1}] - [x_i, y_i] | \le v_{\max} \cdot \Delta_t$fmincon支持不等式约束速度约束写成非线性约束函数返回给solver。假设领域是500m × 500m用户位于中心点(250, 250)。如果无人机初始位置在用户斜上方优化器应当把位置推到用户正上方。真实环境中无人机不能无限贴近用户可以在目标函数里加一个最小水平距离惩罚或者直接在指示约束里限定。3.2 用fmincon求解单用户轨迹的最小代码下面是一个完整可运行的MATLAB脚本。脚本把轨迹分为20个时隙每个时隙间隔1秒最大飞行速度10 m/s。% single_user_trajectory.m % 单用户通信增强轨迹优化fmincon求解 clear; clc; rng(0); % 系统参数 params.fc 2e9; params.B 10e6; params.pt_lin 0.1; params.N0 10^(-174/10); params.H 100; params.a 9.61; params.b 0.16; params.eta_los 1; params.eta_nlos 20; M 20; % 时隙数 dt 1; % 时隙间隔秒 vmax 10; % 最大飞行速度 m/s user_pos [250, 250, 0]; % 初始轨迹从(100,100)到(400,400)的直线 x0 linspace(100, 400, M); y0 linspace(100, 400, M); z0 reshape([x0; y0], [], 1); % 转成 [x1;y1;x2;y2;...] % 变量边界500x500区域 lb_x 0 * ones(M,1); ub_x 500 * ones(M,1); lb reshape([lb_x; lb_x], [], 1); ub reshape([ub_x; ub_x], [], 1); % 非线性约束速度限制 function [c, ceq] speed_constraint(z, M, vmax, dt) x z(1:2:end); y z(2:2:end); ceq []; c zeros(M-1, 1); for i 1:M-1 dist sqrt((x(i1)-x(i))^2 (y(i1)-y(i))^2); c(i) dist - vmax * dt; end end % 目标函数负总速率 function f neg_total_rate(z, M, user_pos, params) f 0; for i 1:M uav_pos [z(2*i-1), z(2*i), params.H]; [~, rate] uav_channel(uav_pos, user_pos, params); f f - rate; end end % 调用fmincon options optimoptions(fmincon, ... Algorithm, interior-point, ... Display, iter, ... MaxIterations, 200, ... OptimalityTolerance, 1e-6); obj_fun (z) neg_total_rate(z, M, user_pos, params); cons_fun (z) speed_constraint(z, M, vmax, dt); [z_opt, fval] fmincon(obj_fun, z0, [], [], [], [], lb, ub, cons_fun, options); % 输出结果 x_opt z_opt(1:2:end); y_opt z_opt(2:2:end); total_rate -fval; fprintf(优化后总速率: %.2f Mbps\n, total_rate/1e6); figure; plot(x_opt, y_opt, b-o, LineWidth, 1.5); hold on; plot(user_pos(1), user_pos(2), r^, MarkerSize, 12, DisplayName, 用户); legend(优化轨迹, 用户); xlabel(X (m)); ylabel(Y (m)); grid on;代码里有三个关键点。第一目标函数对每个时隙调用一次信道函数累计负速率。负号是因为fmincon默认最小化最小化负速率等价于最大化速率。第二速度约束只约束相邻时隙之间的水平位移无人机高度固定所以不需要三维速度拆解。第三变量z被设计成交错排列[x1;y1;x2;y2;...]在目标函数内部通过z(2i-1)和z(2i)取位置边界约束也按同样顺序构造。3.3 单用户仿真的结果解读运行这段代码初始直线轨迹从(100,100)出发到(400,400)结束水平距离用户点约212m。优化结束后fmincon会把轨迹主动推向用户头顶附近。由于速度约束为每秒10m整个过程20秒最多飞200m所以轨迹不会瞬间跳到用户正上方而是围绕用户形成一个近似圆形的盘旋路径。总速率取决于路径损耗和SNR典型结果在几十Mbps量级。如果发现优化轨迹没有推向用户先检查速度约束是否生效。把speed_constraint里的返回值暂时全部置0再跑一次如果轨迹还是直线问题在目标函数或信道函数。常见的坑是dB和线性域混淆。比如把发射功率按dBm代入线性计算会导致SNR偏差极大。单用户场景的价值在于验证信道函数和fmincon配置是否正确。这一套代码跑通了多用户只是把目标函数从“单用户速率”换成“多用户公平性指标”约束数也会增加。4. 多用户场景从总速率最大化到公平性优化4.1 多用户通信增强的优化目标差异单用户只要让无人机尽量靠近用户即可多用户时无人机无法同时靠近所有人。如果优化目标是所有用户总速率最大最直接的策略是飞向用户密集区域边缘用户速率可能接近零。通信增强里更常用的是最大最小公平(max-min fairness)准则最大化所有用户中的最小平均速率即$$ \max_{\mathbf{z}, t} t $$$$ \text{s.t. } R_k(\mathbf{z}) \ge t, \quad k1,2,...,K $$其中$R_k$是第k个用户在整个飞行过程中的平均速率。这个目标让无人机决策更均衡不会牺牲边缘用户。fmincon需要把辅助变量t拼进优化变量z中目标函数变成对-t最小化。原问题中R_k是位置的非线性函数约束R_k ≥ t是非线性不等式约束的典型形式。求解器在每个迭代点做数值梯度估计约束函数需要同时返回用户速率和t的差。如果直接写成约束函数形式fmincon能够处理但局部最优问题比单用户更明显初始轨迹的选择很关键。4.2 多用户问题的变量扩展和约束处理假设K个用户位置是固定的用户坐标保存在K×2矩阵user_set中。优化变量变成$\mathbf{z} [x_1, y_1, x_2, y_2, ..., x_M, y_M, t]$总共2M1个变量。t是辅助变量初始值设为0.1 Mbps量级约束为所有用户速率不小于t。约束函数分两部分速度约束和单用户相同的非线性约束以及速率公平性约束。速率公平性约束需要调用信道函数对所有用户计算速率然后返回rate_k - t的非正值。注意fmincon约束约定为c(x) 0所以代码里写成c(i) t - rate_k。下面给出约束函数的完整代码function [c, ceq] multi_user_constraints(z, M, user_set, params, vmax, dt) ceq []; K size(user_set, 1); x z(1:2:2*M); y z(2:2:2*M); t z(end); % 速度约束 c_speed zeros(M-1, 1); for i 1:M-1 dist sqrt((x(i1)-x(i))^2 (y(i1)-y(i))^2); c_speed(i) dist - vmax * dt; end % 公平性约束每个用户的平均速率都不小于t c_fair zeros(K, 1); for k 1:K sum_rate 0; for i 1:M uav_pos [x(i), y(i), params.H]; user_pos [user_set(k,1), user_set(k,2), 0]; [~, rate] uav_channel(uav_pos, user_pos, params); sum_rate sum_rate rate; end avg_rate sum_rate / M; c_fair(k) t - avg_rate; end c [c_speed; c_fair]; end主脚本里在调用fmincon时必须传给约束函数正确的变量维度。我习惯把t放在优化变量最后一位同时给t设置边界比如0到100 Mbps之间。目标函数也很简单function f neg_t(z) f -z(end); end4.3 多用户初始轨迹的构造技巧多用户场景下初始点选得不好fmincon很容易收敛到局部最优甚至出现轨迹远离所有用户的结果。我一般把多用户初始轨迹取为K个用户坐标的质心让无人机从质心出发做小半径环绕。如果用户分布很分散先用kmeans把它们聚成几个簇再让无人机在不同簇之间往返。这个方法不需要先验知识而且fmincon在这个初始点附近能找到相对均衡的解。表4.1给出单用户和多用户优化问题结构的对比方便调试时确认自己的变量定义没有错位。表4.1 单用户与多用户问题结构对比项目单用户多用户优化变量数量2M2M 1目标函数负总速率-tt为最小速率非线性约束数M-1(M-1) K是否需要辅助变量不需要需要t主要风险局部最优局部最优 不公平中间解常用初始轨迹直线经过用户上方用户质心附近折线多用户目标函数里不需要对每个用户加权重max-min准则已经隐式地要求高速率用户“让”一些容量给边缘用户。如果实际业务要求更偏向吞吐量可以把约束改成加权或者把目标改为带惩罚的总速率例如加上log效用函数。常见做法是对总速率对数求和这样也能逼近公平性但fmincon处理起来约束更简单。5. 参数调控、初始点搜索与常见失败排查5.1 用多起点循环避免局部最优轨迹优化是非凸问题fmincon只能保证找到局部最优解。实际测试里初始轨迹从不同方向出发最终轨迹会明显不同。为了在单次运行里拿到更高质量的解我通常把多起点策略直接做成一个后处理循环随机生成N个可行初始点逐一交给fmincon最后比较所有结果里的总速率或t值取最优。初始点生成要考虑速度约束。最简单的办法是从可行起点随机走一条折线然后通过fmincon内部的约束调整。代码如下function z0 generate_initial_trajectory(M, vmax, dt, area_size) x0 zeros(M,1); y0 zeros(M,1); x0(1) area_size * rand(); y0(1) area_size * rand(); for i 2:M dir_ang 2 * pi * rand(); step vmax * dt * (0.4 0.6*rand()); x0(i) max(0, min(area_size, x0(i-1) step*cos(dir_ang))); y0(i) max(0, min(area_size, y0(i-1) step*sin(dir_ang))); end z0 reshape([x0, y0], [], 1); end这段代码不是优化算法的一部分只是给fmincon提供不同初始猜测。每步的距离是[vmax*dt]乘以0.4到1.0之间的随机数确保初始轨迹满足速度约束降低fmincon开始阶段的不可行度。5.2 优化工具箱的关键参数调整MATLAB优化工具箱的fmincon有几个参数直接影响轨迹质量。我的默认配置如下遇到不收敛时只调其中两个参数。表5.1 fmincon关键参数及其调参方向参数默认值作用调试经验Algorithminterior-point求解算法小规模场景用sqp更快但约束处理弱MaxIterations200外层迭代上限轨迹变多时增加到500OptimalityTolerance1e-6梯度收敛阈值太小会过度迭代1e-4到1e-6够用ConstraintTolerance1e-6约束违反容忍度速度约束等存在数值误差放宽到1e-4更稳StepTolerance1e-10步长变化阈值轨迹搜索停滞时增大到1e-6实际调参时最常见的现象是优化过程在100次迭代后目标值几乎不变但还没满足收敛条件。这时优先放宽OptimalityTolerance而不是增大迭代上限。如果公平性约束一直略高于0检查比重或量纲是否差异过大。速率值通常在一千万量级(bps)而速度约束的位移值在几十米量级两者数值尺度差距大约束聚合时求导会差别很大。解决办法是对目标函数除以1e6让速率以Mbps为单位数值上更接近位移的量级。5.3 排查表从现象反推问题在哪里现象可能原因排查步骤轨迹完全不动目标函数梯度接近0或初始点在局部极值把初始点放到用户正上方看单用户优化是否正确总速率为负或NaN信道函数返回值非有限值检查路径损耗是否出现负dBSNR是否溢出速度约束一直违反时隙数太多导致单时隙位移很小减少M或增大dt确认速度约束范围多用户公平性约束全部活跃但t很小初始t太大导致约束不可行把t初始值设为1 Mbps量级不要超过用户速率上限轨迹锯齿状严重多个局部最优交替试试在目标函数里加轨迹平滑惩罚项比如相邻点差平方和锯齿状轨迹在实际飞行中不可用fmincon不会天然产生平滑轨迹。常见做法是在目标函数里加上正则项例如对所有相邻时隙距离平方加一个很小的系数λ在不显著改变通信速率的前提下让轨迹更平滑。λ取值从0.01开始试太大轨迹会退化成直线。这类正则化不影响“轨迹优化”问题本质只是给数值解加上物理可行性约束。6. 鲁棒性验证与轨迹后处理技巧轨迹优化做完后不能只看一次仿真的总速率还要验证算法在不同用户分布下是否稳定。最简单的鲁棒性测试是随机生成多组用户位置循环调用同一套优化流程统计最小速率的分布情况。下面这段代码演示了5个随机用户场景下的批量验证trial_results zeros(20, 1); for trial 1:20 user_set 500 * rand(5, 2); % 随机生成5个用户 z0 generate_initial_trajectory(M, vmax, dt, 500); z0(end1) 1e6; % t初始值 [z_opt, fval] fmincon(obj_fun_multi, z0, [], [], [], [], lb, ub, cons_fun_multi, options); trial_results(trial) -fval; end histogram(trial_results / 1e6, 10); xlabel(最小用户速率 (Mbps)); ylabel(试验次数);如果分布图显示部分场景最小速率骤降说明这些用户分布的初始轨迹选择不佳。这时不要急着调算法先用更密集的多起点搜索看能否在特定用户分布下找到更优值。多用户在极端分散布局下任何单一无人机轨迹都难以保证所有用户高吞吐量这是问题本身的可扩展性限制。轨迹后处理方面优化结果是一组离散坐标点。直接给飞控系统会频繁加减速。我一般先用smoothdata对x和y序列做移动平均平滑再做速度、加速度校验把不满足物理约束的点丢弃或对齐到安全轨迹。日期和时隙步长在验证时不一定要与真实飞行一致但平滑后的轨迹必须重新计算通信速率不能只看平滑前的结果。如果平滑后速率下降超过5%说明轨迹为了可飞性牺牲了通信性能可以适当加大λ权重重新优化。最后留一个调试习惯每轮优化后保存z_opt、目标值和约束违反量方便复现问题。MATLAB的fmincon在输出参数里给出了constrviolation字段调试时打印出来比只盯目标值更能定位数值问题。本文还有配套的精品资源点击获取