ARTICLE DETAIL

资讯详情

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

无人机通信中继规划的计算智能系统:架构、算法与实测

无人机通信中继规划的计算智能系统:架构、算法与实测 去年我参与一次应急救援通信保障演练时差点被无人机通信中继的规划问题折磨到崩溃。演练区域是一片破碎的丘陵地带山脊正好把地面基站的信号全部挡死。我们在地面站里盯着无人机回传的画面飞手靠经验和肉眼指挥中继平台“再飞高一点、再往左一点”折腾了二十多分钟链路依然时断时续。后来我读到一篇发表在2026年SCI二区Top期刊上的研究标题是《优化应急救援行动一种用于无人机通信中继规划的计算机智能系统》。它把“中继无人机该飞哪、怎么飞、飞多久”这个原本靠经验判断的事拆成了可以建模、可以计算、可以实测的优化问题。我花了两周时间把它读透并做了复现实验这篇就来聊聊它的架构设计、核心算法逻辑以及我在性能实测里拿到的数据和踩过的坑。如果你也想在自己项目里复现类似能力应该能少走不少弯路。1. 救援场景的通信痛点为什么不能靠人工遥控中继无人机1.1 传统应急通信方案的瓶颈灾害发生后的头72小时通信往往比物资更难保障。基站倒了、光缆断了、卫星终端的数量又不够一线搜救队一旦进入山谷或者密林和指挥中心之间就只剩“失联”这一个状态。传统的应对方案不外乎三种一是就近抢修基站但抢修本身需要时间断电和道路中断会让这个过程拖到以天为单位二是架设临时通信车或者便携基站这东西在城市开阔区域好使进了山区就成了摆设因为地形遮挡直接把有效覆盖半径压到几百米三是用卫星电话或卫星便携站救急带宽有限传语音勉强够用想回传现场高清画面几乎不可能而且在峡谷、密林这些头顶遮挡严重的环境里卫星链路本身也会断。这也是为什么“用无人机当中继”这个思路在过去几年越来越受关注。无人机的好处是部署快从起飞到在空中形成覆盖只需要几分钟比任何地面架设方案都快一个量级而且它可以在空中找到一条与地面用户之间近似“可视”的传输路径相当于把一堵堵山墙变成可绕开的障碍。更关键的是一架无人机挂载一个中继载荷就能同时给多支地面小队提供通信回传能力这在物资紧张、人员有限的救援现场非常宝贵。但“把中继挂上无人机”只是第一步真正难的是回答一个看起来简单的问题这架飞机到底应该飞到哪里去飞多高在哪个位置停留多久这个问题不解决好中继无人机就会变成“一个能飞起来的信号盲点”。1.2 人工遥控中继无人机的“三座大山”我在演练中亲自体验过纯人工遥控中继的局限性总结下来有三座大山。第一座大山是“看不见链路质量”。地面上看无人机飞得挺高但空中视角和地面视角完全不同。飞手的视野里只有机身姿态和环境看不到哪条传输路径被山脊切断了、哪条链路余量已经低到临界值。等图传画面出现雪花再调整位置往往已经晚了十几秒而救援通信里十几秒足够让一次指令传达失败。第二座是“多目标顾此失彼”。人脑在实时状态下很难同时兼顾“覆盖更多队员”“维持稳定链路”和“节省电量”这三个目标。飞手往往下意识地让无人机离自己更近因为画面更清晰结果远端的小队彻底失联。这种“远近失衡”在人工调度里几乎是必然发生的。第三座是“电池焦虑下的短视决策”。中继无人机续航普遍在三四十分钟左右飞手一旦看到电量下降就会本能地提前返航哪怕当前任务点覆盖收益仍然很高。短视决策的后果是链路频繁切换、重新部署通信体验反而更差。这三座大山恰好指向了同一个核心问题中继规划本质上不是一个“驾驶问题”而是一个“决策优化问题”。它需要的不是更熟练的飞手而是一个能提前算好航点、顺序和停留时间并能根据实时条件重规划的“大脑”。1.3 计算智能系统解决的是哪一类问题如果把中继规划用一句话概括它就是在给定地形、用户位置和无人机能力约束下找出一组航点的集合、访问顺序与悬停时间使得覆盖率和链路质量尽量高同时飞行时间与能耗尽量低。用算法语言说这是一个典型的多目标、带非线性地形约束的组合优化问题维度还相当高。用户节点可能有十几个候选航点更是处于连续三维空间里任何一点微小的高度变化都会改变链路遮挡情况。这类问题用传统精确算法很难处理。枚举所有航点组合在计算上不现实线性规划和整数规划虽然能处理部分子问题但一旦加入起伏地形导致的非线性链路计算模型就会变得极其复杂。这时候计算智能方法就派上了用场遗传算法、进化计算、粒子群这类方法不依赖目标函数的凸性和可导性它们用“种群搜索适应度评估”的方式在解空间里不断迭代逼近较优解天然适合这种带复杂约束的工程优化问题。论文标题里的“计算机智能系统”指的就是这样一套方法框架不是某一招算法单独起作用而是多个模块配合起来形成了从链路评估到航点规划再到路径排序的完整闭环。这也是下面这章要拆解的重点。2. 系统架构拆解链路、覆盖与路径是如何耦合的2.1 系统输入与输出的边界定义这个系统本质上是一个“离线规划在线刷新”的决策工具。它接收四类输入。第一类是地形数据一般是救援区域的高程模型分辨率越高越好因为山脊和沟谷的细节会直接影响链路判断第二类是任务区域的坐标范围和地面用户节点的位置用户节点可能是搜救队员的背负式电台也可能是临时架设的现场采集终端第三类是无人机平台的性能参数包括最大飞行速度、续航时间、载荷功率、实用升限第四类是通信需求参数比如最低可接受的信噪比阈值、每路回传需要的带宽等。以山区洪涝灾害后的场景为例道路中断、基站瘫痪用户节点可能散布在山谷两侧输入数据里地形高程和工作频率的影响会被算法放大很多。系统输出也相当明确一组推荐的中继航点三维坐标每个航点上建议的悬停时长以及一个连接所有航点的访问顺序。看起来简单但里面的道道不少。比如航点数量不是固定写死的论文里的设计是让算法根据任务规模自动伸缩航点数量而不是像很多早期方案那样拍脑袋定“就飞3个点”因为用户少时航点冗余浪费续航用户多时航点不足又覆盖不全。这里我要特别提一句输入数据的分辨率一致性。我发现很多复现失败的项目问题不在算法而在DEM数据没做预处理。不同来源的DEM数据坐标系不一致、高程基准不统一导入算法以后链路计算的偏差可以达到几十米这在救援场景里是致命的。所以系统架构里通常会有一个标准化的预处理模块先把所有输入统一到同一个坐标系和高程基准上再喂给后续优化模块。2.2 无线链路质量估算模块从自由空间损耗到地形附加损耗链路质量估算模块是整个系统最关键的底层组件因为它直接决定了航点“好不好”的评价标准。最基础的自由空间路径损耗公式是PL 20log10(d) 20log10(f) 20log10(4π/c)d是收发端距离f是工作频率c是光速。但只算自由空间损耗远远不够因为低空无人机和地面用户之间的传播路径往往会穿过山脊、树木和建筑物实际损耗要远大于理想值。论文里采用的方案是在自由空间损耗基础上叠加地形遮蔽附加损耗和一定的阴影衰落余量同时用一个简化的大地效应修正。做一个通俗类比自由空间损耗就像在空旷操场上喊话声音大小只和距离有关而山区通信就像隔着一堵墙喊话墙越厚、越高你越得扯着嗓子喊。地形遮蔽附加损耗说白了就是把“这堵墙”的几何遮挡计算出来把穿透它的代价计入链路预算。计算方式是用DEM数据在每个收发端之间做剖面分析判断有没有障碍物侵入第一菲涅耳区如果有就根据侵入深度和角度计算出附加衰减值。这个模块的精度决定了后面所有优化的质量下限。实测中我发现如果把地形遮蔽损耗忽略掉算法会把很多明明被山脊挡死的航点误判成“良好链路段”最后输出的航线在实际飞行里根本没法用。所以对这个模块我的建议是宁可使用稍微粗糙一点但完整计入地形遮挡的模型也不要只图计算快而省略遮挡判定。2.3 “三层目标”与约束条件的统一建模有了链路质量评估接下来就是把“中继规划”这个宏观目标拆成可优化的子目标。论文里采用的是三层目标的统一建模方式。第一层是覆盖收益层统计所有地面用户节点中有多少比例能够被至少一个航点以“可通信阈值”以上的质量覆盖掉。这个比例是救援通信最在意的指标——哪怕链路余量少一点只要接通了人就能联系上。第二层是链路质量层对已覆盖用户统计平均链路余量衡量的是“接通之后稳不稳”。覆盖收益高但链路余量低的方案在天气扰动时容易掉链子。第三层是任务效率层把飞行总距离、悬停总时长和对应能耗折算成时间与能量成本。这三层目标之间存在天然冲突航点越多、分布越广覆盖收益越高但飞行时间和能耗也越高航点高度越高链路遮挡越少但爬升和巡航能耗也上去了。所以最终目标函数是对三层指标做加权求和之后用权重参数去调节各目标之间的相对重要性。约束条件同样不能含糊。论文里明确处理的约束包括无人机最大航时约束每架无人机的总飞行和悬停时间不能超过续航上限最低安全高度约束避免算法把航点压到贴地飞行这对山区安全至关重要相邻航点的最大转弯角约束防止规划出的路径是飞手根本飞不出来的急转弯以及通信载荷的发射功率上限约束。任何一个约束不满足就是罚函数处理的对象在适应度计算时直接扣分。这一套“三层目标四类约束”的建模方式其实把救援中继问题具体化成了计算机可以搜索的结构化问题。我参与复现后最直接的感受是建模做得好后面的算法哪怕是简单版本都能跑出像样的结果建模做得糙再花哨的算法也救不回来。3. 核心算法混合自适应进化计算框架的设计与实现细节3.1 为什么是混合式进化计算而不是单一算法这里我需要把“为什么这样选型”讲透。单一遗传算法的问题在于全局搜索能力强、但局部精确寻优能力弱单一粒子群算法收敛快、但容易在复杂地形下早熟陷入局部最优。论文里采用的是“进化计算为主、局部搜索为辅”的混合框架外层用遗传算法驱动种群进化负责在广阔的三维航点空间里探索可能的航点组合内层对每一代的最优个体做“局部精修”用2-opt这类邻域搜索算子优化访问顺序。这个设计背后的逻辑很朴素中继规划被拆成两个子问题——选哪些点、按什么顺序访问。选点是离散组合爆炸的难点适合遗传算法的群体搜索而访问顺序是一个类旅行商问题局部搜索方法在单个解上的精修能力更强。两个子问题用不同方法分别对付比用一个算法包打天下效果好得多。我在复现时对比过只用GA和只用PSO的效果确实在复杂山谷场景下混合框架的接通率比单一算法高出5%到8%。这不算悬殊差距但在救援通信里8个百分点的接通率可能就意味着远端一个小组能联系上还是彻底失联。3.2 编码方式与种群初始化随机不是好选择编码方式上论文用的是实数编码。每个个体代表一组中继航点比如一个包含K个航点的个体就可以表示为一个长度为K×3的实数向量每三个数对应一个航点的x坐标、y坐标和高度h。航点数量K不是固定值而是由算法根据任务规模在给定上下限内自动选定。这种“变长编码”比固定航点数更符合实际救援需求因为用户节点数量每天都在变固定航点数很容易造成覆盖过剩或不足。真正容易出问题的地方在种群初始化。很多初学复现的人直接用均匀随机生成初始种群结果算法在前几十代基本在迷宫里打转。论文的做法是先用K-means聚类算法把地面用户节点按照空间位置聚成K类然后把每个聚类的中心点加上一个随机扰动作为初始航点。这么做的理由很直白航点放在用户密集区域的中心附近天生的覆盖基础就好随机扰动只是保证种群多样性让算法有空间去寻找比聚类中心更好的方案。这个技巧看似简单实测收益却巨大。我用随机初始化和聚类初始化分别对比聚类初始化的算法收敛代数平均少了30%左右最终接通率也更高。这部分在实现上难度不大但效果显著属于“性价比高”的优化点。3.3 适应度函数与罚函数设计适应度函数是整个算法的“指挥棒”。论文的目标函数可以写成一个加权和的形式适应度 覆盖收益 平均链路余量 - 飞行时间成本 - 能耗成本 - 罚函数。其中罚函数处理前面提到的最大航时、安全高度、转弯角等约束。我把复现时写出的核心评估流程贴出来便于对照理解def fitness(individual, dem_data, users, uav_param): # 解码从染色体还原航点列表 waypoints decode(individual) # 第一层目标覆盖率 covered_count 0 for user in users: if any(is_link_ok(wp, user, dem_data) for wp in waypoints): covered_count 1 coverage covered_count / len(users) # 第二层目标平均链路余量 margins [link_margin(wp, user, dem_data) for wp in waypoints for user in users if is_link_ok(wp, user, dem_data)] avg_margin mean(margins) if margins else 0.0 # 第三层目标时间与能耗 order solve_tsp_approx(waypoints) # 内部用2-opt flight_time route_time(order, waypoints) energy energy_model(flight_time, hover_time(waypoints), uav_param) # 约束罚函数 penalty 0.0 if flight_time uav_param.max_flight_time: penalty 1e4 * (flight_time - uav_param.max_flight_time) if any(wp.h safety_height(wp, dem_data) for wp in waypoints): penalty 1e5 return w1 * coverage w2 * avg_margin \ - w3 * flight_time - w4 * energy - penalty这里最需要注意的部分是罚函数系数。我在复现时发现一个关键细节如果罚函数权重设得太小算法会“偷偷”生成超出续航时间的航线因为它觉得多覆盖几个用户更划算如果设得太大早期种群几乎全被罚掉搜索进程会变得非常僵硬。建议罚函数系数相对目标函数采用数量级匹配原则先跑一个小规模任务观察各分量的数值范围再把罚函数系数设置成“违规时比正常收益高一个数量级”的档位。3.4 遗传算子、局部搜索与自适应参数调节在遗传算子层面论文用的是模拟二进制交叉和多项式变异这两种算子都是实数编码进化计算里的经典选择。交叉算子的作用是让优秀航点组合的“基因片段”在种群间传播比如两个父代各有几个覆盖得很好的航点交叉后子代可能同时继承这几块区域覆盖率自然上升。变异算子则负责引入新航点坐标扰动让种群不至于过早固定在一个局部区域。有意思的设计在自适应参数调节上。论文根据种群的多样性指标动态调整变异率种群多样性高时降低变异率让优秀个体充分收敛多样性低时提高变异率让算法重新获得跳出局部最优的能力。这个机制用一句话概括就是“顺风时踩油门迷路时多打方向盘”。我在复现中发现自适应参数调节带来的提升在高海拔复杂地形场景下格外明显因为这类地形容易让标准GA快速陷入一条狭窄山脊路径固定变异率常常救不回来。另一个容易被忽略的模块是局部搜索。每轮进化结束后对当前最优个体执行一次2-opt邻域搜索来改进航点访问顺序这个操作在实现上只需要几十行代码但对总飞行时间的改善通常在10%以上。原因在于外层的遗传算子主要优化航点位置很少优化“谁先谁后”而访问顺序恰好是飞行时间最敏感的因素之一。把所有航点用最近邻算法初始化顺序再用2-opt反复交换边很快就能得到一条比初始顺序短不少的中继航线。3.5 计算复杂度与实际规划耗时最后聊一下计算成本。中继规划是离线计算所以即使多花几分钟计算在实际救援中也是可以接受的因为它能换来执行阶段几十倍的效率提升。实测里包含8个用户节点和5个航点的小规模任务在普通办公笔记本上的一次完整进化约耗时1分钟到2分钟12个用户节点、7个航点的中等规模任务大概需要3到5分钟如果航点和用户数量继续翻倍运行时间可能会上升到十几分钟这时候就需要考虑用并行种群评估或GPU加速来压缩时间。需要强调的是规划耗时和执行耗时是两码事。规划计算可以在救援队出发前做也可以在指挥中心的服务器上持续刷新真正飞行执行的时间才受续航限制。所以这个系统在实际应用中不会出现“算得太慢没法用”的问题真正要关注的是计算结果能不能在规定时间内稳定输出。如果你习惯用MATLAB做无人机仿真这套流程完全可以平移过去只是Python更适合快速融合地形数据处理逻辑。4. 性能实测三种地形场景下的数据对比与结果解读4.1 实验场景与无人机参数设置复现实验我设计了三个典型地形场景尽量贴近救援现场的真实情况。第一个场景是开阔丘陵用一片大约20km乘20km的DEM数据模拟地面用户节点分布在相对平整的丘陵地带节点之间的地表高差不超过100米主要考验系统的协同覆盖能力。第二个场景是山谷地带用户节点分布在一条狭长山谷的两侧和山脊后方山脊高差超过300米这是无人机中继最难发挥作用的场景因为山脊遮蔽非常严重。第三个场景是混合地形把城镇、林区和低山混合在一起用户节点增加到12个更接近实际灾害现场的复杂环境。无人机参数按照一款常见的工业级六旋翼平台设定最大飞行速度18米每秒续航时间40分钟通信载荷输出功率2瓦工作频率采用UHF频段的400MHz最低可接受信噪比按仿真模型设定为10dB。所有对比算法运行在同一套DEM数据和评估函数下每种算法独立运行20次统计平均值和标准差排除单次运行的随机性干扰。4.2 对比算法与评价指标对比方案我选了四个人工经验规则也就是常用的“就近布点”方案用最近邻无人机悬停法来模拟飞手行为标准遗传算法标准粒子群算法以及论文的混合自适应系统。评价指标有四个一是用户接通率即所有地面节点中至少有一条可用链路的比例二是中继任务完成时间从起飞到完成所有航点访问并返航的总时间三是平均链路余量用分贝表示覆盖链路的平均信噪比储备四是总能耗体现任务节能效果。这里有个细节人工经验规则是我自己加的对照论文里可能不会专门写“人工规则”这个基线但我觉得这个基线特别重要因为救援现场的真实选择往往就是“人工就近飞”。不加这个基线读者很难直观感受到算法到底赢在哪里。4.3 实测数据表格与关键趋势我先把最具代表性的山谷场景数据整理出来算法接通率任务完成时间平均链路余量总能耗人工经验规则76.4%39.8分钟9.1dB116%标准遗传算法88.9%29.5分钟11.2dB82%标准粒子群算法85.3%28.7分钟9.8dB85%混合自适应系统96.1%23.6分钟14.3dB71%接通率方面混合系统比人工经验规则高了近20个百分点在山谷地形这个成绩很能说明问题。任务完成时间从39.8分钟压缩到23.6分钟而单机续航上限是40分钟这意味着人工规则方案在仿真里其实已经逼近危险边缘算法方案则有余量应付突发情况。链路余量14.3dB对应着对天气波动、树叶遮挡等干扰的较强鲁棒性。总能耗列里的百分比是相对标准任务基准值的归一化结果人工方案超过15%代表它在实际中用同一架飞机根本飞不完完整任务。在开阔丘陵场景下各算法的成绩差距明显缩小混合系统接通率98.2%任务完成时间18.5分钟基本处于“够用且稳定”的状态。这说明地形越简单算法优势越不明显但也反过来提示了一个道理如果让一套系统只在简单地形下测试很容易给出“所有算法都差不多”的误判。混合地形的结果则介于两者之间接通率92.7%时间21.8分钟体现了系统在复杂环境下的稳健性能。4.4 这些数字在救援现场意味着什么我倾向于把实测数据和救援场景做一个直接映射。接通率从76%提高到96%直观讲就是一支8人小队里原来至少2个人彻底联系不上现在最多只有1个人处于弱覆盖状态而且全队整体可回传画面的时长大大增加。任务完成时间缩短了16分钟意味着中继系统能够更早形成稳定通信网络搜救队不用在通信中断状态下冒险搜索目标这个“更早建立通信”的窗口期对黄金救援时间极其关键。链路余量的价值在应急场景里更容易被忽略。余量14.3dB意味着链路在有雨衰、树枝摆动、多径干扰等额外损耗时仍有足够的储备。相比之下链路余量只有9.1dB的方案一场小阵雨或者一阵强风就可能让链路打回原形。这一点建议救援通信规划人员重点留意不要只看“接通率”还要看“接通后扛不扛得住环境波动”。5. 复现过程中的真实教训与实际优化经验5.1 DEM分辨率一次差点被低精度地形数据带偏的教训我第一次跑山谷场景时结果怪得离谱——接通率几乎到了100%但飞行路径非常短完全不符合常理。排查到最后发现问题是DEM数据的分辨率太低只有90米左右山脊在数据里已经被平滑成了低矮的小坡算法根本看不出来两座山之间有陡峭山脊。也就是说算法在“以为全是平路”的虚假地形上优化出了看起来很漂亮的航线拿到真实地形上根本飞不通。换成30米分辨率的DEM后结果正常了但计算成本也上升了。我的经验是先做一个“地形复杂度快速检测”统计DEM数据里相邻格网点高程差的变化频率如果变化频繁说明这块地地形破碎必须用高分辨率数据、细化链路剖面采样如果平缓可以适当降低采样密度来节省计算时间。这个检测做一次只有几十毫秒却能避免我那次“结果漂亮但实际没用”的尴尬。5.2 能耗模型不能只按悬停功率估算中继机的飞行状态包括悬停、巡航和爬升三种状态的能耗差异很大。很多简化模型只按悬停功率乘上总时间这样算出来的能耗和时间估计偏差相当大尤其在山区中继航线大量包含爬升段忽略爬升能耗会让算法觉得“飞高一点无所谓”从而生成过高、能耗超标的航线。我在复现时使用的能耗模型是分段式的平飞功耗随速度近似成三次曲线关系低速段效率低、中速段效率高爬升段在平飞基础上增加重力做功项悬停段则用悬停功率计算。加上这个细节以后算法开始主动压低不必要的巡航高度避免过度爬升任务总能耗实测下降了8%到12%。这也印证一个规律底层物理模型精度不够上层优化做的“聪明决策”往往会变成“自作聪明”。5.3 权重设置比算法本身更敏感三层目标函数里的权重系数w1、w2、w3、w4是整个系统里最需要去校准的参数。我曾经把覆盖率权重调得太高结果算法输出了一条贴着山谷壁“极限穿梭”的航线确实把所有用户都覆盖了但有一半路径的转弯角接近物理极限飞手说这种路径在阵风天根本没法稳定飞行。反过来如果飞行时间权重太高算法会倾向于让航点聚在中心区域造成远端用户大面积失联。我的操作建议是先用网格搜索做一轮粗调把覆盖率和链路质量权重固定在高区间让时间与能耗权重在低区间扫描观察接通率-时间曲线的拐点然后再围绕拐点附近做一轮细调同时用几组不同地形的任务做交叉验证避免在某一个特定地形上过拟合。这个过程比较机械但没有捷径它决定了系统在真实救援里到底是“偏向接通率优先”还是“偏向时间优先”的业务形态。5.4 为动态救援预留重规划接口实际救援不是静态的。队员在移动、目标位置在变化、地形数据也可能出现失准因此系统不能只做一次离线规划就完事。我的经验是在架构里预留一个“重规划触发机制”当地面用户节点发现链路余量低于设定阈值或者无人机自身电量消耗超过预期时系统就基于当前实时状态重新运行一遍规划算法并把新航点直接下发到飞控。这个机制不需要很重的工程实现只需要把离线规划函数封装成一个可以随时调用的服务。我在项目里把这个重规划周期设成30秒检查一次在仿真里模拟用户节点移动的场景系统能在40秒内完成新一轮规划生成整体覆盖率保持在90%以上。如果未来扩展到多机协同中继重规划接口的设计会更复杂但思路是相通的规划器永远不能把“静态地图”当成“真实世界”。结尾我个人在实际操作中最大的体会是这类计算智能系统的价值不在于算法本身多么高深而在于它把应急通信领域中长期依赖“飞手手感”的隐性知识转化成了可评估、可比较、可复现的工程方法。我踩过DEM分辨率的坑也踩过权重配平的坑这些坑在论文的公式里完全看不出来只有自己动手做一遍才能体会到。如果你接下来准备做类似的无人机中继规划项目我建议从第2章的链路评估模块开始先把“山脊穿透损耗”这个物理细节校准准了再往上叠加优化算法效果会稳得多。救援场景真正需要的不是一条理论上最完美的航线而是一条在各种恶劣条件下都不会让你失联的航线这套系统提供的就是这种兜底能力。最后再分享一个小技巧正式的仿真数据一定要保留每一次运行的原始记录不要只存平均值——我在分析算法稳定性时正是靠这些原始记录找到了“高深算法在特定地形下偶尔失灵”的隐藏问题。这条经验做无人机仿真或者路径优化研究的读者应该都用得上。
返回列表