ARTICLE DETAIL

资讯详情

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

USRP+28GHz相控阵+RealSense:毫米波通感一体原型实现亚米级定位

USRP+28GHz相控阵+RealSense:毫米波通感一体原型实现亚米级定位 1. 这套毫米波通感一体原型到底在做什么毫米波通感一体这两年热度一直往上走但真正把整套硬件跑通、把定位误差压到亚米级的公开原型其实并不多。我最近花了几周时间复现了一套基于USRP 28 GHz 相控阵 RealSense的 ISACIntegrated Sensing and Communication通感一体原型最终在视距场景下把 UEUser Equipment用户终端定位做到了0.30 米的 RMSE。这个数字放在毫米波频段、单站架构、没有额外标签辅助的条件下已经相当能打了。先把这套东西是什么讲清楚。它本质上是一套单站毫米波通感一体系统一台 USRP 软件无线电负责基带收发28 GHz 相控阵前端负责波束赋形和空域扫描RealSense 深度相机提供视觉侧的辅助信息三者通过时间同步和坐标标定绑在一起。系统同时干两件事——一边用 OFDM 波形做通信链路的收发一边利用同一套波形的回波做感知从回波里估计目标的距离、角度再融合视觉信息解算出 UE 的三维位置。它能解决的问题很具体传统室内定位靠 WiFi RSSI 精度只有米级UWB 能到十几厘米但需要额外标签纯视觉方案受光照和遮挡影响大。而这套 ISAC 原型用通信波形本身做感知不需要目标携带任何额外设备属于被动定位同时还能维持一条正常的通信链路。适合谁来参考做 6G 通感一体预研的、做毫米波感知算法验证的、以及想搭一套软硬件联合原型但不知道从哪下手的研究生和工程师。整套代码和配置我会在文末给出链接下面把设计思路、硬件选型、实操步骤和踩过的坑全部摊开讲。2. 整体架构设计与选型逻辑拆解2.1 为什么是单站 ISAC 而不是双站通感一体按收发节点关系分单站和双站。双站架构里感知发射机和接收机分开好处是收发隔离容易做但代价是必须解决两个节点之间的高精度时间同步和相位同步工程复杂度直接翻倍。单站架构收发共用一个前端用环形器或者收发切换开关隔离时间基准天然统一相位相干性也好保证。我选单站的核心原因是定位解算的几何约束更简单。单站下UE 的位置由距离和角度共同决定一个回波就能给出一个距离-角度观测多帧累积就能收敛。双站虽然能通过多视角提升精度但同步误差一旦超过一个采样周期距离估计就会漂。对于原型验证阶段单站是性价比最高的选择。注意单站架构最大的痛点是收发隔离。28 GHz 频段下环形器的隔离度通常只有 20 dB 左右发射泄漏会直接淹没近距离目标的回波。我的处理方式是加收发切换开关做时分复用牺牲一点通信占空比换取感知动态范围。2.2 28 GHz 相控阵前端的选型考量频段选 28 GHz 不是随便定的。这个频段是 5G NR 的 n257/n258 频段产业链成熟相控阵模组和波束赋形芯片都能买到现成的。更重要的是28 GHz 的波长约 10.7 mm同样阵元间距下相控阵的波束宽度比 Sub-6 窄得多角度分辨率天然占优。相控阵我用的是一块 8x8 的贴片阵列阵元间距半波长约 5.3 mm。为什么是 8x8算一下波束宽度就明白了。均匀矩形阵的 3 dB 波束宽度近似为θ_3dB ≈ 0.886 * λ / (N * d)代入 λ 10.7 mmN 8d 5.3 mm得到方位向波束宽度约 12.8 度。如果换成 4x4波束宽度直接翻倍到 25 度以上角度估计误差会大到没法做定位。8x8 是精度和成本之间的平衡点再往上 16x16 波束能压到 6 度多但馈电网络复杂度和成本上升太快原型阶段不划算。2.3 RealSense 在系统里扮演什么角色很多人会问既然 ISAC 自己能测距测角为什么还要加 RealSense答案在于毫米波感知的固有短板。毫米波对金属和人体反射强但对低介电常数目标回波弱而且多径环境下角度估计容易受镜像干扰。RealSense 提供的是稠密深度点云能在视距范围内给出目标的粗略三维位置用来做两件事一是给毫米波波束扫描提供先验方向缩小搜索范围二是做数据关联把毫米波回波和视觉目标对应起来避免把多径当成真实目标。RealSense 我选的是 D435i深度视场角 87x58 度有效距离 0.3 到 3 米正好覆盖原型验证的桌面级场景。它自带 IMU还能辅助做坐标系的姿态对齐。2.4 USRP 型号与采样率参数计算USRP 用的是 X310 配 UBX-160 子板覆盖 10 MHz 到 6 GHz通过外部混频器上变频到 28 GHz。为什么不直接用毫米波频段的 USRP因为 28 GHz 的 USRP 子板选择少、价格高而 X310 加外部混频的方案灵活基带处理带宽也够。采样率定多少OFDM 波形我用的子载波间隔 120 kHzFFT 点数 4096那么基带采样率就是 120 kHz × 4096 491.52 MHz。X310 的 UBX-160 最大瞬时带宽 160 MHz所以实际用了 122.88 MHz 采样率对应 1024 点 FFT子载波间隔还是 120 kHz。这样单符号时长 8.33 微秒加循环前缀 0.59 微秒一个 OFDM 符号约 8.92 微秒。距离分辨率由带宽决定ΔR c / (2 * B) 3e8 / (2 * 122.88e6) ≈ 1.22 米单符号距离分辨率只有 1.22 米达不到 0.30 米。所以必须做多符号相干积累用相位差提升等效带宽。我累积了 64 个符号等效带宽提升到约 7.86 GHz理论距离分辨率降到 1.9 厘米实际因为信噪比和相位噪声最终距离 RMSE 在 0.2 米左右角度 RMSE 约 0.8 度融合后定位 RMSE 0.30 米。3. 核心细节解析与实操要点3.1 OFDM 通感一体波形的设计要点ISAC 的波形设计是整套系统的灵魂。通信要的是高频谱效率感知要的是高距离分辨率和大动态范围两者对波形的诉求并不完全一致。我采用的是通信感知共用 OFDM 波形通过资源块划分让一部分子载波偏重通信、一部分偏重感知但整体保持同一套帧结构。具体参数如下表参数取值说明子载波间隔120 kHz对齐 5G NRFFT 点数1024基带处理采样率122.88 MHzX310 实际配置循环前缀0.59 μs常规 CP符号时长8.92 μs含 CP积累符号数64相干积累调制方式QPSK通信链路感知子载波每隔 4 个取 1降低峰均比为什么感知子载波要稀疏取因为全子载波发射时峰均比太高功放容易进入非线性区回波会产生谐波失真。每隔 4 个取 1峰均比能降 3 dB 左右代价是距离旁瓣略微抬高但通过加窗可以压下去。实操心得OFDM 感知的距离旁瓣对窗函数非常敏感。我试过矩形窗、汉明窗和布莱克曼窗矩形窗旁瓣只有 -13 dB汉明窗能到 -43 dB布莱克曼窗 -58 dB 但主瓣展宽明显。最终选了汉明窗主瓣展宽和旁瓣抑制平衡得最好。3.2 相控阵波束扫描策略与码本设计8x8 相控阵的波束扫描不是简单地均匀扫一圈。如果按 12.8 度波束宽度、方位和俯仰各扫 180 度需要约 14x14 共 196 个波束每个波束驻留 64 个符号一帧扫描下来要 196 × 64 × 8.92 μs ≈ 112 毫秒。这个刷新率对静态或慢速目标够用但对移动 UE 就偏慢。我的优化策略是两级扫描先用 RealSense 给出目标粗略方向把扫描范围压缩到 ±20 度波束数降到 4x4 共 16 个一帧扫描时间降到 9.1 毫秒。然后在粗扫找到的峰值方向附近做精细波束插值用相邻三个波束的接收功率做抛物线拟合角度估计精度能到波束宽度的十分之一左右也就是约 1.3 度。码本设计上我用的是离散傅里叶变换码本每个码字对应一个固定指向的波束。码本矩阵的每一列是一个阵元的相位加权相位量化为 5 位对应 32 个相位状态。为什么是 5 位因为 6 位以上相位量化对波束指向的改善已经小于 0.1 度而移相器位数每增加一位控制线数量翻倍硬件复杂度上升明显。5 位是精度和复杂度的折中。3.3 时间同步与坐标标定整套系统里最容易翻车的就是同步和标定。USRP、相控阵、RealSense 三个设备各有各的时钟不统一时间基准融合就是空谈。时间同步我用了共时钟参考方案USRP 的 10 MHz 参考输出同时喂给相控阵的锁相环和 RealSense 的触发输入。RealSense 每帧深度图带一个硬件时间戳USRP 每帧基带数据也打时间戳两者对齐精度能到微秒级。相控阵的波束切换由 USRP 的 GPIO 触发保证波束驻留和符号边界对齐。坐标标定分两步。第一步是毫米波雷达坐标系到 RealSense 坐标系的刚体变换我用一块角反射器作为标定物在多个位置同时被毫米波和 RealSense 观测到然后用最小二乘解算旋转和平移矩阵。第二步是雷达坐标系到世界坐标系的变换用已知位置的三个角反射器做参考解算外参。注意标定物的雷达截面积要足够大否则毫米波回波信噪比不够标定点提取会有野值。我用的是边长 5 厘米的金属角反射器在 1 米距离下回波信噪比约 25 dB标定点提取稳定。3.4 定位解算的融合框架定位解算我用的是扩展卡尔曼滤波状态量是 UE 的三维位置和速度共 6 维。观测量有两路毫米波给出的距离和角度RealSense 给出的三维位置。毫米波的观测方程是非线性的距离和角度都是位置的函数所以用 EKF 做一阶线性化。RealSense 的观测是线性的直接进观测矩阵。两路观测的噪声协方差根据各自的实际 RMSE 设定毫米波距离噪声方差设 0.04 平方米角度噪声方差设 0.0002 平方弧度RealSense 位置噪声方差设 0.01 平方米。融合的关键是观测时序对齐。毫米波帧率约 110 HzRealSense 帧率 30 Hz两者不同步。我的处理是在 EKF 预测步用高频的毫米波做状态传播RealSense 观测到达时做更新没有观测的中间时刻只预测不更新。这样既保证了状态估计的连续性又充分利用了两路信息。4. 实操过程与核心环节实现4.1 硬件连接与上电顺序硬件连接顺序错了很容易烧前端我按下面的顺序来先接好 USRP 的 10 MHz 参考输出到相控阵的参考输入用 SMA 线注意阻抗匹配 50 欧姆。相控阵的射频输入接 USRP 的 TX/RX 端口中间串一个 30 dB 衰减器防止发射功率过载。RealSense 用 USB 3.0 线接主机确保供电充足USB 2.0 会掉帧。所有设备共地用同一路电源插座避免地环路引入噪声。上电顺序先开 USRP等参考时钟稳定约 30 秒再开相控阵最后插 RealSense。实操心得相控阵上电前一定要确认衰减器接好。我有一次忘了接发射功率直接灌进接收链路前端低噪放当场报废。30 dB 衰减器是保命的别省。4.2 USRP 端基带配置USRP 的配置用 UHD 驱动关键参数如下import uhd usrp uhd.usrp.MultiUSRP(addr192.168.10.2) usrp.set_clock_source(external) usrp.set_time_source(external) # 发射通道配置 tx_channel 0 usrp.set_tx_rate(122.88e6, tx_channel) usrp.set_tx_freq(uhd.types.TuneRequest(1.5e9), tx_channel) # 中频 usrp.set_tx_gain(20, tx_channel) # 接收通道配置 rx_channel 0 usrp.set_rx_rate(122.88e6, rx_channel) usrp.set_rx_freq(uhd.types.TuneRequest(1.5e9), rx_channel) usrp.set_rx_gain(30, rx_channel)中频设 1.5 GHz外部混频器本振设 26.5 GHz混频后就是 28 GHz。为什么中频不设更高因为 X310 的 UBX-160 在 1.5 GHz 附近增益平坦度最好镜像抑制也最优。发射增益 20 dB、接收增益 30 dB 是实测调出来的。发射增益再高功放进入压缩区EVM 恶化接收增益再高底噪抬升近距离目标回波反而被噪声淹没。4.3 相控阵波束控制实现波束控制通过 USRP 的 GPIO 输出并行相位控制字。每个阵元的相位量化 5 位8x8 共 64 个阵元需要 320 位控制字。我用的是串行移位寄存器方案GPIO 输出时钟和数据两根线移位 320 位后锁存。码本生成的核心代码import numpy as np def dft_codebook(N, d, lam, theta_scan): k 2 * np.pi / lam codebook [] for theta in theta_scan: phase k * d * np.arange(N) * np.sin(np.deg2rad(theta)) weight np.exp(1j * phase) codebook.append(weight) return np.array(codebook) N 8 d 5.3e-3 lam 10.7e-3 theta_scan np.linspace(-20, 20, 16) codebook dft_codebook(N, d, lam, theta_scan)生成的码本每个码字是一个 8 维复向量对应一行或一列阵元的相位加权。实际控制时把复相位量化到 5 位映射到移相器的控制字。4.4 回波处理与距离角度估计回波处理流程分四步去循环前缀、FFT、子载波解调、距离角度联合估计。去 CP 后做 1024 点 FFT得到频域符号。通信子载波做信道估计和均衡感知子载波提取相位。距离估计用频域相位斜率法回波在不同子载波上的相位随子载波索引线性变化斜率正比于时延。def estimate_range(rx_freq, subcarrier_idx, delta_f): phase np.unwrap(np.angle(rx_freq[subcarrier_idx])) slope np.polyfit(subcarrier_idx, phase, 1)[0] tau -slope / (2 * np.pi * delta_f) return tau * 3e8 / 2角度估计用波束域最大似然把每个波束的接收功率排成向量找峰值对应的波束方向再用相邻波束做插值。def estimate_angle(power_vec, theta_scan): peak_idx np.argmax(power_vec) if 0 peak_idx len(power_vec) - 1: y0, y1, y2 power_vec[peak_idx-1:peak_idx2] delta 0.5 * (y0 - y2) / (y0 - 2*y1 y2) else: delta 0 return theta_scan[peak_idx] delta * (theta_scan[1] - theta_scan[0])4.5 RealSense 数据接入与点云处理RealSense 用 pyrealsense2 库接入取深度帧和彩色帧对齐后生成点云。点云处理做三步直通滤波去掉桌面和背景、聚类分割出目标、计算目标质心。import pyrealsense2 as rs import numpy as np pipeline rs.pipeline() config rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) pipeline.start(config) frames pipeline.wait_for_frames() depth frames.get_depth_frame() color frames.get_color_frame() pc rs.pointcloud() pc.map_to(color) points pc.calculate(depth) verts np.asanyarray(points.get_vertices()).view(np.float32).reshape(-1, 3)点云滤波用直通滤波限制在 0.3 到 2 米再用 DBSCAN 聚类取最大簇的质心作为视觉观测。4.6 融合定位的完整跑通流程把上面所有模块串起来主循环是这样的USRP 连续收发每 64 个符号输出一帧感知数据。回波处理模块估计距离和角度送入 EKF 做预测和更新。RealSense 每 33 毫秒输出一帧点云处理得到视觉观测送入 EKF 更新。EKF 输出当前 UE 位置估计同时反馈给波束控制模块调整下一帧扫描方向。循环执行记录定位结果和真值对比。实测下来静态目标定位 RMSE 0.30 米动态目标速度 0.5 米每秒RMSE 0.42 米。动态精度下降主要来自波束扫描的时延和运动模糊后续可以通过预测波束指向来改善。5. 常见问题与排查技巧实录5.1 回波信噪比太低怎么办这是最常见的问题。排查顺序如下现象可能原因排查方法解决措施回波底噪高接收增益过大看底噪功率谱降接收增益 5 dB回波峰值低发射功率不足测发射端口功率提发射增益或换高增益天线回波展宽相位噪声大看星座图 EVM检查参考时钟质量回波漂移时钟不同步看多帧相位一致性检查 10 MHz 参考连接我遇到过一次回波信噪比只有 8 dB排查半天发现是相控阵的参考时钟线松了锁相环没锁上波束指向随机漂移。重新插紧后信噪比回到 25 dB。5.2 角度估计出现镜像模糊毫米波相控阵的阵元间距如果超过半波长会出现栅瓣角度估计就会出现镜像模糊。8x8 阵列按半波长设计理论上没有栅瓣但实际加工误差会让阵元间距偏差 0.1 到 0.2 毫米高频段下就可能激发栅瓣。解决办法有两个一是做阵元幅相加权用泰勒窗压低旁瓣二是用 RealSense 的先验方向做解模糊把不在先验范围内的峰值剔除。我两个都用上了镜像模糊基本消除。5.3 RealSense 点云缺失或跳变RealSense 对黑色、透明、反光表面深度估计会失效点云出现空洞。我的处理是对深度图做时域中值滤波去掉单帧跳变。对空洞区域用邻域插值补全。如果目标区域空洞超过 30%这一帧视觉观测直接丢弃只靠毫米波定位。实操心得RealSense 的深度跳变在目标边缘特别明显聚类时容易把一个目标分成两簇。我在聚类前先做一次形态学闭运算把边缘小空洞填上聚类稳定性提升很多。5.4 EKF 发散怎么调EKF 发散通常是因为观测噪声协方差设得太小滤波器过度信任观测一旦观测有野值就带偏状态。我的调参经验是初始协方差设大一点给滤波器足够的收敛空间。观测噪声协方差按实际 RMSE 的 1.5 到 2 倍设留余量。加卡方检验做野值剔除观测残差超过 3 倍标准差就丢弃。调完之后EKF 在动态场景下也没再发散过。5.5 波束扫描速度跟不上目标移动前面算过全范围扫描一帧要 112 毫秒目标移动 0.5 米每秒的话一帧内目标移动 5.6 厘米波束指向和实际目标方向偏差会导致增益下降。我的优化是预测式波束扫描用 EKF 预测下一帧目标位置直接把波束指向预测方向只做小范围精细扫描。这样一帧扫描时间降到 3 毫秒以内跟踪动态目标完全够用。6. 实测数据与性能分析6.1 静态定位精度静态场景下UE 放在 1 米、1.5 米、2 米三个距离每个距离测 500 帧统计 RMSE距离距离 RMSE角度 RMSE定位 RMSE1.0 米0.18 米0.7 度0.26 米1.5 米0.21 米0.8 度0.30 米2.0 米0.25 米1.0 度0.36 米1.5 米处定位 RMSE 0.30 米和标题一致。距离越远精度越差主要因为回波信噪比随距离四次方衰减角度估计的方差也随之增大。6.2 动态跟踪性能动态场景下UE 沿直线以 0.5 米每秒移动跟踪轨迹和真值对比最大误差 0.55 米平均误差 0.42 米。误差峰值出现在波束切换的瞬间因为切换期间有约 1 毫秒的感知盲区。后续用双波束交替驻留可以消除这个盲区。6.3 通信链路性能通感一体的通信侧QPSK 调制在 122.88 MHz 带宽下实测吞吐量约 180 Mbps误码率在信噪比 15 dB 时低于 1e-5。感知和通信共用波形通信性能相比纯通信波形下降约 8%这个代价换来亚米级定位我认为是值得的。7. 后续可扩展的方向这套原型跑通之后我梳理了几个可以继续深挖的方向。一是多站协同单站角度分辨率受阵列孔径限制如果部署三个站做三角定位精度有望压到 0.1 米以内。二是波形优化现在的感知子载波是均匀稀疏的如果改成非均匀稀疏距离旁瓣还能再压 5 dB 左右。三是视觉和毫米波的深度融合现在还是松耦合的 EKF如果换成端到端的神经网络融合动态场景的精度应该还有提升空间。代码和配置文件我整理好放在文末链接里包括 USRP 的 UHD 配置、相控阵码本生成、回波处理、RealSense 接入和 EKF 融合的完整实现。硬件型号和参数都在 README 里写清楚了照着搭应该能少走不少弯路。这套东西最花时间的其实不是算法而是同步和标定把这两块啃下来后面就顺了。
返回列表