开头先交代一个背景:这个项目的核心,是在已有地面蜂窝网络的基础上,引入无人机作为空中基站,通过动态调整无人机位置来提升整体的用户服务体验。很多人一听到“无人机辅助覆盖”就以为只是把基站挂到天上,真正动手用MATLAB仿真时才发现,难点根本不在于代码本身,而在于“19个六边形蜂窝网络怎么建”“信干噪比怎么算”“无人机到底该往哪飞”这三件事。这篇文章我按自己的仿真习惯,把从拓扑建模、信道模型、指标计算到优化算法落地的完整过程拆开讲一遍,把我调试过程中踩过的坑也一并写进去。
如果你正在做无人机应急通信、蜂窝覆盖增强、空天地一体化相关的仿真,或者准备拿这类题目做课程设计、毕业设计,这篇内容应该能帮你省下至少两个星期的试错时间。
1. 整体设计与部署场景拆解
1.1 为什么偏要用19个六边形蜂窝
蜂窝网络仿真里最常见的拓扑是七小区、十九小区、三十七小区。七小区就是中心一个六边形加周围一圈六个六边形,只覆盖到第一层邻区;十九小区则是在七小区基础上再往外扩一圈,中心1个加第一层6个再加第二层12个。
选19个小区而不是7个,有一个很实际的原因:如果只用7个小区,边缘用户的干扰来源只有第一层基站,第二层干扰完全没有体现,这时候算出来的信干噪比会偏乐观,尤其是要研究无人机部署对边缘用户影响的时候,结果会失真。19个小区能保证中心小区任意一个边缘位置至少被两层干扰源包围,更接近真实运营网络的情况。
另外从计算量上看,19个小区对MATLAB来说非常轻量,跑一次完整优化通常只要几十秒到几分钟,完全够用来验证算法思路。如果直接上37甚至57个小区,粒子群这类优化算法的迭代时间会翻好几倍,对学习和调参并不划算。
1.2 空中基站的定位是“补位”,不是“替换”
无人机空中基站和地面基站不是替代关系,而是补充关系。地面基站覆盖能力有限,用户密集区域会拥塞,偏远区域或应急场景又会存在覆盖空洞。无人机的好处在于可以灵活飞到发生拥塞或者覆盖不足的区域上空,快速形成一个临时的、高度可调的基站。
但空中基站不是万能的。首先,空对地信道比地面信道复杂,视距和非视距传输概率随仰角变化;其次,无人机续航有限,位置不能随意大幅移动;最后,无人机跟地面用户之间的链路虽然可能很近,但它也会对邻近小区用户产生额外干扰。仿真里如果不把这些因素考虑进去,优化出来的结果会非常“理想化”。
我在建模仿真时习惯把无人机当作“可移动的额外小区基站”来对待:它有独立的发射功率、独立的高度、独立的小区ID,用户端比较接收信号强度决定接入哪个节点,而不是单纯让无人机只服务地面基站服务不到的用户。这种建模方式更贴近实际,也更容易暴露出干扰问题。
1.3 “动态优化”到底在优化什么
标题里的“动态优化”落到具体数学问题上,就是不断调整无人机的位置参数,让某个网络性能指标最大化。仿真里通常优化的变量是无人机水平坐标(x,y)和悬停高度h,目标函数可以是全网平均信干噪比、系统吞吐量、满足信干噪比门限的用户数,或者几个指标的组合。
举个例子:用户密集区域一开始只有地面基站覆盖,边缘用户信干噪比只有2dB,吞吐量很低。无人机飞过去之后,由于它离这部分用户更近,接收信号功率提升,信干噪比可能到10dB以上,这些用户的速率就有明显改善。但与此同时,无人机发射的信号也可能干扰到邻近小区的用户,如果位置没调好,就会出现某一片用户变好、另一片用户变差的局面。动态优化的本质就是在这个“增益”和“干扰”之间找平衡点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心指标与系统模型
2.1 信干噪比SINR,通信仿真的“体温计”
信干噪比(SINR)是通信系统性能最核心的指标之一,定义为:
SINR = 目标信号功率 / (干扰功率 + 噪声功率)
其中目标信号功率是用户接入的那个基站或无人机贡献的;干扰功率是其他所有基站和无人机在这个用户接收端造成的干扰总和;噪声功率是加性高斯白噪声,取决于系统带宽和噪声系数。
有人会问,为什么不直接用接收信号强度RSRP呢?因为RSRP只能反映“信号强不强”,不能反映“信号干不干净”。无人机介入后,干扰结构会大变,只看RSRP可能得出完全错误的部署结论。我习惯在所有优化目标之前先做一次整体SINR分布分析,看均值、看5%分位点(也就是边缘用户水平),再看高于某门限的用户比例。这样三个数一摆,网络状态基本就清楚了。
2.2 吞吐量与“用户提升”到底怎么衡量
吞吐量在简化系统级仿真里通常用香农公式近似:每个用户吞吐量 = 带宽 × log2(1 + SINR)。如果考虑资源块分配,还可以给不同用户分配不同带宽,比如等带宽分配或者按比例公平调度。这里为了突出无人机部署的作用,我一般先采用等带宽分配,后续要扩展再上调度算法。
标题里提到的“用户提升”,在代码里体现为两个可量化的指标:一是满足最低信干噪比门限的用户数量,二是系统总吞吐量。无人机部署之后,如果被服务的用户数变多了、总吞吐量也涨了,说明部署方案有效;如果只涨了吞吐量但用户数没变甚至下降,很可能是无人机只顾着服务低端用户,把边缘用户彻底忽略了,这就要调整优化目标。
2.3 空对地信道模型:LoS概率与额外损耗
空对地信道和地面信道最大的差异在于视距(LoS)概率。无人机飞得越高,用户仰角越大,视距传输的概率就越高。工程仿真里常用一个简化模型:
P_LoS = 1 / (1 + a × exp(-b × (θ - a)))
其中θ是用户到无人机的仰角,a和b是环境相关的常数。比如城市环境下a≈9.61,b≈0.28,郊区则更宽松。仰角超过36.5度左右时,视距概率能超过50%,这也是为什么无人机高度太低时覆盖能力很差,容易被建筑物遮挡。
路径损耗方面,视距链路和非视距链路分别计算:
L_LoS = 20×log10(4πfd/c) + η_LoS
L_NLoS = 20×log10(4πfd/c) + η_NLoS
其中η_LoS和η_NLoS是环境附加损耗,城市环境的η_NLoS通常比η_LoS高出20dB左右。也就是说,如果无人机高度不够,导致大量用户处于非视距状态,信号功率会被额外削掉一大截,这时候就算飞得再近也没用。所以无人机高度h是个非常关键又容易被人忽略的参数。
为了清楚对比两类链路参数,我做仿真时用的默认值如下:
| 参数 | 取值 | 说明 |
|---|---|---|
| 系统带宽 | 10 MHz | 单层网络可用带宽 |
| 载波频率 | 2 GHz | 通用蜂窝频段 |
| 地面基站发射功率 | 43 dBm | 约20W |
| 无人机发射功率 | 33 dBm | 约2W,干扰可控 |
| 地面基站噪声系数 | 7 dB | 接收机等效噪声 |
| 小区半径 | 500 m | 六边形外接圆半径 |
| 环境参数 a/b | 9.61/0.28 | 城市环境 |
| LoS/NLoS附加损耗 | 1/20 dB | 经验取值 |
取值不需要完全照抄,但量级要保持一致。尤其是发射功率的单位,必须在dBm和W之间反复确认,否则算SINR时动不动就出现几十dB的偏差。
3. MATLAB仿真实现与关键步骤
3.1 先画蜂窝、撒用户、算出地面基准性能
拿到项目别急着写优化算法,先把最基础的拓扑和基准场景做出来。19个六边形蜂窝的选址是有规律的:第一层6个小区中心到原点距离是√3R,角度间隔60度;第二层12个小区中心到原点距离是2√3R,对应角度按30度偏置分布。
MATLAB里生成小区中心坐标的核心代码段是这样:
matlab复制R_cell = 500; % 六边形外接圆半径
num_sites = 19;
site_pos = zeros(num_sites, 2);
site_pos(1, :) = [0, 0]; % 中心小区
idx = 2;
sqrt3R = sqrt(3) * R_cell;
for tier = 1:2
for k = 0:5
angle = (pi/6) * (2*tier-1) + k * pi/3;
if tier == 1
site_pos(idx, :) = sqrt3R * [cos(angle), sin(angle)];
elseif tier == 2
site_pos(idx, :) = 2 * sqrt3R * [cos(angle), sin(angle)];
if k < 6
angle2 = angle + pi/6;
site_pos(idx, :) = 2 * sqrt3R * [cos(angle2), sin(angle2)];
end
end
idx = idx + 1;
end
end
注意第二层12个小区的角度不能简单套用第一层公式,需要加入30度偏置,否则会出现两个小区中心重叠的情况。写完坐标以后,把小区边界画出来检查一遍,确认没有重叠错位,再进行下一步。
3.2 用户撒点与接入规则
用户分布不是越随机越好。为了验证无人机部署的价值,我通常撒两类用户:均匀分布用户和热点簇用户。均匀分布模拟正常业务场景,热点簇模拟演唱会、事故现场等突发话务场景,热点区域用户密度是普通区域的3到5倍。
用户到基站的接收功率按路径损耗和阴影衰落计算。接收功率(dBm) = 发射功率(dBm) - 路径损耗(dB) + 阴影衰落(dB)。用户接入采用最大RSRP准则,即遍历所有地面基站和无人机,选出接收功率最大的那个节点作为服务节点。
这一步实现的逻辑虽然简单,但很容易写错一个地方:用户的接收功率没有转换成线性值就直接参与比较了。在dB域比较大小没问题,但如果后面要算SINR、吞吐量,功率必须转回线性单位。而且算SINR时噪声功率也要用线性值,否则分子分母单位不一致,结果会非常离谱。
3.3 动态部署优化:粒子群算法的落地思路
动态优化算法我首选粒子群(PSO),原因很简单:无人机位置优化是连续变量优化,粒子群实现简单、收敛快,还不要求目标函数可导。每个粒子代表一组无人机坐标候选解,比如一架无人机就是x、y、h三个值,两架就是六个值。
粒子群主循环的核心框架:
matlab复制% 初始化粒子群
n_particles = 30;
n_dim = 3; % x, y, h
particles = rand(n_particles, n_dim) .* [2*R_max, 2*R_max, h_max];
velocity = zeros(n_particles, n_dim);
pbest = particles;
gbest = particles(1, :);
for iter = 1:max_iter
for i = 1:n_particles
fitness(i) = compute_fitness(particles(i, :), site_pos, users, params);
end
for i = 1:n_particles
if fitness(i) < fitness_best(i)
pbest(i, :) = particles(i, :);
end
end
[best_val, best_idx] = min(fitness);
if best_val < fitness_best_global
gbest = particles(best_idx, :);
end
% 更新速度与位置
w = 0.729; c1 = 1.49; c2 = 1.49; % 常用参数
velocity = w * velocity + c1*rand(size(velocity)).*(pbest - particles) ...
+ c2*rand(size(velocity)).*(gbest - particles);
particles = particles + velocity;
% 边界约束处理
particles = min(max(particles, lb), ub);
end
注意这里默认了优化目标是找最小值,所以适应度函数写成了正指标取负或者倒数。如果你的代码习惯是找最大值,把符号换过来即可。粒子群参数w为惯性权重,c1、c2是自我认知和社会认知系数,实际调试时一般从0.7~1.5范围开始试。
3.4 适应度函数怎么设计才能反映真实诉求
适应度函数是整个优化过程里最考验工程判断的部分。如果只优化全网平均SINR,粒子群会很自然地让无人机扎堆到用户密集区域,边缘用户性能进一步恶化;如果只优化用户数,可能会导致网络覆盖半径缩小,总吞吐量上不去。我通常把适应度设计成三部分加权组合:
适应度 = w1 × (1 - 边缘用户SINR提升率) + w2 × (1 - 平均吞吐量提升率) + w3 × (未达标用户占比)
权重根据项目侧重点调整。比如应急通信更看重覆盖用户数,w3就设大一点;普通容量增强则w2为主。这样做有一个额外的好处:多个指标同时变化时能平滑掉单一指标的偶然波动,优化结果更稳。
3.5 导出结果与可视化
仿真跑完之后,输出三张图基本就能把结论讲清楚:第一张是19个小区拓扑图上叠加无人机位置和用户接入连线,直观看到哪些用户由无人机服务;第二张是优化前和优化后的SINR累积分布函数(CDF)曲线对比,横轴是SINR值,纵轴是低于该值的用户比例;第三张是算法迭代曲线,看每代最优适应度是否收敛。
CDF对比图能说明很多问题。如果优化后的CDF曲线整体右移,说明全网性能都在提升;如果曲线在低端部分和优化前交叉,说明存在“部分用户被牺牲”的情况,这时需要检查权重设置。这比光报一个均值数靠谱得多。
4. 典型结果与优化策略分析
4.1 均匀分布用户场景:无人机怎么飞
先说最简单的均匀用户场景。19个小区里均匀撒300个用户,初始只有地面基站,边缘用户平均SINR在0到5dB之间。加入一架无人机并跑完优化,常见结果是:无人机最终位置落在中心小区偏边缘的地方,而不是几何中心。
原因是中心小区核心区域本来就有地面基站覆盖,信噪比不错,真正拖后腿的是中心与邻区交界的用户。无人机停在这个交界区,既能给原本弱覆盖的用户提供强信号,又能在干扰控制范围内避免影响太远的小区。如果你发现优化结果让无人机悬在最中心,大概率是适应度函数里平均SINR权重太高,边缘用户没有得到体现。
4.2 热点场景:无人机向热点区域移动的规律
热点场景更有意思。300个用户里,有120个集中在半径100米的圆形区域。初始阶段这个区域虽然离某个地面基站不远,但由于用户密集,带宽被大量瓜分,每个用户的吞吐量都很低。粒子群优化后无人机大概率会直接飞到热点区域正上方。
但这里有个细节:无人机不是飞到热点中心就完事了,它会略微偏向热点边缘靠近外界用户的一侧。原因是热点中心用户距离近,信号本来不差,真正的问题是同带宽用户太多;略微偏移后,无人机一方面覆盖热点主体,一方面还能兼顾一部分外围零散用户,整体吞吐量反而更高。
4.3 无人机高度对性能的敏感性
无人机高度是三个优化变量里最容易被粗暴处理的一个。很多人直接固定成100米不参与优化,这会丢失很多性能增益。我做过一组对照实验:把高度固定为50、75、100、125米,每档跑一次粒子群优化水平坐标,记录全网平均SINR,得到的曲线并不是单调递增或递减。
高度太低,用户仰角小,LoS概率低,路径损耗巨大,信号质量差;高度太高,无人机能“看”到更多远距离用户,干扰范围也随之扩大。我在城市环境下的实验里,最优高度大致在70到90米之间,这个值在郊区会更高,在密集城区会更低。建议仿真时把高度纳入优化变量范围,而不是拍脑袋定一个值。
4.4 多无人机协同部署的注意事项
两架以上无人机的协同部署,难度是直线上升的。难点在于两个无人机之间既要避免互相干扰,又要避免覆盖区域重复浪费资源。粒子群的维度会从3维变成6维、9维,搜索空间增大后很容易收敛到局部最优。
我的经验是引入一个“最小水平距离约束”,即任意两架无人机的水平距离不能小于某个门限,比如1.5R_cell,防止它们挤在一起做无用功。同时建议把无人机数量逐步增加着试:先一架,看性能提升;再加一架,看提升幅度是否值得。如果第二架无人机带来的吞吐量提升不足5%,那说明当前用户规模下没有必要增加无人机数量。
5. 常见问题与排查技巧实录
5.1 为什么两次运行优化结果完全不一样
这个问题十有八九是随机种子没有固定。MATLAB里涉及随机撒用户、随机初始化粒子群,每次运行都会生成不同的随机数,结果自然对不上。在代码开头加一行:
matlab复制rng(2024); % 固定随机种子
这样用户位置、粒子初始位置都是可复现的。要注意的是,固定种子只对后续所有随机操作生效,所以必须放在所有随机调用之前,否则依然不可复现。
5.2 SINR计算出现NaN或Inf
NaN和Inf是仿真代码里最常见的问题。出现NaN,先查除法分母是否为零;出现Inf,先查有没有在log里放入了负数或零。具体到SINR计算,我用过一个很蠢但效果很好的排查方法:把用户坐标、基站坐标、距离、接收功率、噪声功率逐个打印出来,拿计算器手算一个用户,很快就能定位问题出在哪个环节。
另一个容易踩的点是功率单位混用。发射功率用dBm,噪声功率用W,算SINR时分子是线性的、分母也是线性的,结果单位就对不上。我在代码里会统一规则:所有功率在进入公式之前先转成线性瓦特,所有路径损耗以倍数为单位参与运算,dBm只在输入参数和输出结果中出现。
5.3 粒子群优化结果不如固定位置
如果动态部署优化的结果比固定位置还差,最常见的原因是适应度函数和部署目标不一致,其次是粒子群提前收敛到了局部最优。处理办法是把粒子数提高到50以上,或者对全局最优位置加一点随机扰动再继续搜索。
还有一个很隐蔽的问题:接入规则没有随无人机位置更新而更新。无人机每移动一步,用户的服务节点都可能发生变化,但有些代码会把接入结果在优化前计算一次,之后固定不变。这样一来无人机无论怎么移动,用户始终连接旧节点,优化算法自然无效。我在每次迭代里都会重新算一遍接入关系,虽然多了些计算量,但结果是对的方向是对的。
5.4 加了无人机之后边缘用户反而更差
这种情况在仿真里很常见,真实网络里更常见。原因是无人机信号的“抢用户”效应:原本属于相邻小区的一个边缘用户,可能因为无人机离它更近而被吸引过来接入无人机。如果无人机回传链路带宽有限,或者无人机所在位置的资源分配没有保证,这个用户虽然信干噪比提升了,但实际吞吐量可能下降。仿真里表现为平均SINR上升、边缘用户占比下降。
要解决这个问题,除了调整优化权重之外,还可以给每个用户接入增加一个“偏置阈值”:只有无人机信号比原服务基站信号高出至少3dB才允许切换。这在工程上叫小区偏置,能有效减少无人机对边缘用户的干扰影响。
5.5 常见问题速查表
| 现象 | 可能原因 | 快速处理 |
|---|---|---|
| 结果无法复现 | 未固定随机种子 | 代码开头加 rng(2024) |
| SINR出现NaN | 距离为零或除数为零 | 检查无人机与用户是否重叠,加最小距离保护 |
| SINR出现Inf | 单位混用或log传负数 | 统一转线性功率,检查路径损耗计算 |
| 优化不收敛 | 惯性权重过大或粒子数太少 | 粒子数调到50以上,w从0.729开始调 |
| 加了无人机性能下降 | 接入规则未随迭代更新 | 每次迭代里重新计算接入关系 |
| 两架无人机重叠 | 缺少最小距离约束 | 添加约束:水平距离大于1.5R |
最后再分享一个小技巧,做MATLAB仿真时不要把指标计算和优化算法全部揉在一个脚本里。我一般拆成三个文件:拓扑生成函数、信道与指标计算函数、主优化脚本。这样每次调参数只需要改动明确的地方,排查问题也快得多。无人机空中基站这个方向,本质上是把传统蜂窝网络的静态覆盖问题变成动态优化问题,一旦把基础仿真链路跑通,后面扩展多频段、多无人机协同、波束赋形、资源调度都只是在这个框架上做加法。
