☰
RIS辅助无人机SWIPT:最小速率最大化与动态环境适配
2026/10/22 7:44:45 网站建设 项目流程

简介:这份资源面向无线通信、无人机通信方向的研究人员与工程师,以及关注RIS、SWIPT与6G技术的学术人员,围绕基于可重构智能表面的无人机空地通信系统,解决能量受限与飞行区域受限下的最优传输问题。内容以论文复现为主线,通过交替优化与逐次凸近似,联合优化无人机轨迹、预编码矩阵和RIS相位矩阵,最大化信息接收器的最小速率,并给出系统参数设置、信道模型与算法实现的完整代码及解释。资源包共1个docx文件,约58KB,集中承载理论推导、代码实现与仿真分析,便于对照复现。已有141人学习。读者可从中获得可运行的优化算法脚本、Dinkelbach方法与分布式RIS协同控制等关键技术的实现思路,以及速率提升174%、能效提高215%、边缘用户性能改善250%等仿真验证结果,为应急通信、军事侦察等场景的系统设计与工程落地提供参考。

1. 从一次链路预算翻车说起:RIS 到底给无人机 SWIPT 补了哪块短板

去年帮一个做应急通信的团队看仿真结果,他们搭了一套无人机空地携能通信(SWIPT)链路,地面节点靠射频信号同时收能量和解信息。单看下行链路预算,发射功率、路径损耗、天线增益都算得挺漂亮,可一跑蒙特卡洛就露馅:边缘用户的信息速率掉到 0.2 bit/s/Hz 以下,能量收集端更是常年趴在灵敏度门限附近。问题不在发射端,而在空地信道本身——无人机高度一变,直射径和地面反射径的相位关系就跟着变,深衰落点像幽灵一样在覆盖区里游走。

这就是可重构智能表面(RIS)切入的地方。RIS 是一块由大量可调反射单元组成的平面,每个单元能独立调相位,把入射波重新导向目标方向,等效于在传播环境里“凭空”加了一条可控的反射径。放到无人机空地 SWIPT 场景里,它解决的是两个耦合问题:一是边缘用户的信号强度不足,二是能量收集端对接收功率的硬需求。标题里说的“最小速率最大化”,本质是一个 max-min 公平性优化——不追求平均吞吐好看,而是把最差那个用户的信息速率抬起来,同时保证所有节点的收集能量不低于门限。而“动态环境适配”则是承认无人机在动、信道在变,优化策略不能是一锤子买卖。

这套方案适合谁?做低空通信、物联网供能、应急组网的研究生和工程师,尤其是手里有 MATLAB 或 Python 优化工具箱、想从“能跑通”走到“跑得稳”的人。下面我按自己复现时的顺序,把建模、求解、动态适配和踩坑一条条拆开。

2. 把场景写成可解的优化问题:变量、约束与目标函数

2.1 空地 SWIPT 的信道模型怎么落成矩阵

先明确几何。设无人机在固定高度 $H$ 悬停或缓慢飞行,地面有 $K$ 个用户,其中一部分是信息用户,一部分是能量用户,也可以同一用户同时做信息解码和能量收集(功率分割或时间切换)。RIS 贴在建筑物立面,含 $N$ 个反射单元。无人机到 RIS、RIS 到用户、无人机到用户的直射径,三条链路都要写进信道矩阵。

常见做法是:无人机到 RIS 用视距主导的莱斯信道,RIS 到地面用户用莱斯或瑞利,直射径根据无人机位置实时算。写成矩阵形式,用户 $k$ 的等效信道是

$$ \mathbf{h}k = \mathbf{h}{d,k} + \mathbf{G}_k \boldsymbol{\Phi} \mathbf{g} $$

其中 $\mathbf{h}_{d,k}$ 是直射径,$\mathbf{G}_k$ 是 RIS 到用户 $k$ 的信道,$\mathbf{g}$ 是无人机到 RIS 的信道,$\boldsymbol{\Phi} = \mathrm{diag}(e^{j\theta_1},\dots,e^{j\theta_N})$ 是 RIS 相移矩阵。这一步的坑在于维度顺序:很多人把 $\mathbf{G}_k \boldsymbol{\Phi} \mathbf{g}$ 写成 $\mathbf{g}^T \boldsymbol{\Phi} \mathbf{G}_k$,结果相位优化时梯度方向全反。我一般先在纸上把维度标清楚:$\mathbf{g}\in\mathbb{C}^{N\times1}$,$\mathbf{G}_k\in\mathbb{C}^{1\times N}$,$\boldsymbol{\Phi}\in\mathbb{C}^{N\times N}$,乘出来必须是标量。

import numpy as np def build_channel(N, K, H, user_pos, ris_pos, uav_pos, rician_K=10): """ 构建无人机-RIS-用户等效信道 N: RIS 单元数 K: 用户数 H: 无人机高度 user_pos: (K,2) 地面用户坐标 ris_pos: (2,) RIS 坐标 uav_pos: (2,) 无人机水平坐标 返回: h_eq (K, N+1) 等效信道,最后一列是直射径 """ # 无人机到 RIS 距离与视距信道 d_g = np.linalg.norm(uav_pos - ris_pos) + 1e-6 g_los = np.exp(-1j * 2 * np.pi * d_g / 0.1) # 简化相位,波长0.1m g = np.sqrt(1.0 / (d_g ** 2)) * g_los * np.ones(N) h_eq = np.zeros((K, N + 1), dtype=complex) for k in range(K): d_k = np.linalg.norm(ris_pos - user_pos[k]) + 1e-6 # RIS到用户:莱斯信道,含随机散射 los = np.exp(-1j * 2 * np.pi * d_k / 0.1) nlos = (np.random.randn(N) + 1j * np.random.randn(N)) / np.sqrt(2) G_k = np.sqrt(1.0 / (d_k ** 2)) * ( np.sqrt(rician_K / (rician_K + 1)) * los + np.sqrt(1 / (rician_K + 1)) * nlos ) # 直射径 d_d = np.linalg.norm(uav_pos - user_pos[k]) + 1e-6 h_d = np.sqrt(1.0 / (d_d ** 2)) * np.exp(-1j * 2 * np.pi * d_d / 0.1) h_eq[k, :N] = G_k * g h_eq[k, N] = h_d return h_eq

这段代码里rician_K控制视距分量占比,0.1是载波波长,实际替换成你的频段对应值。注意h_eq最后一列单独放直射径,是为了后面把 RIS 相移和直射径分开处理,避免在优化里重复计算。

2.2 最小速率最大化问题的标准形式

设无人机发射波束成形向量为 $\mathbf{w}$,RIS 相移为 $\boldsymbol{\theta}=[\theta_1,\dots,\theta_N]^T$。用户 $k$ 的信息速率是

$$ R_k = \log_2\left(1 + \frac{|\mathbf{h}_k^H \mathbf{w}|^2}{\sigma^2}\right) $$

能量收集端收到的功率是 $\eta |\mathbf{h}_j^H \mathbf{w}|^2$,其中 $\eta$ 是整流效率。优化问题写成

$$ \max_{\mathbf{w},\boldsymbol{\theta}} \min_k R_k $$

约束包括:发射功率 $|\mathbf{w}|^2 \le P_{\max}$,能量收集功率 $\ge E_{\min}$,RIS 相移模为 1。这是一个非凸问题,因为目标里 $\mathbf{w}$ 和 $\boldsymbol{\theta}$ 耦合,且相移约束是单位模。

我一般用交替优化(AO)拆开:固定 $\boldsymbol{\theta}$ 优化 $\mathbf{w}$,再固定 $\mathbf{w}$ 优化 $\boldsymbol{\theta}$,来回迭代。$\mathbf{w}$ 子问题可以用半定松弛(SDR)或二阶锥规划(SOCP)转成凸的;$\boldsymbol{\theta}$ 子问题用半定松弛加高斯随机化,或者直接上流形优化。新手建议先跑通 SOCP 版本,稳定后再换流形优化提速。

2.3 用 CVXPY 把子问题写成可执行代码

下面是一个最小可复现的 $\mathbf{w}$ 子问题求解片段,用 CVXPY 的 SOCP 形式。假设 RIS 相移固定,等效信道已知。

import cvxpy as cp import numpy as np def solve_beamforming(h_eq, theta, P_max, E_min, sigma2=1e-10, eta=0.5): """ h_eq: (K, N+1) 等效信道 theta: (N,) RIS相移角 P_max: 发射功率上限 E_min: 能量收集门限 """ K, M = h_eq.shape N = M - 1 # 构造含相移的等效信道 phi = np.exp(1j * theta) h_eff = h_eq.copy() h_eff[:, :N] = h_eq[:, :N] * phi # 逐元素乘相移 h_eff = h_eff.sum(axis=1) # 合并为 (K,) 标量信道 w = cp.Variable(M, complex=True) t = cp.Variable() constraints = [cp.norm(w) <= np.sqrt(P_max)] for k in range(K): # 信息速率约束:|h_k^H w|^2 / sigma2 >= 2^t - 1 constraints.append( cp.real(cp.conj(h_eff[k]) @ w) >= cp.sqrt(sigma2 * (2**t - 1)) ) constraints.append( cp.imag(cp.conj(h_eff[k]) @ w) == 0 # 相位对齐,简化处理 ) # 能量收集约束 for k in range(K): constraints.append( cp.square(cp.abs(cp.conj(h_eff[k]) @ w)) >= E_min / eta ) prob = cp.Problem(cp.Maximize(t), constraints) prob.solve(solver=cp.SCS, verbose=False) return w.value, t.value

这里把速率约束转成了 SOC 形式,t是最小速率的代理变量。注意cp.imag(...) == 0是为了让波束与信道对齐,实际严格解需要保留复数相位,这里为了演示收敛性做了简化。E_min / eta是能量门限折算到接收功率。跑的时候如果prob.status不是optimal,先检查P_max和E_min是否矛盾——功率不够却要求高能量,问题必然不可行。

3. 动态环境适配:无人机移动时怎么不重跑全局优化

3.1 位置预测加滚动时域,而不是每帧重解

无人机一动,信道矩阵全变,如果每个时隙都从头跑 AO,计算量扛不住。我的做法是滚动时域优化:用过去几个时隙的位置和信道估计,预测未来短窗内的无人机轨迹,只在预测窗内更新 RIS 相移和波束,窗长一般取 5 到 10 个时隙。预测模型不用太复杂,匀速加一阶马尔可夫扰动就够,关键是让优化有“提前量”。

具体实现上,把无人机水平位置 $\mathbf{q}(t)$ 写成 $\mathbf{q}(t+1) = \mathbf{q}(t) + \mathbf{v}\Delta t + \mathbf{n}(t)$,$\mathbf{n}$ 是过程噪声。用扩展卡尔曼滤波跟一下,得到预测位置后代入信道模型,再跑 AO。这样每帧只做局部修正,相移变化量小,收敛快。

3.2 RIS 相移的增量更新与码本回退

动态场景里,相移不必每帧全局重算。我一般维护一个码本,把常见信道方向对应的相移配置存下来,实时只做码本选择和微调。微调用梯度上升,步长取 0.05 到 0.1 弧度,迭代 3 到 5 次就停。如果信道估计误差大,直接回退到上一个稳定码本,避免优化发散。

def incremental_phase_update(theta_prev, h_eq, w, lr=0.08, steps=5): """ 基于梯度的相移增量更新 theta_prev: (N,) 上一时刻相移 h_eq: (K, N+1) 当前等效信道 w: 当前波束 """ theta = theta_prev.copy() N = theta.shape[0] for _ in range(steps): grad = np.zeros(N) for k in range(h_eq.shape[0]): # 数值梯度,实际可用解析梯度加速 for n in range(N): theta_eps = theta.copy() theta_eps[n] += 1e-4 phi = np.exp(1j * theta_eps) h1 = (h_eq[k, :N] * phi).sum() + h_eq[k, N] phi0 = np.exp(1j * theta) h0 = (h_eq[k, :N] * phi0).sum() + h_eq[k, N] grad[n] += (np.abs(h1 @ w)**2 - np.abs(h0 @ w)**2) / 1e-4 theta += lr * grad / (np.linalg.norm(grad) + 1e-8) return theta

这段数值梯度写法直观但慢,实际部署换成解析梯度能快一个量级。lr别设太大,超过 0.2 容易在单位模约束边界震荡。steps取 5 是精度和耗时的折中,再大收益递减。

3.3 用最小速率下界做在线监控

动态适配最怕的是“优化跑了但最差用户更差了”。我会在每帧算一个最小速率下界:用当前波束和相移,代入所有用户信道,取 $\min_k R_k$,再和上一帧比。如果连续三帧下降,触发全局重优化。这个监控逻辑比看平均速率靠谱,因为 max-min 问题的本质就是盯最差的那个。

4. 避坑与排查:复现时最容易翻车的五个点

4.1 现象:AO 迭代不收敛,目标值来回跳

原因通常是 $\mathbf{w}$ 和 $\boldsymbol{\theta}$ 子问题的收敛精度不匹配。一个解得太粗,另一个解得太细,交替时互相“打架”。解决:给两个子问题设相同的相对误差容限,比如都取 $10^{-3}$,并且每轮记录目标值,连续两轮变化小于容限就停,别固定迭代次数。

4.2 现象:能量收集约束始终不可行

先查单位。E_min如果是毫瓦,eta是效率,接收功率门限要换算成瓦;再查路径损耗模型,距离项有没有加小量防止除零。最常见的是P_max给太小,比如 1 W 发射却要求边缘用户收 1 mW,物理上就不成立。把E_min降到可行域内再逐步抬。

4.3 现象:RIS 相移优化后速率反而下降

多半是信道矩阵维度或共轭转置用错。检查h_eq的列顺序和相移乘法方向:相移是乘在 RIS 到用户那段,不是乘在直射径上。另一个可能是相位对齐时用了conj但波束没同步取共轭,导致信号相消。

4.4 现象:动态跟踪时延大,实时性不够

数值梯度太慢是主因。换成解析梯度,或者把相移优化降到每两帧一次,波束每帧更新。再不行就上码本,牺牲一点最优性换实时。实测码本加微调能把单帧耗时压到全局优化的三分之一以下。

4.5 现象:仿真结果好看但换一组随机信道就崩

过拟合了特定信道实现。解决:蒙特卡洛至少跑 500 次独立信道,统计最小速率的累积分布,看 5% 分位点而不是均值。如果 5% 分位点远低于均值,说明算法鲁棒性不够,需要加信道估计误差或加正则项。

5. 进阶技巧:把 max-min 做成可验证的工程闭环

走到这里,模型和代码都能跑了,但离“敢用”还差一步:验证。我自己的习惯是搭一个三层验证闭环。第一层,用穷举法在小规模场景(比如 N=4、K=2)里扫相移和波束,得到全局最优的数值下界,确认 AO 解和它的差距在可接受范围。第二层,做信道估计误差注入,给h_eq加 5% 到 10% 的复高斯扰动,看最小速率下降多少,下降超过 20% 就说明算法太脆。第三层,把动态轨迹跑满 1000 个时隙,统计切换码本的次数和重优化触发次数,这两个数直接反映在线计算开销。

一个具体技巧是给 max-min 目标加一个很小的正则项,比如 $-\epsilon |\mathbf{w}|^2$,$\epsilon$ 取 $10^{-4}$。这不改变最优解的量级,但能让 SOCP 求解器在边界附近更稳定,减少数值震荡。另一个是相移初始化别全零,用直射径相位对齐做初值,收敛能快两到三成。

参数上,RIS 单元数 N 不是越大越好。N 从 16 加到 64,最小速率提升明显;从 64 加到 256,提升变缓,但计算量线性涨。我的经验是空地场景 N 取 32 到 64 性价比最高,再大不如把功率预算花在波束成形上。能量收集门限E_min要按实际整流电路灵敏度设,别拍脑袋,设高了问题直接不可行,设低了优化没意义。

最后说个血泪教训:别在仿真里用理想相移。实际 RIS 单元有量化误差,1 bit 量化就能让最小速率掉 10% 到 15%。复现时至少加 2 bit 量化,代码里把np.exp(1j*theta)换成量化后的相位,看看你的算法还扛不扛得住。这个坑我踩过,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询