ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

19架无人机空中基站:MATLAB六边形蜂窝覆盖仿真全解析

19架无人机空中基站:MATLAB六边形蜂窝覆盖仿真全解析 如果你关注过应急通信一定听过“无人机当基站”这个说法。它的逻辑很直接地面基站被灾害毁掉或者某个大型活动现场人潮汹涌地面站点容量撑不住那就让无人机飞到天上临时撑起一片网络。最近我复盘了一个用MATLAB搭建的仿真项目核心是用19架无人飞行器作为空中基站按六边形蜂窝网络排布用来提升地面蜂窝网络的覆盖范围和可靠性。这个项目看着偏学术但拆开看每一块都能落到实际网络规划里很适合通信方向的研究生、无人机应用开发者以及对应急通信感兴趣的人拿来练手。我第一次看到这个题目时第一反应是“19个”这个数字有点眼熟。后来想明白了这对应的是经典蜂窝网络里的两圈复用结构正中心1个第一圈6个第二圈12个加起来正好19个。也就是说这不是随便摆19架无人机而是把传统地面基站里的蜂窝拓扑搬到了空中。用MATLAB把整个系统跑一遍能很直观地看到覆盖热力图、SINR分布、边缘用户性能这些关键指标。下面我按自己的理解把整个项目从原理到代码实现再到踩坑经验完整拆一遍。1. 无线覆盖遇上空中基站这个项目到底在解决什么问题1.1 地面基站网络的三个先天不足我们在城市里觉得手机信号“还可以”是因为基站密度足够高。但把视角拉到县城、山区、野外地面蜂窝网络的毛病就全出来了。第一个问题是覆盖盲区。无线信号在视距LOS条件下传播最好而地面基站天线高度有限很容易被建筑物、山体、树林遮挡。一个宏基站覆盖半径看起来有几百米到几公里但阴影区、峡谷、地下室、隧道内部信号衰减非常快。这时候哪怕你在地图上看到基站图标就在附近实际可能一格信号都没有。第二个问题是容量瓶颈。基站能同时服务的用户数是有限的而且每个用户分到的资源会互相挤占。演唱会、体育赛事、马拉松起终点这些场景的用户密度可以在几分钟内从每平方公里几百人飙升到几万人地面静态基站根本消化不了就算没掉线网速也会被拖到没法用。第三个问题是抗毁性弱。遇到极端天气或重大事故基站要是断电、传输中断、铁塔倒塌整片区域直接失联。地面应急通信车能补但受地形限制很大有些地方车进不去或者进去了没电没传输也架不起来。这三点合在一起就是空中基站存在的理由。无人机可以把“基站天线”抬到几百米高度摆脱大量地面遮挡覆盖半径立刻变大。同时它不依赖固定基础设施到达现场后几分钟就能升空组网。相比应急通信车它在山地、水域、复杂地形里更灵活。1.2 无人机空中基站能解决什么问题实际应用场景其实比想象中要广不只是应急。我梳理了几类典型需求。灾害救援和应急通信是最常见的一种。当地面通信网络瘫痪无人机基站可以先提供语音短信和低速数据传输支持救援调度。要注意的是无人机基站通常不是替代地面基站而是临时补盲和提供基本连接所以它更看重覆盖范围而不是超高速率。大型临时活动也是一个方向。在固定场馆周围运营商可以提前部署无人机基站作为临时容量层吸收集中突发的流量。这种场景下基站不需要飞太高几百米到一百米不等覆盖面积可控干扰也好管理。还有一种应用是补盲。偏远村庄、近海渔业、森林防火点这类地方长期建地面基站成本太高无人机基站可以作为机动式“按需覆盖”的解决方案。虽然做不到24小时长期服役但一天飞几个架次保证关键时段有信号已经能解决很多实际问题。但是这个项目里有个很关键的现实约束无人机是动态的电池有限飞行高度和位置会变化。如果只有1架无人机那它本质上是一个移动的“高架天线”覆盖范围有限。要想覆盖更大的区域并且保证边缘用户也能被可靠服务就需要多架无人机协同组网。19架正好形成一个相对完整的蜂窝小区集群可以用来研究多无人机之间的干扰协调、频率规划以及移动性管理。2. 19个六边形蜂窝不是随便画的拓扑与频率复用设计2.1 为什么蜂窝网络都偏爱六边形蜂窝网络用六边形不是我拍脑袋定的。无线覆盖建模里最理想的情况是用圆形覆盖整个区域但圆与圆之间一定会留下空隙或者产生重叠。工程师就想到用正多边形来逼近圆形。正三角形、正方形、正六边形都能无缝铺满平面但三者里六边形最接近圆。给定同样的小区面积六边形基站的覆盖半径最大也就是说用六边形拓扑可以用更少的基站数量实现同样的覆盖面积。反过来给定同样的覆盖半径六边形之间的重叠更合理小区边界更接近直线计算干扰时也更方便。从数学上讲正六边形还有一个重要性质中心到任意顶点的距离等于边长。这个性质让六边形网格的坐标换算变得非常规整。在MATLAB里生成19个小区中心实际上就是一串坐标变换不涉及复杂的空间填充算法。2.2 19个小区结构的由来和频率复用逻辑一个完整的蜂窝网络通常会按“簇”来划分频率资源。经典的做法是把若干相邻小区组成一个簇簇内使用全部可用频率簇间再复用。常见的簇大小有3、7、12、19等。19个小区的簇结构对应的是同频小区之间的复用距离比较远同频干扰更小所以适合用来仿真边缘用户性能和干扰受限场景。在我们这个项目里19架无人机组成的网络可以看作一个包含中心小区和两层邻居小区的局部蜂窝结构。从拓扑上看第0层是中心1个小区第1层是紧挨着中心的正六边形邻区共6个第2层是围绕第一层的第二圈邻居共12个。总数正好等于 (161219)。用这种结构做仿真好处是边界效应比单小区仿真小很多。单小区仿真只能看到孤立基站覆盖而19个小区可以模拟真实的蜂窝边缘用户可以落在某个小区边缘同时受到很多相邻基站干扰这才能算出真正的SINR分布和切换性能。2.3 无人机基站约束下的拓扑取舍很多做无人机通信的论文里会把无人机当作“移动的基站节点”理想化地让它悬停在某个位置。但在真实系统里无人机不能贴地飞也不能无限高。高度太低会被建筑物遮挡高度太高又会带来过大的路径损耗所以存在一个最优高度区间。在这个项目中19架无人机的水平位置被安排在六边形网格中心垂直方向统一设置为同一个高度 (h)。这样处理的好处是让仿真先聚焦在“水平拓扑高度”两个维度上。如果反过来把每架无人机随机悬停就很难区分到底是拓扑的影响还是无人机位置抖动的影响。小区半径 (R) 的选取也很重要。19个小区相邻中心之间的距离为 (\sqrt{3}R)。如果你想让无人机之间的安全距离足够大那么 (R) 就不能太小但 (R) 一旦变大小区边缘用户离服务基站就远路径损耗增大覆盖概率下降。所以这是一个典型的折中。在后面的仿真参数里我会给出一组参考值。3. 手把手用MATLAB搭建19个空中基站覆盖仿真3.1 仿真参数与坐标系定义先把仿真需要的参数列清楚。我习惯把所有参数集中放在一个结构体里后面改起来方便。以下是一组能跑出合理结果的参考值参数值说明载频 (f_c)2 GHz对应主流通信频段系统带宽 (BW)10 MHz每个信道带宽基站发射功率1 W30 dBm无人机挂载基站射频功率基站天线增益 (G)3 dBi全向天线简化用户天线增益0 dBi手机终端小区半径 (R)500 m六边形半径无人机高度 (h)100 m可调阴影衰落标准差8 dB对数正态阴影噪声系数9 dB接收机噪声系数温度300 K室温用于算底噪坐标系先定义清楚地面用户用二维坐标 ((x,y)) 表示无人机基站的水平坐标落在六边形中心 ((x_i, y_i))高度为 (h)所以它与地面用户的三维距离是[ d \sqrt{(x-x_i)^2 (y-y_i)^2 h^2} ]所有覆盖和干扰计算都要基于这个三维距离而不是只看水平距离。很多新手在这里会搞错直接把用户到基站的水平距离当传播距离仿真结果会严重失真。3.2 生成19个六边形小区的中心坐标生成蜂窝网格坐标有很多种方法我推荐用六边形的轴向坐标axial coordinates。这个坐标系有两个整数轴 (q) 和 (r)满足约束条件[ \max(|q|, |r|, |qr|) \le \text{ring} ]当 (\text{ring}2) 时正好生成 (1 6 12 19) 个中心点。轴向坐标转成平面直角坐标系的公式如下[ x \sqrt{3} R \left(q \frac{r}{2}\right) ][ y \frac{3}{2} R r ]对应的MATLAB函数我写成了这样function centers hexGridCenters(R, ring) % 生成六边形网格中心坐标 % R: 六边形半径ring: 圈数ring2 对应19个小区 centers zeros(0, 2); for q -ring:ring for r -ring:ring if max(abs(q), abs(r), abs(qr)) ring x sqrt(3) * R * (q r/2); y 1.5 * R * r; centers(end1, :) [x, y]; %#ok end end end end这个函数非常短但很核心。调用centers hexGridCenters(500, 2)后得到的就是19个站点的水平坐标。把这19个点画出来你会看到很漂亮的两圈六边形结构。如果你想连六边形边界一起画可以再写一个画边的函数。这里有个小技巧六边形的六个顶点可以由中心坐标加上旋转角度得到但要注意平顶六边形和尖顶六边形顶点角度不一样。我习惯用尖顶六边形顶点角度从0度开始每60度一个点function h plotHex(center, R, color) % 在指定中心画一个六边形 angles 0:60:300; xv center(1) R * cosd(angles); yv center(2) R * sind(angles); h patch(xv, yv, color, FaceAlpha, 0.1, EdgeColor, k); end3.3 用户位置分布与基站高度设置用户位置可以按“均匀分布撒点”或“网格化逐点计算”两种方式处理。撒点法适合统计覆盖率。在覆盖区域范围内随机生成 (N) 个用户对每个用户计算SINR然后统计大于阈值的比例。这种方法计算量小但热力图不连续。网格化逐点计算适合画覆盖热力图。把区域划分为均匀网格对每个格点计算SINR然后用imagesc或pcolor显示。这种方式可视化效果好但计算量随网格密度线性增长。我建议先做网格化可视化再跑随机撒点统计。两块代码是同一套函数只是输入不同。无人机高度 (h) 这个参数我通常放在参数结构体的显眼位置。它直接影响路径损耗和覆盖半径。后面我会专门讲高度扫描怎么用这里先按100米设。3.4 路径损耗与SINR计算路径损耗模型选用经典自由空间传播模型加阴影衰落。自由空间路径损耗公式是[ PL(d) 20\log_{10}\left(\frac{4\pi d f_c}{c}\right) ]其中 (d) 是三维距离单位米(f_c) 是载频单位赫兹(c3\times10^8) m/s。这个公式算出来的单位是dB。实际环境里还有阴影衰落也就是物体遮挡造成的慢衰落通常用均值为0、标准差为 (\sigma) 的对数正态随机变量表示。所以单条链路的路径损耗是[ PL_{\text{total}} PL(d) \mathcal{N}(0, \sigma^2) ]用户接收到的信号功率是[ P_{r,i} P_t G - PL_{\text{total},i} ]注意发射功率 (P_t)、天线增益 (G) 和路径损耗 (PL) 都以dB为单位。SINR的计算分三步先选最强基站作为服务基站然后把其他所有基站的接收功率当干扰最后加上接收机底噪。MATLAB里可以这样实现function sinrDb ueSINR(uePos, bsXY, h, prm) % uePos: 用户位置 [x, y] % bsXY: 基站水平坐标N x 2 % h: 无人机高度 % prm: 参数结构体 nBs size(bsXY, 1); prDbm zeros(nBs, 1); for k 1:nBs d sqrt((uePos(1)-bsXY(k,1))^2 (uePos(2)-bsXY(k,2))^2 h^2); pl 20*log10(4*pi*d*prm.fc/3e8); pl pl prm.noiseVar*randn; % 阴影衰落 prDbm(k) prm.Pt prm.G - pl; end [servPower, ~] max(prDbm); % 线性域功率单位 mW servLin 10^(servPower/10); interfLin sum(10.^(prDbm/10)) - 10^(servPower/10); % 底噪kTBF kT 1.38e-23 * 300; % 瓦/赫兹 noiseW kT * prm.BW * 10^(prm.noiseFigure/10); noiseDbm 10*log10(noiseW*1000); noiseLin 10^(noiseDbm/10); sinrLin servLin / (interfLin noiseLin); sinrDb 10*log10(sinrLin); end这段代码里有两个容易出错的地方。第一干扰功率不能直接在dB域相加一定要先转换到线性域。第二底噪要用带宽和噪声系数计算不是随便给一个常数。3.5 覆盖热力图与六边形轮廓绘制有了ueSINR函数画热力图就是把区域切分成网格逐点调用。我通常把网格步长设为小区半径的1/20左右既不会太慢又足够看清边缘细节。核心代码如下% 生成19个基站中心 centers hexGridCenters(R, 2); % 定义绘图区域范围 xMin min(centers(:,1)) - R; xMax max(centers(:,1)) R; yMin min(centers(:,2)) - R; yMax max(centers(:,2)) R; % 创建网格 step R/20; xGrid xMin:step:xMax; yGrid yMin:step:yMax; [XX, YY] meshgrid(xGrid, yGrid); % 预分配SINR矩阵 SINRmap zeros(size(XX)); % 计算每个格点的SINR for i 1:numel(XX) SINRmap(i) ueSINR([XX(i), YY(i)], centers, h, prm); end % 绘制热力图 figure; imagesc(xGrid, yGrid, SINRmap); axis xy; axis equal; colorbar; hold on; % 绘制19个六边形边界 for k 1:size(centers,1) plotHex(centers(k,:), R, none); end plot(centers(:,1), centers(:,2), ko, MarkerSize, 6, MarkerFaceColor, w); hold off; xlabel(x / m); ylabel(y / m); title(无人机空中基站覆盖SINR热力图);plotHex函数里的颜色参数传none意思是只画边界不填色。这样既能看到空中基站的位置又不会被色块遮住。如果区域内的格点数量太多嵌套循环会明显变慢。后面我会在“踩坑”部分讲怎么用矩阵操作加速。3.6 覆盖率统计函数覆盖率的定义很简单在所有用户或所有格点中SINR大于某个阈值 (\gamma) 的比例。如果只看随机撒点统计函数可以这样写function covProb coverageProbability(uePos, centers, h, prm, gamma) nUe size(uePos, 1); sinrAll zeros(nUe, 1); for i 1:nUe sinrAll(i) ueSINR(uePos(i,:), centers, h, prm); end covProb mean(sinrAll gamma); end这里阈值 (\gamma) 一般取 -5dB、0dB、5dB。实际系统中语音业务要求SINR在 -5dB以上也能工作而高速数据业务可能需要10dB以上。4. 仿真结果怎么看覆盖率和可靠性的评价方法4.1 覆盖率与SINR阈值的对应关系跑完热力图之后第一件事不是看颜色好不好看而是统计覆盖曲线。通常做法是让阈值 (\gamma) 从-10dB开始以1dB步长增加到20dB然后画出覆盖率随阈值变化的曲线。在19个六边形小区场景下你会看到一条很典型的S形曲线阈值低时覆盖率接近1阈值高时覆盖率掉到零点几甚至更低。边缘用户比如六边形边界附近的SINR明显比中心用户差这体现的正是蜂窝网络的干扰受限特性。如果你把单层7个小区和双层19个小区的网络放到一起比较通常19个小区会带来更严重的干扰因为同频基站数量多了。所以覆盖率曲线会整体下移一点。这不是坏事它说明这个模型能反映真实网络的干扰结构。4.2 无人机飞行高度对覆盖的影响规律高度是空中基站区别于地面基站的最大可调参数。我经常做一组高度扫描固定其他参数让 (h) 从50米扫到500米然后看覆盖率变化。结果通常是先升后降。原因很好理解一开始增大高度能够减少地面障碍物遮挡从概率上增加LOS条件改善信号质量但当高度继续增大三维距离 (d) 迅速变大路径损耗按距离的平方增加反而会让覆盖率下降。最优高度取决于小区半径、载频和传播环境。自由空间模型下理论上的最优高度大约在水平距离的0.5到1倍之间。比如小区半径500米无人机最优高度可能在300到600米之间。但实际环境里有阴影衰落和地形遮挡这个高度要重新扫。建议你把高度扫描做成一个循环然后画出“高度-覆盖率”曲线一眼就能找到拐点。4.3 小区间距和频率复用对干扰控制的启示19个小区内部相邻小区之间的距离是 (\sqrt{3}R)。如果你把R缩小比如从500米改成300米无人机之间更挤覆盖密度更高但由于发射功率不变相邻小区干扰会变强边缘SINR可能反而下降。这说明空中基站不是越多越好也不是飞得越近越好。更实用的角度是频率复用。真实系统不会让所有无人机都用同一个频点而是会把19个小区分成多个频组。如果采用复用因子为3或7的规划那么同频干扰会显著降低但每个小区可用的频谱变少。在仿真里你可以在SINR公式里给不同基站加不同的频段偏移然后把不同频点分成互不重叠的干扰子集。这部分做起来有点复杂但对理解蜂窝干扰管理非常有帮助。5. 踩过的坑和后续改进方向5.1 生成19个中心的坐标条件写错了我一开始写轴向坐标约束时直接用if abs(q) abs(r) abs(qr) ring这种类似曼哈顿距离的写法结果生成的不是六边形蜂窝而是一个近似菱形的点阵。正确写法应该是max(abs(q), abs(r), abs(qr)) ring这个条件对应的是六边形网格的“立方坐标”约束三条轴的和必须为0所以约束是最大坐标不超过ring。我建议你生成后用size(centers,1)检查一下必须是19。如果是别的大小多半就是约束条件写错了。5.2 噪声功率单位混乱在SINR计算中功率有两种常用单位dBm和瓦特。最容易出错的点是噪声系数和带宽组合后的换算。正确做法是先把所有功率统一到线性尺度毫瓦或瓦算完SINR再转回dB。我代码里用的是先算接收机热噪声功率[ N k T B F ]其中 (k1.38\times10^{-23})(T300)(B) 是带宽Hz(F) 是噪声系数线性值不是dB。把结果转为mW后取10log10得到dBm然后再参与线性计算。很多朋友直接写noiseDbm -174 10*log10(BW)这是只算了热噪声没算噪声系数。如果接收机噪声系数是9dB底噪会高出9dB对SINR的影响非常大。5.3 热力图显示出现大面积NaN如果用户位置超出了所有无人机的有效覆盖范围路径损耗算出的接收功率可能非常小但由于有阴影衰落的随机性一般不会出现NaN。真正出现NaN的原因通常是网格范围没设好比如包含了无穷大值或者meshgrid里用了NaN步长。建议在绘热力图之前先用isfinite检查一下网格坐标再把异常点删掉。另外imagesc显示时如果矩阵里有NaN会以空白显示看起来像是覆盖空洞容易误判。用pcolor代替imagesc可以更明确地显示出边界。5.4 计算速度太慢怎么办网格化热力图如果步长太细比如步长设为10米在5公里乘5公里的区域里就是25万个格点每个格点都要计算19条链路的路径损耗和干扰嵌套循环要跑几十秒甚至几分钟。我常用的加速方法有三种。第一种把ueSINR改成向量化版本。对所有网格点一次性计算距离矩阵。也就是说把用户坐标矩阵展平成一个 (N\times1) 列向量基站坐标作为 (1\times M) 行向量广播到 (N\times M) 的矩阵中然后公式直接操作矩阵。这样能省掉循环。第二种降低阴影衰落的随机性。逐点加随机阴影会造成热力图变成“雪花”覆盖曲线噪声大。你可以固定一个随机数种子或者在同一轮仿真里用同一个衰落矩阵保证结果可复现且更平滑。第三种用parfor并行计算。如果电脑是多核把遍历网格点的for换成parfor配合parpool启动并行池速度能快很多。不过要注意parfor里尽量不要动态增删变量否则效率反而下降。5.5 从理想蜂窝到真实环境的差距仿真跑通之后务必提醒自己这套六边形网格是理想化模型。真实场景里无人机不可能永远悬停在精确位置它会受气流影响漂移电池续航决定了它只能工作几十分钟需要轮换无人机之间如果距离太近旋翼下洗气流会互相干扰影响飞行稳定性。另外我在仿真里假设无人机是“全向天线”但真实无人机挂载的基站天线方向图往往不是全向的挂载角度和无人机姿态都会影响覆盖。如果做更精确的仿真可以在ueSINR里加入天线增益方向图模型让增益随用户相对方位变化。还有一个重要问题是回传链路。无人机基站飞到天上后基站和核心网之间的连接不能靠网线只能靠微波、卫星或者光纤中继。如果回传带宽不够无人机提供再多无线覆盖用户体验依然很差。所以严格来说覆盖仿真只是第一步后面还要叠加上行回传约束、干扰抑制和航迹规划。我按照上面这套流程跑完之后最大的体会是19个六边形蜂窝网作为研究框架非常合适它把复杂的多机协作简化为一个清晰的拓扑让你能集中精力研究高度、发射功率、小区半径这些关键参数。但如果你想把结果推广到真实部署一定要记住仿真里的“完美蜂窝”只是起点。建议你在跑通之后的第一个扩展方向是把无人机的位置误差、时变信道和续航时间加进去看看覆盖率会掉多少。很多时候那些在理想模型里被忽略的5%误差恰恰是真实系统里最难解决的50%问题。
返回列表