资讯详情

资讯详情

无人机空中基站蜂窝覆盖仿真:MATLAB建模与最优高度分析

这篇内容其实已经在我脑子里转了很久了。最近不少做通信仿真的朋友都在问无人机当中继、当空中基站到底怎么下手仿真尤其是覆盖场景怎么建模。我趁着把之前一个19蜂窝覆盖的MATLAB项目重新整理过的机会把从拓扑建模到信道计算、再到结果分析的完整链路都写出来。这个项目核心就一句话用无人飞行器作为19个六边形蜂窝网络中的空中基站通过合理布设高度和位置提升蜂窝网络的覆盖范围和可靠性。整篇是基于MATLAB的完整仿真思路通信方向的学生、刚接触无人机仿真的工程师以及想快速验证覆盖算法的研究者都可以直接参考。1. 无人机空中基站解决的核心痛点应急、盲区与临时大覆盖1.1 固定地面基站搞不定的三种场景地面蜂窝网络最大的软肋不是容量不够而是覆盖太固定。基站铁塔竖在那儿天线高度、朝向、倾角一旦设定覆盖范围基本就钉死了。碰到这几种情况地面网很容易露出短板第一个是灾害应急场景。地震、台风、洪水过后地面供电和传输链路大面积损坏光缆断了、机房进水了现有的基站就算设备没坏也因为没有回传链路而变成哑站。这时候再组织抢修需要时间但灾区通信恢复等不了。无人机搭载轻量化基站设备从临时起降点升空几十公里范围内可以快速搭起一张临时网络通信恢复时间从天级压缩到小时级。第二个是大型集会的流量潮汐。一场数万人的户外活动日常配置的地面基站根本扛不住局部涌来的连接请求现场用户会感觉信号满格但上不了网。如果用几架无人机在会场上空盘旋或定点悬停相当于在热点区域临时叠加了几十个会飞的小区容量不足的问题立刻缓解。第三个是偏远盲区的低成本补盲。山区公路、近海海域、荒漠边缘运营商建地面基站要考虑供电、传输、铁塔维护成本很多地方算不过账来。无人机基站机动性强可以在特定时段、特定航线提供周期性覆盖虽然不能7x24小时常驻但比彻底没有信号强太多。1.2 空中基站相比地面基站的三个关键特性空中基站不是简单把地面基站设备搬上天它的核心优势来自三个维度高度自由度。无人机基站最直接的好处是可以主动选择高度。地面基站天线高度通常只有30到60米而无人机可以悬停在100米到300米甚至更高。高度上去了地物遮挡大幅减少用户和基站之间出现视距路径的概率明显提升。对无线传播来说视距意味着更低的路径损耗和更小的时延扩展链路质量会有本质改善。快速响应与动态调整。地面基站调整天线倾角需要上塔操作调整覆盖方向更是大工程。无人机基站的位置、高度、朝向、发射功率都可以在飞行过程中动态调整相当于把无线网络优化从星期级压缩到了秒级。这个特性在应急场景里尤其有价值哪里用户密度高就指挥无人机往哪里靠一靠。覆盖范围与高度的强耦合。这个稍后展开细说。简单讲无人机升得越高可视区域越大单机覆盖范围越大但路径损耗也在增加所以高度存在一个最优值不是越高越好。这也是整个仿真中最有意思、最值得细算的部分。这套仿真模型的思路就是在这些特性之上搭建的用一个19蜂窝的网络拓扑模拟中等规模的覆盖区域让无人机代替地面基站逐个覆盖蜂窝单元再通过链路预算和蒙特卡洛仿真定量评估覆盖率和可靠性。2. 19蜂窝拓扑建模六边形网格的数学逻辑与MATLAB坐标生成2.1 六边形为什么能无缝铺满二维平面蜂窝网络仿真里最经典的假设就是六边形小区。原因很简单如果要让多个圆形覆盖区拼成一块连续的区域圆与圆之间必然出现重叠或者空洞。基站覆盖的实际形状当然不是规则的但在规划阶段我们习惯用正多边形近似。能无缝铺满整个平面的正多边形只有三种正三角形、正方形、正六边形。六边形在相同中心距条件下面积最大意味着同样的基站数量可以覆盖更大的区域而且六边形覆盖范围的边缘到中心距离相对均匀不像正方形那样角上覆盖质量明显变差。从几何关系上讲多个覆盖半径相同的圆圆心按规则间隔排列时每个圆的覆盖范围可以近似成一个正六边形。这是维诺图的经典结论平面上每个离散点周围最近的区域天然被划分成多边形而正六边形的网格正是最优的拓扑近似。2.2 19蜂窝的分层结构与已知参数19个六边形蜂窝通常指的是中心1个蜂窝外面环绕两圈第一圈6个蜂窝第二圈12个蜂窝总计161219个。为什么选19而不是7因为7个蜂窝中心加一圈规模太小边缘干扰环境太简单算出来的覆盖概率偏乐观很难反映真实系统中相邻小区、次相邻小区之间的同频干扰。19个蜂窝已经包含了两圈相邻关系可以较好地模拟一个中等规模小区的干扰场景同时计算量又不会失控。建模时我采用每个蜂窝中心部署一架无人机的默认配置也就是说一共有19个空中基站。这个配置听起来无人机数量不少但在仿真中你完全可以把它理解成19个潜在基站位置用来研究资源充足时的理想覆盖效果。实际工程中如果无人机数量有限只需要在覆盖判读后统计哪些蜂窝因为没有基站导致覆盖空洞这就是另一套分析逻辑了。六边形蜂窝的几何参数有几个关键值需要提前定清楚参数符号说明蜂窝外接圆半径R六边形顶点到中心距离即蜂窝半径蜂窝内切圆半径r √3/2 R六边形中心到边中点距离相邻蜂窝中心距d √3 R两基站之间的水平间隔蜂窝覆盖面积A (3√3/2)R²单个六边形面积覆盖半径参考√3/2 R蜂窝内任意点到中心的距离不会超过R我常用的参数是R 500米这样相邻基站中心距约为866米单个蜂窝覆盖面积约0.65平方公里19个蜂窝总面积约12.3平方公里。这个尺度比较贴合无人机基站的典型覆盖场景——单机覆盖半径几百米到一两公里不至于小到无意义也不至于大到链路预算全部超标。2.3 MATLAB生成蜂窝中心坐标的代码实现生成19个蜂窝中心坐标最容易理解的方式是用轴向坐标系axial coordinates。对六边形网格来说存在一组整数坐标(q, r)只要满足约束条件就能唯一确定一个蜂窝单元。从轴向坐标转换到平面直角坐标有一个固定公式我直接把这段代码写在这里R 500; % 蜂窝半径外接圆半径单位米 N_ring 2; % 中心 两圈 19个蜂窝 centers []; % 存放所有蜂窝中心坐标 for q -N_ring:N_ring for r -N_ring:N_ring % 轴向坐标合法约束abs(qr)不超过N_ring if abs(q r) N_ring continue; end % 轴向坐标 - 直角坐标 x sqrt(3) * R * (q r / 2); y 1.5 * R * r; centers [centers; x, y]; end end % 可视化验证 figure; hold on; for i 1:size(centers, 1) % 生成六边形顶点 angles 0:60:300; verts_x centers(i, 1) R * cosd(angles); verts_y centers(i, 2) R * sind(angles); plot(verts_x, verts_y, k-); text(centers(i, 1), centers(i, 2), num2str(i), HorizontalAlignment, center); end axis equal; grid on;这段代码跑完之后你会看到中心一个正六边形外面紧紧裹着两圈六边形一共19个。这段代码里的坐标公式对应的是尖顶六边形也就是相邻两列蜂窝在垂直方向上错开半个边长的布局。这个方向其实无伤大雅只要你在后续计算蜂窝之间距离时始终使用同一个坐标系定义就不会出错。一个容易踩坑的细节蜂窝半径R到底指外接圆半径还是内切圆半径一定要在代码注释里写清楚。不同资料用哪个的都有如果不统一后面计算基站间距、用户距离时全部都会偏差我最初就从这里错过一次。3. 飞行高度不是越高越好空对地信道模型与链路预算3.1 自由空间路径损耗为什么不够用很多第一次做无人机覆盖仿真的朋友拿自由空间路径损耗公式直接算结果发现无人机高度越高覆盖越好最后把高度推到上千米得出一个明显脱离实际的结论。问题出在哪地面的无线传播根本不是自由空间。地面用户处在建筑物、树木、地形起伏之间无人机和用户之间可能是视距路径也可能是非视距路径。非视距路径意味着信号要经过反射、绕射、散射才能到达接收端路径损耗比视距情况大得多典型差距可以达到20分贝以上。这意味着如果有一个无人机升得很高虽然看得远但较远处的用户大概率处于非视距状态路径损耗骤增实际覆盖效果反而变差。所以空对地信道建模的核心是判断一条链路有多大的概率是视距链路然后分别计算视距和非视距情况下的路径损耗最后按概率加权平均。这就是所谓的概率型空对地信道模型也是目前做这类仿真时最常用的折中方案。3.2 LoS概率模型与路径损耗计算视距概率与仰角直接相关。仰角越大链路被地物遮挡的概率越小。无人机悬停在正上方时视距概率接近1无人机贴近地平线时视距概率趋近于某一个很小的常数。常用的经验模型是P_LoS 1 / (1 a * exp(-b * (θ - a)))其中仰角θ的单位是度a和b是环境相关参数。a本质上是环境遮挡的基线概率b描述遮挡随仰角变化的衰减速度。我常用的环境参数参考如下环境ab郊区4.880.43城市9.610.16密集城区12.080.11路径损耗的计算分两种情况。视距链路的路径损耗约等于自由空间损耗加一个很小的附加损耗非视距链路加一个较大的附加损耗PL_LoS 20log10(4πfd/c) η_LoS PL_NLoS 20log10(4πfd/c) η_NLoS其中d是三维距离也就是无人机到用户的直线距离不是水平距离。η_LoS在城市环境里取1分贝左右η_NLoS取20分贝左右。平均路径损耗为PL_avg P_LoS * PL_LoS (1 - P_LoS) * PL_NLoS这段公式的物理意义很直观信号能不能到达用户关键看这条链路多视距。用户在无人机正下方的开阔地面上时P_LoS接近1路径损耗接近自由空间值用户在远处的建筑群背后时P_LoS下降非视距分量占主导路径损耗陡增。链路预算在仿真里的写法其实就一行P_r_dBm P_t_dBm G_t_dBi G_r_dBi - PL_avg我常用的参数配置如下参数取值说明发射功率26 dBm航空基站典型值发射天线增益3 dBi全向天线接收天线增益0 dBi手机终端参考值载波频率2 GHzLTE/5G低频段接收灵敏度-95 dBm覆盖判读门限以R500米蜂窝、无人机高度150米为例蜂窝边缘顶点到无人机的三维距离约522米。在郊区环境下这个距离的路径损耗大约在103分贝左右接收功率约2630-103-74分贝毫瓦远高过-95分贝毫瓦的门限覆盖是够的。但如果换到密集城区非视距附加损耗显著拉高平均路径损耗覆盖余量就要重新核算了。3.3 最优高度怎么找高度扫描法是第一步理解了信道模型之后就引出了整个仿真中最值得反复看的问题无人机到底飞多高最合适想解答这个问题不能只靠直觉最简单的办法就是做高度扫描。做法很直接固定19个蜂窝中心位置、固定用户随机撒点把无人机高度从50米到500米每隔10米扫一遍每个高度都做一次完整蒙特卡洛仿真统计覆盖小区用户的覆盖率。你会发现覆盖率随高度变化呈现明显的单峰特性高度偏低时视距概率低大量用户处于非视距状态覆盖率差高度偏高时链路距离变长路径损耗变大覆盖率又掉下来中间某个高度覆盖率最大这个高度就是你在这个环境下的近似最优值。这个扫描逻辑实现起来并不复杂核心点是每个高度条件下都要保证用户撒点方式一致否则比较就没有意义。我在仿真里用的是固定随机种子这样不同高度条件下用户坐标完全相同覆盖率的差异完全来自高度变化结论才干净。具体代码在下一章的主流程里会一起给出。4. 覆盖仿真主流程从位置配置到覆盖热图的代码架构4.1 参数初始化与数据结构设计很多初学者写仿真喜欢把参数散落在脚本各处开始跑的时候改起来特别痛苦。我的习惯是把所有配置集中放在一个结构体里仿真开始前一次性加载这样后面无论是改蜂窝半径、改无人机高度还是改环境参数都只用动一处。simConfig struct(); simConfig.cellRadius 500; % 蜂窝半径米 simConfig.uavHeight 150; % 无人机高度米 simConfig.freq 2e9; % 载频Hz simConfig.pt 26; % 发射功率dBm simConfig.gt 3; % 发射天线增益dBi simConfig.gr 0; % 接收天线增益dBi simConfig.threshold -95; % 接收功率门限dBm simConfig.noise -101; % 噪声功率dBm对应20MHz带宽 simConfig.interferenceOn true; % 是否考虑同频干扰 simConfig.numUsers 2000; % 用户采样点数 simConfig.randomSeed 42; % 随机种子 simConfig.env struct(type, urban, a, 9.61, b, 0.16);噪声功率这里多说一句。-101分贝毫瓦对应的是20兆赫兹带宽下的热噪声底加接收机噪声系数后的近似值。如果你仿真用的带宽不同这个数要重新算。4.2 核心计算模块信道、功率与覆盖判读整个覆盖仿真的核心循环分成这几步对每个用户位置先算出它到所有无人机的三维距离和仰角然后用空对地信道模型计算每条候选链路的路径损耗接着算每条链路的接收功率从中选出最强的信号作为服务链路再判断这个最强信号是否超过门限、能否抵抗同频干扰最终给出覆盖结论。下面这段代码是一个简化的框架可以直接嵌入你的项目里跑通function coverageStatus calcCoverage(simConfig, centers) % 生成用户位置在19个蜂窝围成的区域内均匀撒点 rng(simConfig.randomSeed); N simConfig.numUsers; uavH simConfig.uavHeight; centers centers; % 简化的区域边界以中心蜂窝为中心取外圈直径 regionR simConfig.cellRadius * 5; userPts (rand(N, 2) - 0.5) * 2 * regionR; % 只保留落在某个蜂窝内的点通过最近中心距离判断 % 这里为了逻辑清晰直接对所有点计算后续再过滤 coverageStatus zeros(N, 1); for u 1:N p userPts(u, :); % 计算到所有无人机的水平距离 dxy sqrt((centers(:,1) - p(1)).^2 (centers(:,2) - p(2)).^2); d3 sqrt(dxy.^2 uavH^2); theta atan2d(uavH, dxy); % 视距概率 a simConfig.env.a; b simConfig.env.b; pLoS 1 ./ (1 a * exp(-b * (theta - a))); % 路径损耗 c 3e8; fspl 20*log10(4*pi*simConfig.freq*d3/c); plLoS fspl 1; plNLoS fspl 20; plAvg pLoS .* plLoS (1 - pLoS) .* plNLoS; % 接收功率 pr simConfig.pt simConfig.gt simConfig.gr - plAvg; % 选择最强服务链路 [maxPr, idx] max(pr); % 干扰计算除最强链路外其余信号视为干扰 if simConfig.interferenceOn interference sum(10.^((pr([1:idx-1, idx1:end])) / 10)); noiseLin 10^(simConfig.noise / 10); sinr 10^((maxPr) / 10) / (interference noiseLin); sinr_dB 10*log10(sinr); coverageStatus(u) (sinr_dB 5); else coverageStatus(u) (maxPr simConfig.threshold); end end end注意这段代码的注释里提到过滤用户位置的部分实际项目中不能这样图省事。正确的做法是判断每个用户点离最近蜂窝中心的距离如果超过该蜂窝的外接圆半径R说明这个点落在了六边形边界之外应该舍弃否则统计覆盖率时会把区域外的点也算进去覆盖率会被明显带偏。4.3 覆盖率统计与热图绘制跑完所有用户点之后覆盖率就是覆盖用户数除以总用户数。我还会额外统计一个中断概率用1减去覆盖率即可这个指标直接对应标题里提到的可靠性。热图绘制的价值在于定位覆盖空洞哪个蜂窝覆盖差、哪个蜂窝边缘掉得太快只看平均数是看不出来的。用散点图按接收功率着色效果最直观figure; scatter(userPts(:,1), userPts(:,2), 20, prServed_dB, filled); colorbar; colormap(jet); xlabel(水平距离/m); ylabel(水平距离/m); title(19蜂窝无人机覆盖热图);还有一种画法是直接用imagesc做网格化热图但那样需要额外插值散点图反而更真实因为它呈现的就是用户采样点上的真实链路质量。5. 结果判读与实操排雷覆盖空洞、边缘用户和那些坑5.1 从覆盖热图读到哪些关键信息按照我上面的参数配置跑一遍覆盖热图会呈现几个典型特征。首先是中心蜂窝附近的接收功率明显强于外围蜂窝这是因为外围无人机数量多、彼此距离更近同频干扰也更严重尤其在外圈蜂窝朝向区域中心的一侧SINR会大幅下降。其次是蜂窝边缘的覆盖颜色会从红变蓝这不是哪一架无人机功率不够而是用户从最优服务链路切换到次优链路时干扰结构突然变化导致的性能跳变。如果你发现外围蜂窝边缘的覆盖颜色大面积变蓝通常意味着相邻无人机的水平间隔太小导致边缘用户同时收到两三个较强的信号彼此干扰。这时候有两条路可以走一是提高门限但这只是改变了评判标准二是调整无人机高度让外围无人机飞得稍微高一点改变它们对边缘区域的干扰几何关系。实测下来后者的改善更真实。可靠性的量化也不该只看平均覆盖率。我会额外关注两个指标边缘覆盖率取每个蜂窝边缘带内的覆盖概率最低用户吞吐量对应10%最差用户的可达速率。无人机网络经常出现平均覆盖率很高、但最差10%用户几乎不可用的情况这在可靠性评估里是不能接受的。5.2 我在这个项目里踩过的四个典型坑第一个坑是天线增益的参考点混淆。我最初计算接收功率时把无人机发射天线增益当成全向天线的0分贝来算后来发现应该用3分贝甚至更高因为实际机载天线下半球辐射有增益优势。差3分贝听起来不大但反映到覆盖半径上边缘区域的结果完全不同。做链路预算之前先想清楚你的增益值到底是全向基准还是偶极子基准。第二个坑是单位混用。路径损耗公式里频率用赫兹、距离用米但用户坐标有时候却是以千米为单位生成的。一旦混用20log10(4πfd/c)里的fd会差三个数量级路径损耗计算结果完全失真而报错还不会出现因为它只是数值异常。我的解决办法是全部统一到米和赫兹这两个基础单位坐标生成时就直接乘1000转换不做任何临时换算。第三个坑是采样点数量不足导致曲线剧烈抖动。高度扫描时如果每个高度只撒500个用户点覆盖率曲线会像心电图一样上下跳。我试过之后发现至少3000个点起步5000到10000个点会比较稳。随机种子固定之后曲线仍然会有小的波动把相邻高度的覆盖率做5点滑动平均趋势就清晰了。第四个坑是只算接收功率、不考虑干扰。很多简化仿真用接收功率超过门限来判覆盖这在单基站场景没问题但在19个基站的多小区场景里会严重高估覆盖率。用户可能在两个基站覆盖的交叠区收到两路都很强的信号但两路信号互相干扰实际SINR非常低。把同频干扰纳入判读之后覆盖率通常会下降10到20个百分点这个数字才是靠近现实的。5.3 干扰门限和覆盖判读的工程思考我在代码里把覆盖门限定为了SINR达到5分贝。为什么取这个值而不是0分贝或者10分贝因为5分贝大概对应蜂窝边缘用户使用最低阶调制方式时能保证的基本通信质量再往上就需要更高阶的调制对SINR的要求会随之提高。如果你仿真的是语音业务0分贝也可以接受如果想评估数据业务体验建议把门限抬到10分贝左右。不同的门限对应不同的覆盖语义在报告里一定要写明白否则结论很容易被误读。6. 这版仿真的可扩展方向与我的个人体会6.1 从静态覆盖到动态部署的扩展空间到这里为止这套仿真的前提都是无人机位置固定、高度固定、功率固定属于静态覆盖评估。但无人机空中基站真正吸引人的地方在于动态调整能力。我在这个项目基础上做过的扩展主要有三个方向都可以直接复用现有代码框架。方向一是高度与位置的联合优化。把覆盖率作为目标函数把各无人机坐标作为变量用粒子群或者遗传算法搜索更优的布设方案。相比固定高度联合优化通常能把边缘覆盖率再提升一些代价是计算量成倍增加。方向二是能耗与续航约束。每架无人机都有电池限制悬停功率随高度增加而增加如果你在目标函数里加入综合续航时间这一项最优解往往不会再是最高覆盖率方案而是一个覆盖和能耗的折中解这更加贴近工程实际。方向三是与地面基站的协同组网。地面网本来就存在无人机应该补在薄弱处而不是覆盖全网把地面基站作为固定层、无人机作为机动层两层联合仿真会是一个更完整的项目但需要的地物环境数据也会更复杂。6.2 我做完这个项目之后想说的话如果让我给刚入手这个方向的人一个建议我会说先别急着把算法搞得花里胡哨把信道模型、链路预算、覆盖统计这三步做扎实结果才值得相信。仿真里所有结论都建立在模型假设之上假设越明确结论越经得起推敲。我自己的体会是高度扫描这一步看似简单却是整个项目里信息量最大的一步。它能直接告诉你当前环境下无人机的最优布设范围也能暴露你对信道模型参数的理解是否到位。如果高度扫描曲线没有出现明显的单峰几乎可以肯定代码里的某个环节出了问题——要么距离计算错了要么单位混了要么概率模型参数用错了环境。这个特性拿来当代码调试的体检工具非常管用。最后补充一句仿真结果和实际外场测试之间总会存在落差这是正常的。模型把复杂的电磁环境简化成概率和损耗本身就会损失一部分真实度。但一套链路逻辑清晰、参数可解释的仿真对前期方案论证和选型的作用是实打实的。至少我现在评估一个新场景的无人机覆盖方案都是先跑这套仿真再决定是不是值得进行外场验证。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →