ARTICLE DETAIL

资讯详情

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

无人机空中基站覆盖仿真:基于Matlab的六边形蜂窝网络可靠性分析

无人机空中基站覆盖仿真:基于Matlab的六边形蜂窝网络可靠性分析 做无人机空中基站仿真最头疼的事情不是无人机本身而是怎样把“覆盖”这件事说清楚。我自己的习惯是先把地面蜂窝网络搭出来再把无人机塞进去逐项对比覆盖率和可靠性指标这样结论才有说服力。这篇文章就围绕一个具体的Matlab项目展开在19个六边形蜂窝小区组成的网络中引入无人飞行器作为空中基站用来补盲、扩容、抗毁提升全网覆盖质量和可靠性。适合通信专业的毕设党、做应急通信方案验证的工程师以及想用Matlab快速搭建蜂窝网络仿真平台的算法同学。我会把建模思路、关键代码逻辑、参数选择和踩坑经验都摆出来方便直接复现。19个六边形小区这个规模在蜂窝网仿真里属于“不多不少刚刚好”既比单小区能体现小区间干扰和边缘效应又不像全网络几百个小区那样跑起来卡到怀疑人生。无人机空中基站的引入方式可以理解为“天上多了一层可选接入点”而我们需要回答的问题是它到底能把覆盖范围提升多少可靠性改善到什么程度应该配置多少个、飞多高。这些都能在Matlab里量化出来。1. 项目背景与系统设计思路1.1 为什么选择19个六边形蜂窝网络作仿真场景蜂窝通信里的六边形小区是个经典抽象它的数学意义大于物理意义。六边形比正三角形和正方形更接近圆形覆盖的理想形态同时能无缝拼接所以一直作为蜂窝网络规划的标准分析模型。19个小区由中心1个、内圈6个、外圈12个组成这里面有个规律每一圈的小区数量是6的倍数第n圈就是6n个。19这个数正好覆盖两层邻居分析干扰的时候能包含第一邻区和第二邻区边界效应也相对可控。这个场景同时具备“足够复杂”和“还能算得快”的平衡点。如果用7个小区中心小区被同频干扰源包围得不够充分37个小区虽然更接近真实网络但用户撒点、干扰矩阵计算的复杂度翻倍。19个小区加上若干无人机基站之后既能看清空中基站对边缘覆盖的增益又不会让初学者的机器风扇狂转。1.2 无人机空中基站要解决什么问题无人机挂载基站UAV-mounted Base Station并不是要替代地面基站而是补足地面网络在特定场景下的短板。三种典型场景是一是自然灾害导致地面基站断站比如洪涝、地震后光缆和机房受损无人机可以快速升空恢复基础通信二是大型集会或活动区域的容量热点地面基站拥塞空中基站可以作为临时容量补充三是偏远地区或临时工地没有固定基础设施无人机可以在数小时内拉起一张可用的覆盖网。核心优势在于“可控的视距链路”。地面基站天线高度有限路径上容易有建筑和地形遮挡无人机站在几百米高空与用户之间大概率是视距传播路径损耗明显低于非视距情况。此外无人机位置可动态调整既能垂直移动改变覆盖半径也能水平飞行靠近弱势用户这是固定铁塔做不到的。1.3 仿真总目标与评估指标这个项目里我定义了两个层面的指标。第一层是覆盖范围统计区域内所有测试点中能接收到大于等于某个SINR阈值的比例。例如LTE里语音业务需要SINR不低于-6dB数据业务可能要求0dB甚至更高。覆盖范围提升体现在SINR热图上就是“红色高值区域变大蓝色盲区变小”。第二层是可靠性只看平均SINR还不够必须看低SINR用户的改善情况。通常用“边缘用户SINR CDF曲线”和“中断概率”来刻画。中断概率指SINR低于某个门限比如-10dB的概率这个值下降得越明显说明无人机带来的可靠性增益越可观。项目的结论不能只说“覆盖变好了”而是要说覆盖率从多少提升到多少、中断概率从多少降低到多少。整个仿真架构分成六个模块参数配置、小区与基站生成、用户位置生成、信道计算、SINR结算、统计与可视化。每个模块单独写函数主脚本只做流程控制这样后面调参数、换场景都很方便。2. 六边形蜂窝网络建模与无人机部署策略2.1 六边形网格生成的两层核心规律在Matlab里生成19个六边形小区中心很容易掉进“硬编码坐标”的坑。我一开始也傻傻地把19个坐标手写出来结果改一下小区半径就得全部重来。正确的做法是找规律。六边形平铺有两个关键距离水平方向上相邻小区中心的间距是sqrt(3) * R垂直方向上相邻行的间距是1.5 * R。奇数行和偶数行在水平方向要错开sqrt(3)/2 * R。这个错位是无数新手第一次画蜂窝时画成矩形网格的原因。从中心小区出发第一圈6个邻居的方向角是0度、60度、120度……一直到300度距离都是sqrt(3) * R。第二圈12个小区一部分在0度、30度这样的角度上距离2 * sqrt(3) * R另一部分在后续角度上距离3 * R。与其逐个角度写不如用“宽度优先扩展”的算法从中心点开始把所有邻居坐标按距离和方向生成叠加去重。我下面这个函数就是用两层循环生成19个点核心思路是用角度步长60度和距离步长sqrt(3)*R再对第二圈做特殊处理function [centers, labels] generate_hex_grid(R, layers) % 生成layers层六边形蜂窝小区中心坐标 % 输入R为小区半径六边形顶点到中心距离layers为圈数 % 输出centers为Nx2矩阵labels为小区编号 dx sqrt(3) * R; dy 1.5 * R; centers [0 0]; % 中心小区 if layers 1 for k 0:5 ang k * pi / 3; centers [centers; dx * cos(ang), dx * sin(ang)]; end end if layers 2 for k 0:5 ang (k * pi / 3) pi / 6; d2 2 * dx * cos(pi / 6); centers [centers; d2 * cos(ang), d2 * sin(ang)]; end for k 0:5 ang k * pi / 3; centers [centers; 2 * dx * cos(ang), 2 * dx * sin(ang)]; end end labels (1:size(centers, 1)); end这段代码生成的坐标就是19个小区中心。注意第三段循环加的是第二圈中与第一圈同方向的小区距离为2倍的sqrt(3)*R第二圈靠角度偏移30度补齐的另外6个点则用d2计算。实际跑出来的点坐标是相对坐标要平移到真实经纬度或局部坐标系直接在后面加偏移量就行。生成网格后拿来画蜂窝边界也是个基本功。一个六边形顶点的角度序列是30度、90度、150度……用plot把顶点首位相连就能画出来。为了绘图效率我会把19个多边形都用patch画然后给每个小区标上编号。这样一眼就能看出无人机基站放在哪里。2.2 无人机基站高度与覆盖半径的权衡无人机作为空中基站最重要的一个参数是飞行高度。高度太低地面遮挡物容易挡住信号视距概率上不去高度太高自由空间路径损耗按距离的平方增加覆盖半径虽然变大了但远端信号强度会被压低。这里有一个经典的几何关系如果无人机在高度h、俯仰角为theta相对水平线的下倾角则覆盖圆的半径约为h * cot(theta)反过来想覆盖半径r高度至少得是r * tan(最小仰角)。最小仰角通常由链路预算和地形遮挡决定很多实测里取10到15度。我在仿真里一般把无人机高度设在600到1000米之间做参数扫描。900米高度在开阔场景下能覆盖半径约3到5公里的区域这个数字和实际应急通信案例基本对得上。需要提醒的是高度还要受空域管制和续航限制仿真里可以理想化但落到工程上必须折中。给无人机基站配置天线时我还习惯加一个“下倾角”变量模拟机械倾角或电子倾角。这个角度对覆盖范围的影响非常敏感倾角过大波束全打到脚底下远处覆盖会出空洞倾角过小能量方向图打成水平甚至上天地面覆盖半径反而变小。在Matlab里可以用简化的扇形波束模型逼近天线增益在俯仰维上呈高斯衰减偏离波束中心越远衰减越大。2.3 地面基站与无人机基站混合组网的配置方法这个项目里我设置了三种组网模式方便对比。模式一全部19个小区都用地面基站模式二中心小区的地面基站“失效”用一个无人机基站补上空缺模式三在部分边缘小区上空额外增加无人机基站与地面基站叠加覆盖。通过这种配置可以分开观察“替代断站”和“容量叠加”两类收益。具体在Matlab里我给每个小区维护一个结构体数组cellInfo包含字段type、pos、height、txPower、antennaGain。type0表示地面基站type1表示无人机基站。地面基站高度设为35米无人机高度设为800米发射功率都按30dBm左右设置。用户关联规则采用“最强接收功率”接入也就是遍历所有基站找到每个用户收到信号最强的那个作为服务基站其他基站计入干扰。3. Matlab实现核心代码逻辑3.1 用户撒点与小区归属判断用户随机撒点是覆盖统计的基础。最简单的方式是在整个区域的外接矩形内均匀撒点然后筛选出落在19个六边形并集内的点。但这样会浪费不少点。更高效的是在每个小区六边形内部独立撒点保证每个小区的用户数差不多。判断一个点是否在六边形内部我写了一个小函数用“点与六边形中心的距离和方向”来算把点转换到以六边形中心为原点的极坐标看对应方向上的六边形边界半径是否大于用户到中心的距离。因为正六边形有对称性我通常先把角度归一化到0到60度区间再计算边界半径function inside in_hexagon(x, y, cx, cy, R) % 判断点(x,y)是否在以(cx,cy)为中心、半径R的正六边形内 rx x - cx; ry y - cy; r sqrt(rx^2 ry^2); if r R inside false; return; end % 计算相对角度并归一化到[0, 60°) ang mod(atan2(ry, rx), 2*pi); sector mod(ang, pi/3); r_max R * cos(pi/6) / cos(sector - pi/6); inside r r_max; end注意这段代码里的r_max公式对于正六边形每个60度扇区内边界到中心的距离与角度有关从中心到顶点的方向是R从中心到边的法方向是R*cos(pi/6)。归一化到扇区内之后选择合适的参考角度就能算出该方向上的最大半径。在19个小区里撒点可以直接在主循环里遍历每个小区每个小区撒N_per_cell个用户。这样整体用户数量固定为19 * N_per_cell每个小区的样本数也均匀算出来的覆盖率置信度更稳。如果要模拟热点场景可以在部分小区内加撒高密度用户簇代码上就是多生成一组以热点中心为圆心的高斯分布点。3.2 路径损耗与信道模型信道模型决定仿真的可信度。地面基站到用户用的是经典的宏蜂窝模型PL 128.1 37.6 * log10(d_km) 单位dB频率约2GHz其中d_km是距离公里。这个模型隐含了非视距传播占主导的假设适合城区宏基站。无人机基站不一样它大概率与用户建立视距链路我用的是自由空间路径损耗加一个环境附加损耗PL_los 20 * log10(d) 20 * log10(f) 32.45 eta_losd单位是米f单位是GHzeta_los取1到3dB表示大气和天线馈线额外损耗。如果考虑非视距就直接用eta_nlos取20dB左右。为了更精细我会用3GPP提出的视距概率公式视距概率随距离增大而下降随无人机高度增大先上升后下降。在900米以下、开阔区域500米内视距概率接近0.9超过1公里后快速衰减。在Matlab里实现时可以用一个rand函数对每个用户随机判定是LOS还是NLOS再代入不同的损耗公式。最终接收功率统一转成dBmPrx_dBm Pt_dBm G_tx_dBi G_rx_dBi - PL_dB在代码里要维护每个用户到所有基站的接收功率矩阵Prx_matrix尺寸是用户数 × 基站数。这里面有个容易踩的坑如果你把发射功率写成瓦特路径损耗写成dB两者不能直接相减。我习惯全程用dBm和dB做加减只在最后需要计算噪声功率时用瓦特和毫瓦的换算。噪声功率按带宽计算比如10MHz带宽在290K温度下约为-104dBm。3.3 SINR计算与覆盖率统计有了接收功率矩阵SINR计算就简单了SINR Prx_dBm(服务基站) - 10*log10( sum(10^(Prx_dBm_other/10)) N0 )注意干扰功率在线性域求和再转回dB不能直接对dB数值求和。这是新手最爱错的地方我当年在同一列dBm值上直接按线性加总结果SINR偏低一大截检查好久才发现。服务基站选择用max(Prx_dBm)然后对每个用户记录服务基站编号、SINR值和距离。覆盖率统计就是threshold -6; % dB业务SINR门限 coverage mean(SINR_dB threshold);这里的mean天然就是覆盖率因为每个用户等权重。如果要分析边缘可靠性可以分别统计SINR小于0dB、小于-3dB、小于-10dB的用户比例。我还会记录这些边缘用户的服务基站类型看它们是不是被无人机基站“救”回来的。3.4 主脚本流程组织我会把整个仿真写成一个main_uav_cover.m流程是设置参数结构体params调用generate_hex_grid生成小区中心调用deploy_base_stations配置基站类型和高度调用generate_users撒用户调用compute_link_power计算所有链路的接收功率调用compute_sinr结算SINR调用plot_coverage_map画热图调用plot_cdf画SINR分布曲线输出指标表格。这样每个函数都可以单独测试。我强烈建议先给每个函数写一个assert或简单的数值校验比如generate_hex_grid跑完以后检查点数必须是19、两两小区中心的距离不能小于sqrt(3)*R。看似繁琐但在调参的时候能省出半天命。4. 仿真结果分析与覆盖增益4.1 三种部署场景的覆盖指标对比我以2GHz频率、10MHz带宽、小区半径500米、每小区20个用户为例跑了一组仿真不同场景的指标趋势如下表。先说明具体数值会随随机种子改变但它反映的规律是稳定的。场景平均SINR (dB)覆盖率(SINR-6dB)中断概率(SINR-10dB)19个地面基站8.286.3%4.7%中心基站失效无人机替代7.583.9%5.6%全部地面基站 2个无人机补盲9.192.5%2.3%全部地面基站 4个无人机补盲9.895.1%1.5%第一个结论是中心地面基站失效后单靠一个无人机替代平均SINR其实略降但覆盖率并没有崩掉。原因在于无人机在中心小区上空能提供较稳定的LOS覆盖但干扰范围也变大了对周围小区用户造成更多干扰。这说明“替代”不是无损的无人机位置和功率需要优化。第二个结论比较有价值在有地面基站的基础上额外增加无人机补盲覆盖率和中断概率都有明显改善。这符合实际应急通信里的做法——无人机不是用来替换而是用来增强和补盲。特别是边缘小区的用户它们原先受邻区干扰严重现在多了一个距离较近的高架基站SINR直接翻身。4.2 无人机高度扫描的规律我对额外增加的2个无人机基站做了高度扫描从300米到1500米每隔100米跑一次仿真。结果呈现明显的“倒U型”关系高度太低时遮挡和视距概率不足覆盖半径小高度太高时路径损耗增加信号强度下降同时干扰范围扩大边缘SINR反而变差。在我这个参数下最优点出现在800到1000米附近。这个结果其实是链路预算和几何覆盖互相拉扯的结果。高度升高覆盖半径近似线性增大但路径损耗中对数距离项也在增大当新增边缘用户的信号强度低于最低解调门限时覆盖半径就停止增长了。仿真里的最优高度和小区半径、发射功率、天线增益强相关不要直接照搬我的数字但扫描方法是通用的。这里还有个细节无人机高度对“可靠性”的影响更敏感。高度比较低时虽然平均SINR还行但遮蔽物背后的用户会突然跌落成盲点中断概率较高高度合适时视距概率提升中断概率显著下降。所以做参数选择时不应只看覆盖率也要看中断概率曲线取两者都能接受的区间。4.3 热图与CDF曲线的读法每次仿真结束我固定输出两张图。第一张是SINR热力俯视图x轴和y轴是位置颜色是SINR值。这张图能直观看到覆盖空洞在哪。无人机基站加进去之后原来边缘小区之间发暗的缝隙会变亮有些原本被建筑物遮挡的区域也恢复了“颜色”。第二张是全体用户的SINR CDF曲线。横轴是SINR纵轴是累计概率曲线整体越靠右越好。对比“纯地面”和“加无人机”两条曲线中间位置的差距就是典型用户获得的改善左边尾巴的差距则反映了可靠性提升。我建议读CDF的时候固定看两个点CDF50%处的中位数SINR以及CDF5%处的“最差用户SINR”后者对应急场景更有意义。5. 实操问题与避坑指南5.1 六边形网格生成最常见的三个错误第一个错误是角度单位混用。cos和sin在Matlab里默认输入弧度如果你写成cos(60)那算出来的是60弧度的余弦画出来整个网格就是歪的。解决办法是统一用pi/3表达60度。第二个错误是第二圈小区距离算错。很多人以为第二圈距离是第一圈的两倍实际上第二圈12个点里有6个点的距离是2*sqrt(3)*R另外6个是3*R。把坐标打印出来检查一下所有点到原点的距离只有三种值0、sqrt(3)*R、2*sqrt(3)*R、3*R。如果出现别的值说明生成逻辑有问题。第三个错误是在网格生成后画边界时每个六边形的顶点顺序没按逆时针或顺时针统一导致图形乱线。统一用0:60:360角度序列生成顶点就不会出错。5.2 信道模型参数的选择与验证信道模型参数直接决定了最终SINR绝对值。做研究性仿真时务必注明模型来源和适用频段。2GHz的宏蜂窝模型放到28GHz毫米波就不适用无人机在毫米波频段时遮挡衰减更严重必须换成3GPP TR 38.901的UAV信道模型。我常用的验证方法是“单链路手算”。固定一个用户把它放在小区边缘手算它到服务基站的距离、路径损耗、接收功率然后在Matlab里把同样参数的链路单独跑一遍看数值能不能对上。对不上就先查单位、查对数运算、查天线增益是dBi还是dBd。这一步只花十分钟能避免整个仿真白跑。还有一个容易忽略的点是基站天线增益的方向图。我一开始图省事所有基站都设置成相同的全向增益结果无人机基站的覆盖优势不明显。后来按空对地场景给无人机天线加了俯仰维衰减也就是“朝下的增益高水平方向的增益低”仿真效果才符合实际。全向天线对无人机并不合适因为能量被浪费在天空中。5.3 计算效率优化从循环到矩阵化19个小区每个小区20个用户总共380个用户基站23个直接三重循环也能跑完但如果要做100次蒙特卡洛就非常慢。我这里有两个优化建议。第一用户到所有基站的距离矩阵一次性算出来用repmat扩展坐标差然后sqrt算出距离矩阵尺寸是[用户数, 基站数]。不要用for i1:用户数去套内层for j1:基站数能用矩阵运算就不要循环。第二视距概率的判定也向量化。先生成一个与距离矩阵同尺寸的rand矩阵然后和LOS概率函数比较生成LOS/NLOS掩膜再按掩膜选择对应的路径损耗公式。这样整个信道计算就是几条矩阵运算的事速度能提升一个数量级。5.4 随机种子与蒙特卡洛的必要性单次仿真结果受用户随机位置影响很大有时覆盖率掉2到3个百分点你以为是算法问题其实是随机种子问题。正式做对比时我坚持跑100次蒙特卡洛每一次生成用户前用rng(shuffle)或固定多个种子混合。最后统计平均值和置信区间结论才站得住。如果不想跑100次至少在对比两个方案时使用相同的用户位置分布集合也就是先生成一份用户坐标所有方案共用。比如把用户坐标保存成users_19cell.mat每次加载同样数据。这样方案差异完全来自基站配置和信道模型不会混入用户随机的噪声。6. 扩展方向与实际部署经验6.1 从覆盖仿真到系统级优化的延伸这个项目跑通之后能做的扩展很多。最直接的是把无人机高度、水平位置、天线倾角作为优化变量用粒子群或者遗传算法搜索最优部署位置目标函数可以设为覆盖率最大化或中断概率最小化。Matlab自带的全局优化工具箱就够用不需要额外装包。再进一步可以引入“动态无人机网络”。无人机位置随着用户移动变化每个时隙更新一次部署这就是无人机的轨迹优化问题。学术界常用凸优化或强化学习来做但至少你得先把单时隙的部署优化跑稳再谈动态。还有一个很实用的扩展把无人机基站作为“回传受限节点”。无人机本身需要与核心网保持回传链路回传可能通过微波或卫星带宽有限。在仿真中给无人机基站的回传链路添加一个速率上限就能发现无人机虽然把SINR提高了但回传瓶颈反而限制了用户体验。这个点往往被初学者忽略但实际部署中极其关键。6.2 工程部署里比仿真更现实的约束仿真可以设无人机无限续航、无空域限制、无天气影响但真做外场实验时每一条都是硬约束。无人机留空时间通常在20到40分钟这意味着每隔一段时间就要降落换电池或充电。解决思路是采用多机轮换或者系留无人机通过地面电源持续供电后者更常用于应急通信车。空域管理也是一个绕不开的问题。在很多区域无人机飞行超过一定高度需要报备尤其是机场周边、城市密集区。所以仿真里那个800米最优高度真在实际场景中不一定能飞上去可能需要降到120米以下这时覆盖半径和视距概率都会缩水。做项目写论文时把这条限制写清楚反而显得踏实。天气的影响在仿真里完全没有体现但无人机抗风能力、降雨对毫米波信号衰减在工程里很现实。外场实验前最好查阅当地气象条件至少避免在雨天做大范围飞行测试。6.3 给后来者的一些实验建议如果你打算把这个项目作为毕设或者技术预研我建议分三步走。第一步先不要管无人机把19个六边形小区和地面基站的覆盖率跑出来检查是否正确。第二步加入一个无人机基站固定高度只对比覆盖率和热图变化这一步能让你快速理解空中基站的作用。第三步再去做高度扫描、多机部署和优化算法一步一步往前走不要一上来就整复杂模型。代码风格上多用结构体保存配置参数少用散落变量。以后复用的时候只需要改params.Height 800而不需要找每一处赋值。所有随机数生成的地方尽量用rng控制种子保证结果可复现。仿真是拿来辅助分析的工具不是目的把每个中间结果都理解清楚后面换任何场景都能快速上手。我在实际跑这个项目的过程中最大的体会是无人机空中基站对覆盖可靠性的提升不在于“信号更强”而在于“最差用户不那么差了”。做应急通信仿真别只盯着平均SINR好看真正救命的指标是中断概率是CDF曲线左边那5%的用户。建议你跑完仿真之后专门把那些处于最差SINR区间的用户挑出来看看它们分布在哪里被哪个基站服务。往往你会发现最差的用户不是离基站最远的那批而是离两个地面基站差不多远、频繁切换的“夹缝用户”。无人机一旦悬停在这些夹缝上方改善幅度立竿见影。这个观察比单纯提高所有用户平均覆盖率更有工程价值。代码本身不复杂复杂的是建模时做了哪些取舍、仿真里暴露了哪些规律。把这个项目的核心逻辑吃透后面无论是扩展成多无人机协同、轨迹优化还是加入真实信道模型都会顺很多。
返回列表