密集城区无人机U2G路径损耗预测:建模与Matlab仿真
做无人机通信链路预算的朋友几乎都撞过同一堵墙——地面蜂窝信道模型在离开地面几百米后越来越不靠谱而纯自由空间模型又把密集城市想得太简单。我去年做某个低空巡检项目时需要在密集城区评估一架无人机到地面测站的空对地U2G路径损耗最开始直接拿地面宏站的链路预算改了改参数结果实测接收电平和预测值差了将近20dB。后来把城市建筑分布、飞行仰角和视距/非视距概率全部纳入模型误差才压到可以接受的范围。这篇东西就是那次重做的完整记录密集城市环境下的U2G路径损耗为什么会跳变、怎么选模型、以及一套可以直接跑的Matlab仿真代码和踩坑经验。1. 密集城市环境下的U2G信道问题的本质与难点1.1 为什么地面信道模型在无人机场景里容易失真地面蜂窝系统里基站高度一般固定在25到40米手机终端贴着地面信道特征主要由地面散射体决定所以那些经典信道模型从统计上刻画的是低基站、低终端的传播条件。无人机一升空情况就变了飞机可能飞到80米、120米甚至200米天线高度远超传统基站地面终端仍然只有一两米。这个高度差带来的不是简单的参数平移而是传播机制的变化。具体来说高度差会带来三个直接后果。第一链路仰角变大地面一阶反射区收缩菲涅尔区更多地暴露在建筑屋顶上方电磁波的主要绕射体从街角变成屋顶边缘。第二一阶反射面从地面转向建筑立面密集城市里大量玻璃幕墙和金属外墙让反射特性变得非常复杂。第三地面蜂窝模型里常用的对数正态阴影衰落参数在几十米到几百米的高度区间内不再稳定因为遮挡体的大小和位置完全变了。所以你会发现用地面宏站模型去预测U2G链路结果往往偏乐观或者偏悲观取决于你抄的是哪个场景的参数。偏乐观是因为地面模型里基站高度不高阴影衰落方差往往取8到10dB而无人机一旦越过屋顶线阴影衰落会明显变小偏悲观是因为很多人直接把地面模型的建筑穿透损耗套进去但无人机链路很多时候是经过屋顶绕射而不是穿墙两者衰减量级根本不是一回事。1.2 城市峡谷中的LoS/NLoS切换才是核心矛盾密集城市和普通城市最大的区别不是楼更高而是街道窄、楼距密、高度杂乱。日本东京那种地方一栋40米楼旁边可能就是一栋90米楼街道宽度可能只有12到18米。这种几何结构会让U2G链路出现非常剧烈的LoS/NLoS状态切换。举个例子无人机在80米高度沿着一条东西向街道飞行地面终端站在十字路口附近。无人机正对街道轴线时链路大概率处于LoS状态路径损耗接近自由空间加小量余量无人机被一栋60米的楼挡住时链路立刻变成NLoS损耗瞬间抬升15到25dB等它绕过楼顶边缘重新进入街道开敞区损耗又跳回来。这种跳变不是慢衰落而是一种准确定性的几何遮挡效应用纯随机统计模型很难刻画准确。更麻烦的是密集城市里这种LoS/NLoS切换在时间轴上非常频繁。无人机巡航速度通常15到20m/s一秒钟内可能穿越好几个遮挡边界。链路预算如果只用一个平均损耗值根本解释不了接收机上的电平抖动只有把航迹上的逐点LoS状态都解算出来才能还原真实的接收功率变化曲线。1.3 不同飞行高度下信道特征其实是三段式还有一个容易忽略的问题U2G链路不能只看巡航高度。一架无人机从地面起飞到进入巡航高度再到降落仰角、遮挡状态、地面反射贡献都在连续变化可以粗略切成三个阶段。起飞和降落段通常低于50米无人机还在建筑群内部四周都是遮挡链路以NLoS为主路径损耗大且对位置极其敏感稍微偏一两个身位损耗可能差出10dB。这个阶段如果用固定高度模型去估计误差会非常大。巡航段80到120米如果无人机高度明显高于周边平均建筑高度LoS概率显著上升遮挡主要来自个别超高楼和塔吊损耗曲线开始向自由空间形态靠拢但仍存在偶发的深衰落。超高空段200米以上链路基本稳定在LoS状态多径和阴影影响都变小这时候反而可以用自由空间加小量余量的简化模型。所以在选择模型之前先想清楚你要仿真的是哪个阶段。不同高度段对应不同的建模策略一个模型打天下的思路在U2G场景里几乎走不通。这也是我写这套Matlab仿真时特意把高度作为可遍历参数而不是固定常数的原因。2. 模型选型概率LoS、确定性遮挡和标准模型怎么配合2.1 概率LoS模型的数学骨架与参数含义U2G路径损耗建模目前工程上最常用的是概率LoS模型。它不试图精确判断某一时刻链路是否被遮挡而是根据无人机与地面终端之间的仰角给出LoS概率的统计估计然后对LoS和NLoS两种状态下的路径损耗做期望加权。概率LoS的计算式可以写成P_LoS 1 / (1 a * exp(-b * (theta - a)))其中theta是链路的仰角单位是弧度a和b是与传播环境相关的参数。需要注意这里指数内外的两个a只是写法习惯工程上最好把第一个叫A第二个叫theta_offset不然代码里很容易混淆。典型参数如下表环境类型Abtheta_offset近似值郊区4.880.430.1-0.2 rad一般城市5.020.090.12 rad左右密集城市9.610.160.16 rad左右这些数值来自大量城市传播测量的统计拟合不是拍脑袋定的。密集城市A值大说明在低仰角情况下LoS概率被压得很低因为高楼遮挡概率大b值决定概率随仰角上升的速率b越大越干脆低仰角几乎全是NLoS过了某个仰角就迅速切到LoS。拿到P_LoS之后路径损耗按期望计算PL P_LoS * PL_LoS (1 - P_LoS) * PL_NLoS其中PL_LoS和PL_NLoS都以自由空间损耗为基准分别加上各自的附加损耗。自由空间损耗的经典形式是PL_fs 20 * log10(4 * pi * d * fc / c)d是三维距离fc是载波频率c是光速。LoS状态附加损耗小一般1到3dBNLoS状态附加损耗大密集城市里20到30dB都不奇怪。这个模型的好处是解析形式简单适合做链路预算和参数扫描缺点是没有场景几何信息同一组参数在两条不同的街道上预测结果完全一样。2.2 确定性遮挡判定什么时候必须上场景级仿真概率LoS模型算链路预算很快但如果你手里已经有城市的建筑矢量数据或者数字高程模型再只靠统计期望就有点浪费了。更精细的做法是用几何射线判定把地面终端位置和无人机位置连一条直线沿直线逐点检查建筑高度是否高于射线上对应点的高度。只要有一个采样点被建筑挡住就判定为NLoS。这种确定性判定在无人机航迹规划里很实用。它能准确告诉你飞到哪个位置链路会断、转弯绕过一个楼角之后LoS会不会恢复、沿着哪条路径飞能保持全程覆盖。代价是需要构建建筑高度地图并且每条链路都要做一次射线遍历计算量比概率模型大一到两个数量级但在几百米的小范围场景里完全可接受。我的建议是两层配合大范围网络规划用概率LoS模型快速扫得到覆盖趋势和候选航迹到了具体航线设计阶段再用确定性遮挡判定逐点确认链路状态。光靠一层要么太粗要么太慢。2.3 标准组织提出的U2G简化模型除了概率LoS模型移动通信标准化组织在无人机信道专题研究里也给出了一套U2G链路路径损耗的简化表达式思路和LoS/NLoS二分一致但公式形态更贴近实际协议设计。视距条件下常见的表达是PL_LoS 28.0 22 * log10(d_3d) 20 * log10(fc_GHz)这里d_3d是三维距离单位米fc_GHz是载波频率单位GHz。非视距条件下则采用取大值结构即PL_NLoS取自由空间类损耗加上一段偏移与某个下限值做比较取较大的那个。这类模型的好处是有明确的场景定义城市微蜂窝、城市宏蜂窝等拿来就可以用不用自己拟合参数。我一般用它来做概率LoS模型结果的交叉验证如果两种模型在同一高度、同一距离下给出的路径损耗相差超过5dB那就要回头检查参数设置是不是出了问题。2.4 频率和高度对模型适配的影响选模型的时候频率和高度两个参数的适配范围必须提前确认。概率LoS模型里的a、b参数大多是在2GHz到6GHz频段、高度150米以下拟合出来的如果你要仿真28GHz毫米波或者250米的超高空链路直接套参数就不太合适。频率变化的影响主要有两条。第一自由空间损耗本身随频率上升而增大在同样距离下5.8GHz比2.1GHz多出约8.7dB。第二NLoS附加损耗随频率上升而增大因为高频电磁波的绕射能力弱建筑遮挡后的衰减更严重。仿真时如果想保守一点NLoS附加损耗在毫米波频段可以上调5到10dB。高度变化的影响更微妙。无人机高度从60米升到120米链路仰角变大LoS概率提高损耗曲线整体下移但如果你用的是确定性遮挡判定结果还和具体建筑高度分布强相关。所以做参数扫描时我会把高度、频率分别遍历而不是只取一组固定值看单条曲线。3. Matlab仿真实现从建筑地图到路径损耗曲线3.1 仿真场景参数与坐标系定义这套Matlab仿真的目标很简单在500米乘500米的密集城市样区里让一架无人机沿固定航线飞行地面终端固定在一个路口逐点计算U2G路径损耗并绘图。坐标系采用局部直角坐标单位米分辨率定为5米。主要参数如下%% 基础参数 fc 2.1e9; % 载波频率 2.1 GHz c 3e8; % 光速 m/s hUAV 80; % 无人机飞行高度 m hRx 1.8; % 地面接收机高度 m res 5; % 建筑地图网格分辨率 m mapSize 500; % 仿真区域边长 m uavPos [250, 250, hUAV]; % 初始悬停点后面会遍历航迹 rxPos [150, 150, hRx]; % 地面终端位置网格分辨率取5米是权衡后的结果太细1米会让LoS判定的射线采样数量激增太粗10米会漏掉一些窄楼和间隙。如果场景里有特别窄的巷子建议局部加密到2米。地面终端高度取1.8米模拟手持终端或便携测站。3.2 生成建筑高度地图密集城市的建筑分布不是完全随机的而是按街区成块出现。我用街区方式生成把500米区域划分成60米乘60米的街区每个街区以一定概率生成一栋建筑建筑高度在12到45米之间随机。这样比纯随机点阵更像真实城市也能复现街道峡谷结构。%% 生成建筑高度地图 rng(42); % 固定随机种子保证结果可复现 blockSize 60; % 街区尺寸 m maxBuildH 45; % 最高建筑 m minBuildH 12; % 最低建筑 m buildProb 0.85; % 街区出现建筑的概率 xGrid 0:res:mapSize; yGrid 0:res:mapSize; [Xmap, Ymap] meshgrid(xGrid, yGrid); Hmap zeros(size(Xmap)); for bx 0:blockSize:mapSize for by 0:blockSize:mapSize inBlock Xmap bx Xmap bx blockSize ... Ymap by Ymap by blockSize; if rand buildProb Hmap(inBlock) minBuildH (maxBuildH - minBuildH) * rand; elseif rand 0.5 Hmap(inBlock) 4; % 低矮裙房或临时建筑 end end end注意rng(42)这句固定随机种子非常重要。同样的代码不固定种子每次跑出来的建筑地图都不一样结果无法对比。我在调试阶段吃过这个亏上午跑出一组很漂亮的曲线下午再跑完全对不上后来才发现是随机种子没固定。3.3 LoS判定函数与路径损耗计算有了建筑高度地图就可以写LoS判定函数。原理是把地面终端和无人机之间的三维连线离散采样检查每个采样点所在网格的建筑高度是否高于这条线在该点的垂直高度。function flag isLoS(Hmap, res, p1, p2) % 判断三维点 p1 到 p2 之间是否有建筑遮挡 % p [x, y, z]单位米 d3 sqrt(sum((p2 - p1).^2)); nSamples max(ceil(d3 / (res / 2)), 10); t linspace(0, 1, nSamples); for i 1:length(t) px p1(1) t(i) * (p2(1) - p1(1)); py p1(2) t(i) * (p2(2) - p1(2)); pz p1(3) t(i) * (p2(3) - p1(3)); ix round(px / res) 1; iy round(py / res) 1; if iy 1 iy size(Hmap, 1) ... ix 1 ix size(Hmap, 2) if Hmap(iy, ix) pz flag false; return; end end end flag true; end这里采样步长取res/2也就是2.5米比网格分辨率更密一点避免采样点恰好落在网格边界上漏判。如果采样步长等于网格分辨率射线贴着建筑边缘掠过时容易产生似是而非的误判加密采样能显著降低这种情况。路径损耗计算函数按LoS/NLoS分别处理。LoS状态下在自由空间基准上加一个小量余量模拟大气和微弱多径NLoS状态下加一个基础附加损耗并随距离增加一点额外斜率模拟绕射和反射损耗的累积效果。function [PL, LoSflag] U2G_PL(fc, d3, LoSflag) % U2G路径损耗计算简化经验式 c 3e8; PLfs 20 * log10(4 * pi * d3 * fc / c); if LoSflag PL PLfs 1.2; else PL PLfs 18 0.02 * max(0, d3 - 30); end end那个18dB的NLoS基础附加损耗来自我当时的经验值密集城市里砖混和玻璃幕墙混合环境大致在这个量级。如果你在做更严肃的工程评估建议把这个值换成标准信道模型给出的对应值或者用实测数据反算。0.02*(d3-30)这一段是让NLoS损耗在远距离时缓慢走高模拟距离增大后多跳路径贡献变弱、主绕射路径损耗增加的趋势。3.4 无人机航迹计算与可视化主程序里让无人机沿x250这条竖线从南向北飞每10米取一个计算点逐点调用LoS判定和路径损耗计算最后绘制路径损耗随水平距离变化的曲线。%% 航迹计算 uavX 250; uavY 0:10:mapSize; PL_series zeros(size(uavY)); LoS_series false(size(uavY)); for k 1:length(uavY) uavPos [uavX, uavY(k), hUAV]; d3 norm(uavPos - rxPos); LoS_series(k) isLoS(Hmap, res, rxPos, uavPos); [PL_series(k), ~] U2G_PL(fc, d3, LoS_series(k)); end %% 画图 figure; plot(uavY, PL_series, b-, LineWidth, 1.5); xlabel(无人机水平距离 (m)); ylabel(路径损耗 (dB)); grid on; hold on; plot(uavY, 20*log10(4*pi*vecnorm([ones(size(uavY))*uavX; uavY - rxPos(2); ... ones(size(uavY))*(hUAV-hRx)], 2, 1) * fc / c), r--); legend(U2G仿真结果, 自由空间基准);红色虚线是自由空间损耗基准用来对照一眼就能看出哪些航段被建筑压制。可视化这一步非常有价值否则你光看一组数字很难定位哪个位置开始进入深衰落。我建议在调试阶段一定画出曲线不要只打印数值。4. 仿真结果分析与工程解读4.1 基本场景中的损耗波动规律在hUAV80米、fc2.1GHz、接收机固定在(150,150)的条件下仿真结果和直觉基本吻合无人机从远处飞来时路径损耗整体随距离减小而下降但曲线不是平滑的而是密集的锯齿状波动。凡是进入NLoS航段损耗会比自由空间高18到20dB以上一旦恢复LoS损耗又回落到自由空间附近。这种波动在工程上意味着什么如果你在做链路预算用中值损耗去设计功率余量就必须额外留出至少15到20dB的衰落余量否则无人机在特定航段会出现周期性断链。如果你在做航迹规划这条曲线能直接告诉你哪些位置是覆盖凹坑绕开它们比提升发射功率更省成本。我把接收机换到另一个路口后波动模式立刻变了。同一个无人机高度、同一个频率仅仅因为地面终端位置不同NLoS航段的占比就从三成变成六成。这进一步说明密集城市U2G链路对几何关系极其敏感任何脱离具体场景的平均路径损耗结论都只能用作粗估。4.2 高度和频率的对比实验把hUAV分别设为40米、80米、120米其他参数不变三条损耗曲线放在一起看差异非常明显。40米高度时无人机基本还在建筑群内部飞链路大部分时间处于NLoS损耗基线整体抬高波动幅度也大偶尔才在街道空隙里短暂恢复LoS。80米高度时无人机正好处于屋顶线附近只要能越过周边楼顶损耗就明显回落但仍然存在被超高楼遮挡的深衰段。120米高度时多数航段都能维持LoS损耗曲线明显向自由空间贴拢。这说明了一个经验规律在密集城区无人机巡航高度至少要高于周边平均建筑高度15到20米才能获得稳定的准LoS信道。等于说飞得越高信道不一定越好但至少LoS概率显著上升。频率对比更直白。在同样的80米高度下把fc从2.1GHz换成5.8GHz自由空间基准抬高约8.7dBNLoS附加损耗也变大。两个频率的LoS状态判定完全相同因为遮挡是几何问题和频率无关但NLoS航段的损耗会比低频再多出几个dB。如果你的系统必须用5.8GHz规划航迹时躲开遮挡就变得更加重要。4.3 热力图与链路状态的可视化除了单条航迹把无人机悬停在一个固定点遍历地面网格每个点作为终端位置就能画出一张覆盖热力图。无人机悬停在区域中心(250,250,80)计算整个500米区域内每个网格点的路径损耗用颜色深浅表示损耗大小。这张热力图的典型特征是正对街道开敞方向的区域损耗低建筑背阴侧和窄巷内部损耗高热力图呈现明显的街道峡谷条纹。如果无人机提高高度热力图的低谷区域会明显扩展但楼间距特别窄的巷子仍然会是深衰带。绘制热力图的关键是将LoS判定和路径损耗计算都向量化或者至少用parfor循环并行加速。500米区域、5米分辨率有101乘101个网格点每个点调用一次isLoS函数串行跑大约一两分钟可以接受如果用1米分辨率网格数膨胀25倍建议先粗扫再局部细算不要一口气跑全图。5. 踩坑记录参数、数值与工程细节5.1 仰角公式里的弧度陷阱概率LoS模型里仰角用的是弧度但很多入门资料会把仰角写成度数最坑的是公式里a和b参数本来按弧度拟合你拿度数代进去P_LoS曲线直接变成阶跃或恒值。第一次跑的时候我拿theta60度、90度去算出来的LoS概率几乎全是1完全失效折腾了半天才发现是弧度单位问题。所以在代码里我习惯明确写theta atan2(hUAV - hRx, d2d); % 弧度 P_los 1 ./ (1 A * exp(-B .* (theta - theta0)));不要在任何地方把theta乘以180/pi除非你重新拟合了一组以角度为单位的参数。这是U2G仿真里最便宜的坑但踩的人真不少。5.2 概率LoS模型的边界与局限概率LoS模型在仰角0到90度范围内形态漂亮但工程上要清楚它的边界。第一它只是统计平均无法体现具体街道走向、楼群遮挡的细节第二它的a、b参数在不同文献里差异很大同样是密集城市有人用(9.61, 0.16)有人用(12.08, 0.11)预测出来的LoS概率在中等仰角下可能差出15个百分点。如果你只是做粗略覆盖估算概率模型够用但如果要评估某条具体航线的断链风险我强烈建议叠加确定性遮挡判定。概率模型告诉你这一段大概有70%概率是LoS确定性模型直接告诉你这一段哪些位置是LoS、哪些不是后者才是工程决策需要的信息。5.3 建筑高度分布对结果的敏感性仿真结果对建筑高度分布极其敏感这是整轮调试里最让我意外的一点。把建筑高度范围从12到45米改成20到80米后80米巡航高度下的LoS占比大幅下降原因是大量建筑尖顶直接顶在航线高度附近稍微有一点水平偏差就会撞上遮挡。反过来如果建筑高度范围压到10到30米80米高度下的LoS占比会高到接近郊区场景。这说明一个关键工程要求仿真前必须确认建筑高度概率分布来自实际数据或者合理的城市形态假设不能随手填一个范围。很多论文里的参数看似严谨换个城市可能就是错的。如果拿不到详细建筑矢量数据至少应该用当地规划部门公开的限高和容积率信息做粗略估计。5.4 网格分辨率与运行效率的平衡网格分辨率从5米改成2米LoS判定结果会有一些细微变化尤其是建筑边缘的斜射路径。但分辨率提高带来的计算量上涨是立方级的分辨率网格点数量500m区域单航迹计算点全图热力图耗时估算10m51x5151几十秒5m101x1011011-3分钟2m251x25125110分钟以上1m501x501501半小时以上我的习惯是先用10米分辨率做参数扫描锁定大致趋势再用5米分辨率做正式结果最后对关键航段用2米分辨率单独验证。一上来就追求1米分辨率只会把大量时间浪费在等仿真上而且改一次参数就要重跑一轮效率太低。6. 后续扩展思路6.1 从静态航迹到动态信道模拟目前这套代码是静态逐点计算没有时间概念。实际工程中无人机沿着航迹飞行链路状态每时每刻都在变。把航迹描述成一个时间序列在每个时间步更新无人机位置重新计算LoS状态和路径损耗就能画出接收功率随时间变化的曲线进一步统计中断概率、深衰落持续时间等指标。动态化的关键是要设定合理的时间步长。以20m/s飞行速度、5米分辨率地图为例每个时间步控制在0.1到0.2秒比较合适太粗会丢失遮挡切换的细节太细计算量又浪费。6.2 与地面基站干扰分析的结合U2G路径损耗不只是用来算覆盖它也是干扰分析的基础。如果你在规划低空无人机通信网络地面上同时存在多个基站或地面终端无人机到每个地面节点的路径损耗都要单独计算然后叠加干扰。把本文的路径损耗计算函数封装成接口输入一个地面节点坐标就返回损耗值后面做干扰矩阵会非常顺手。具体扩展时建议把isLoS和U2G_PL都改成可以批量调用输入无人机位置数组和地面节点位置数组输出损耗矩阵。Matlab里用两层循环跑几百个节点没问题但超过几千条链路就要考虑并行化或向量化。6.3 与射线追踪工具校验概率LoS模型的参数再怎么调也是统计近似。密集城市里某些复杂几何结构比如天桥、高架、玻璃幕墙连廊会带来非常规的反射路径这些是简单遮挡判定看不到的。如果项目对精度要求高可以用射线追踪工具做离线校验选取若干典型基线分别用本文模型和射线追踪计算对比每个测点的损耗偏差反过来修正a/b参数或NLoS附加损耗。我自己做过一次这样的校验发现概率模型在校验点上的平均偏差大概4到6dB个别深衰点偏差超过10dB。这说明统计模型适合趋势评估但关键节点的精细化预测还是绕不开更精确的工具。做U2G信道仿真这些年我最大的体会是模型不是越复杂越好而是越匹配你的决策精度需求越好。快速链路预算用概率LoS模型具体航线评估用确定性遮挡判定追求极致精度就上射线追踪。手里这套Matlab代码的价值恰恰在于它把前两层串在了一条流水线上——从建筑地图到LoS判定再到路径损耗曲线每个环节都能单独替换、单独验证。如果你也正在做类似的低空覆盖规划不妨先跑通这条流水线再一步步往里加自己的场景数据。