news 2026/10/3 11:14:02

基于Simulink的多无人机接力信号中继仿真建模实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Simulink的多无人机接力信号中继仿真建模实践

直接切入正题。

很多搞无人机通信或者做集群项目的朋友,多半都遇到过这个尴尬事:地面站跟飞机飞远了,图传信号飘忽不定,遥控链路偶尔还来个延迟卡顿;想在山谷、城市楼宇这种遮挡环境里做超视距作业,单机那点通信半径根本顶不上去。解决思路其实大家都有——多来几架飞机站在中间当“传声筒”,但真到了要在仿真环境里把“多机接力中继”这套逻辑跑通、把链路预算算明白的时候,很多人就卡在建模这一步了。

这阵子我正好用Simulink完整地搭了一套多无人机接力信号中继的仿真模型,从单机通信链路到多机协同中继决策,再到跟飞控、导航逻辑的联合仿真,算是把整个流程从头到尾踩了一遍。这篇东西我就把这套建模思路、关键模块选型、核心参数计算逻辑以及我实操中踩过的坑,全部摊开来讲清楚。不管你是准备参加数学建模竞赛、做毕业设计,还是想在公司项目里预研一下集群中继方案,这篇文章的思路和步骤都能直接复用。

1. 整体建模思路:为什么用Simulink做多机接力中继仿真

1.1 先搞清楚你要仿真的是“通信链路”还是“协同决策”

开始动手之前,有个问题必须想明白:你说的“多机接力信号中继”,本质上是两件事的叠加。

第一件事是通信链路的物理层仿真。也就是信号从A点发出去,经过自由空间路径损耗、遮挡衰减、多径衰落,到达B点之后信噪比还剩多少,误码率是多少。第二件事是多机协同决策仿真。也就是说,当无人机1和地面站之间的直连链路质量变差时,系统怎么判断“该让无人机2飞到哪个位置当中继”,中继链路建立之后怎么切换、怎么保持。

这两件事在Simulink里的建模方法和侧重点完全不同。链路仿真要的是信道模型、天线方向图、发射功率、接收灵敏度这些射频参数;协同决策要的是状态机、逻辑判断、路径规划、任务分配这些控制层面的内容。

我的建议是:一开始不要把两者揉在一个模型里,否则模型会变得极其庞杂,仿真跑一步慢得要死,调试起来更是想哭。合理的做法是分层建模——底层用Simulink的通信工具箱(Communications Toolbox)把物理链路搭出来;上层用Stateflow做中继决策逻辑;中间通过自定义的信号接口(比如结构体总线)传数据。

1.2 模型架构设计:把无人机抽象成什么

在Simulink里搞多无人机仿真,最常见的坑就是“一上来就建四旋翼的完整动力学模型”。如果你的重点是信号中继,那搞六自由度的气动模型完全是自找麻烦——模型复杂度爆表、参数标定困难、仿真步长受限,而通信逻辑的验证根本不需要这么细的飞行姿态。

我采用的是质点运动模型 + 通信载荷模型的方式:每架无人机在Simulink里用一个子系统表示,子系统内部包含三个核心模块:

  • 运动学模块:只算位置和速度,用简单的积分器实现,输入是速度指令,输出是经纬高坐标(或者局部ENU坐标)。
  • 通信载荷模块:算发射功率、天线增益、接收灵敏度、当前链路的信噪比。
  • 中继决策模块:根据链路质量判断“我当前直连信号行不行”“要不要当中继节点”“中继目标是谁”。

这样的抽象方式,既保留了多机协同和链路质量评估的核心逻辑,又不会让模型复杂度失控。实际过程中,我用这套简化模型把10架无人机同时仿真的情况跑得很轻松,效率比带气动的完整模型高出好几个数量级。

1.3 坐标系与数据交互的统一问题

多机协同仿真里最容易出Bug的地方就是坐标系不统一。我当时吃过亏:地面站位置用的是经纬度,无人机位置算的是局部东北天坐标,信道模型里算距离的时候没有转成同一坐标系,导致中继决策逻辑得到的链路距离完全错误,仿真结果惨不忍睹。

所以建模第一步,统一坐标系。我建议在Simulink里面用MATLAB Function封装一个坐标转换模块,把经纬高全部转成以地面站为原点的ENU直角坐标。然后所有距离计算、信道计算、中继决策全部在这个ENU坐标系下进行,只有做任务规划的时候再转回经纬度。这一点看起来不起眼,但直接决定了整个模型能不能用。

2. 核心链路建模:信道模型与无人机的“信号体质”

2.1 中继为什么会有效果?先看自由空间路径损耗

要说清楚中继建模,必须先回到最基础的链路预算公式。在自由空间中,信号的传播损耗可以简化为:

[ Loss = 20 \log_{10}(d) + 20 \log_{10}(f) + 20 \log_{10}(\frac{4\pi}{c}) ]

其中 d 是收发距离(米),f 是载波频率(赫兹),c 是光速。这个公式告诉我们一个特别直白的事实:距离每翻一倍,损耗增加约6dB。如果直连距离是20公里,某段中继把每跳距离缩短到5公里,那么每一跳的损耗比直连要低12dB——在无线通信里,12dB的收益是极其可观的,往往意味着链路由完全不可用变成了稳定高码率传输。

我在模型里实现的时候,用的是Simulink的“自由空间路径损耗”模块(在Communications Toolbox里直接有),输入是距离和载波频率,输出是损耗值dB。这个模块还支持双径地面反射模型,精度更高一点。实测下来,在城市低空或者丘陵地形场景里,双径模型更接近真实情况,因为低空无人机信号会有较强的地面反射路径。

2.2 接收灵敏度和发射功率:决定“能不能通”的关键参数

搞中继建模的另一个核心参数是接收灵敏度。也就是说,接收机最低需要多少功率才能解调出信号。无人机图传和数传的接收灵敏度一般在 -90dBm 到 -105dBm 之间,看调制方式和码率而定。

链路预算的简化公式就是:

[ P_{rx} = P_{tx} + G_{tx} + G_{rx} - Loss_{path} - Loss_{margin} ]

其中 ( P_{rx} ) 是接收功率(dBm),( P_{tx} ) 是发射功率(dBm),( G_{tx} ) 和 ( G_{rx} ) 是收发天线增益(dBi),( Loss_{path} ) 是路径损耗(dB),( Loss_{margin} ) 是我们人为预留的衰落余量(dB)。

这个公式在Simulink里面实现非常方便,直接用求和模块加加减减,或者写一个MATLAB Function模块几行代码就够了。重点是余量的选择:固定翼无人机巡检场景,我习惯预留 15-20dB 的衰落余量;城区多径严重的场景得留到 25dB 以上。这个余量直接决定了链路可用概率,也是中继决策逻辑判定的核心依据。

2.3 用误码率或者信噪比作为“链路健康度”指标

在Simulink里面做真实误码率仿真可以,但速度会很慢,因为需要传输实际的数据波形。如果你主要想验证中继逻辑,其实更高效的做法是用信噪比(SNR)或者信噪比余量来等效判断链路质量。

我的做法是:在接收端根据接收功率和接收机噪声底噪算出SNR,然后用一个查表模块(Lookup Table)把SNR映射成当前调制编码方式下的误码率。这样既保留了物理层的核心特征(SNR决定链路质量),又避免了逐比特级仿真的计算开销。

噪声底噪的计算公式是:

[ N = kTB + NF ]

其中 k 是玻尔兹曼常数,T 是等效噪声温度(一般取290K),B 是信道带宽(Hz),NF 是接收机噪声系数(dB)。举一个实例:20MHz带宽、噪声系数3dB的接收机,底噪大约是 -101dBm。如果接收功率是 -85dBm,那么SNR就是16dB。在QPSK调制下,这个SNR已经能获得很低的误码率,链路健康度自然就是“优”。

3. 中继决策逻辑建模:Stateflow如何实现“接力”

3.1 把“接力”这件事拆解成状态机

多机接力信号中继,从逻辑层面拆解,无非就几个状态:

  • 直连模式:无人机直接跟地面站通信,链路质量好,不需要中继。
  • 中继请求模式:直连链路质量低于阈值,系统开始搜索可用的中继节点。
  • 中继连接模式:选定一架或几架无人机作为中继节点,源节点通过中继链路跟地面站通信。
  • 中继切换模式:当前中继链路也恶化时,切换到另一架更合适的中继节点,或者调整中继节点的位置。

在Simulink里面,这个状态机用Stateflow来搭最合适。我用Stateflow的原因有两个:第一,它能很直观地画出状态转移图,逻辑一目了然,后面要改判定条件也方便;第二,Stateflow可以直接读写Simulink里的信号,跟飞行控制、通信载荷模型对接不需要写一堆晦涩的接口代码。

3.2 最优中继节点选择的判定逻辑

多机中继最核心的算法就是“选谁当中继”。这一步我推荐用最小化等效路径损耗的思路。也就是说,对每一架候选中继无人机计算:

[ Cost = Loss(d_{source \to relay}) + Loss(d_{relay \to ground}) + C_{relay} ]

其中 ( C_{relay} ) 是引入额外中继节点带来的处理时延和硬件损耗代价(一个经验值,比如3dB)。选出Cost最小且满足SNR阈值的无人机作为中继节点。

这里有一个经验:不能只看单跳距离之和最小,因为中继节点本身的接收灵敏度、天线增益也可能不同(比如吊舱安装角度不一致导致方向图差异)。所以更稳妥的做法是,用每两跳分别计算接收功率,然后取两者中较差的作为瓶颈链路,选择那个让瓶颈链路最优的节点。

在Simulink里实现这个逻辑,我用了MATLAB Function模块来写这个选择算法,输入是一个数组(所有候选节点的链路功率/SNR信息),输出是最优中继节点的ID。数组在MATLAB Function里操作很方便,用max或者是find函数就能轻松选出最优节点。这里正好呼应了大家搜过的“simulink的数组读”这个操作——用MATLAB Function处理数组,比在Simulink里拉一堆selector模块要高效得多。

3.3 中继切换的迟滞保护:防止频繁切换翻车

状态机建模里面最容易被忽略的问题是“抖振”。如果中继判定阈值设得太紧,无人机稍微动一下,SNR刚刚越过阈值,系统马上切换中继;结果飞机姿态一变,SNR又回去了,又切回来——这样中继链路会在极短时间内反复切换,通信链路直接被切碎。

解决办法是引入迟滞比较。切换条件是SNR低于阈值A(比如10dB)持续超过5秒;同时只有当SNR恢复到阈值B(比如15dB)以上时,才允许切回直连模式。A和B之间留出迟滞区间,避免频繁切换。

在Stateflow里实现这个迟滞逻辑非常顺手,只要在状态转移条件里分别给切换阈值和恢复阈值,再配合after(n, tick)这类时间逻辑就能搞定。我强烈建议所有做中继模型的人都把这个机制加上,否则你的仿真结果在链路边界附近会疯狂抖动,完全没法看。

4. 多机协同与动态部署:让中继节点“动起来”

4.1 中继节点不是停在那里的:动态位置调整建模

如果说静态中继是“树一个信号塔在天上”,那么动态中继就是“信号塔长了脚,会自己跑到需要的地方去”。这也是多机接力中继最核心的优势——中继无人机可以根据源节点和地面站的相对位置变化,实时调整自己的悬停位置,始终保持最优的链路几何。

我在建模里将中继节点的位置控制作为一个独立的子系统来设计。子系统输入是源节点和地面站的位置,输出是中继节点的期望位置指令。期望位置的算法我用了比例分割法:让中继节点飞向源节点和地面站连线的中点,同时保持一定的高度偏移(比如高100米,以获得更好的视距概率)。

在Simulink里这个模型实现起来就是简单的代数运算:先求源节点和地面站的坐标差,然后乘以0.5系数,再加上地面站坐标就得到了中点位置。把中点位置输入到无人机的运动学子系统里,通过简单的比例-积分控制器(或者直接写一个P控制器)就能让无人机平滑地飞往目标点。实测下来,这个P控制器的比例系数取0.3-0.5比较合适,太大了中继节点会冲过头,太小了又跟不上源节点移动的速度。

4.2 多中继级联:最远能传多远?用几何运算算清楚

如果你需要覆盖更长的距离,单级中继就不够了,得考虑多级中继——A传到B,B传到C,C再传到D。这种场景在Simulink里面建模并不复杂,关键是要把中继节点的角色定义清楚:一架无人机可能同时是上一跳的接收端和下一跳的发射端,信号在它内部的转发延迟和噪声底噪需要额外建模。

多级中继的链路预算很简单,就是每一跳的接收功率都要大于接收灵敏度。假设每一跳的发射功率相同,天线增益相同,那么每一跳的最大距离就是一样的,叫做最大单跳距离。如果是N级中继,理论覆盖距离就是N乘以最大单跳距离。当然,这是理论上限,实际要考虑中继节点自身的处理时延和底噪恶化,一般每跳预留3-5dB的余量。

在模型里,我专门做了一组增益连接的级联计算表,输入是中继级联数量、单跳距离、频率、发射功率,输出是总接收功率和各级SNR。这样一个电子表格式的计算模块配合Simulink的仿真循环,就能很方便地分析“到底需要几架无人机才能实现30公里的信号接力覆盖”。

4.3 失效保护:中继节点突然掉线怎么办

多机协同中继还有一关要过:中继无人机本身也可能出问题——电量不足、电机故障、被风吹偏位置、甚至失联坠机。所以在模型中必须包含失效保护逻辑。

我在Stateflow里增加了一个“链路健康监控”并行状态机,当发现中继链路的SNR持续恶化超过一定时间(比如30秒),或者接收不到中继节点的遥测心跳包时,自动触发两条处理路径:

一是立即切换到备用中继节点(前提是列表里还有满足条件的候选节点);二是如果备用节点也没有,就尝试让源节点降低码率(降低对链路SNR的要求),保持最低限度通信。

这个逻辑在Simulink中用Event触发机制来处理很舒服——当失效事件发生时,Stateflow广播一个事件给所有中继节点子系统,让它们更新任务状态。实测中这种触发方式比每个周期查询标志位要可靠得多,不会出现因为仿真步长恰好错过状态变化而漏掉失效处理的情况。

5. 联合仿真与FMU导出:从模型到实物的最后一公里

5.1 把模型跟飞控/可视化环境结合起来

只做算法验证的话,纯Simulink模型已经够用了。但如果你想让整个中继逻辑跟无人机的飞控行为联合起来,做更逼真的系统级验证,那就需要联合仿真了。最近经常有朋友问“simulink如何导出fmu模型”和“simulink外部模式”,这两个操作在无人机中继仿真的落地阶段非常关键。

导出FMU(Functional Mock-up Unit),本质上就是把你在Simulink里搭好的中继决策逻辑打包成一个独立的功能单元,可以导入到其他的仿真环境(比如PX4的软件在环仿真、物理引擎平台、自定义的仿真车台)中使用。做法是在Simulink里找到“导出FMU”的菜单,配置一下求解器,选择固定步长,最后生成FMU文件。注意,生成FMU前必须把模型中所有通信模块替换为等效的抽象函数,否则生成出来的FMU会自带一堆射频级仿真负载,在别的环境里跑不动。

外部模式(External Mode)则适合在硬件在环场景中使用——模型跑在目标硬件(比如NVIDIA Jetson板卡或者树莓派)上,Simulink从宿主机上实时观测和调参。我之前做中继节点机载程序的原型验证时,就用外部模式实时调整了中继切换的SNR阈值,效果很直观——参数改完看波形曲线立刻反馈,比反复烧录固件省了太多时间。

5.2 代码生成与部署:能不能直接上真机?

做仿真的最终目标多半是想上真机。Simulink的Embedded Coder可以将你的中继决策逻辑——尤其是Stateflow状态机直接生成C/C++代码,烧进飞控或者机载计算机里。

这一步有几个关键的“为什么”需要解释:

第一,为什么很多人会卡在代码生成这一步?因为中继决策模型里只要混入了通信工具箱的调制解调模块,Embedded Coder就无法直接生成嵌入式代码,必须把这些模块替换成等效的C代码版本。所以我从一开始建模时,就把“硬件部署”作为约束条件,所有跟射频相关的部分都封装在S-Function模块或者MATLAB Function模块中,避免代码生成时不可转换。

第二,为什么求解器配置极其重要?生成嵌入式代码前,Simulink要求求解器必须是固定步长,且推荐使用离散求解器。如果模型里还有连续积分器(比如运动学模块),需要设置合适的采样时间,否则生成的代码在频率响应上会跟仿真结果不一致。我自己一般把中继决策逻辑的采样时间设为0.5秒,链路监测的采样时间设为1秒,这样生成的嵌入式代码实时性完全足够,又不会太折腾处理器资源。

5.3 模型降阶:真机上跑不动怎么办

最后分享一个我在实际项目中反复用到的技巧——模型降阶。完整版的中继模型(尤其是带了物理层、跟飞控联合仿真、再叠加上多机编队控制)跑在真机上往往负载过高,这时候就需要对模型做“降阶处理”。

降阶的大原则只有一句话:精简非核心环节的物理精度,保留关键决策逻辑。

以我的中继项目为例,做了三个降阶操作:一是把SNR计算里的双径模型换成自由空间模型——中继链路本来就要求视距,双径反射的影响在逻辑层面没那么敏感;二是把最优节点选择的滑动窗口从10帧降到3帧——少算了历史数据,但切换稳定性靠迟滞保护兜底;三是把链路监测的感知周期从0.1秒放宽到0.5秒——牺牲了一点反应速度,换来了整机负载的大幅下降。

实测下来,完整版模型在单板上CPU占用率超过80%,降阶之后降到了30%以下。而最关键的中继决策结果——正确选择中继节点、正确切换链路——几乎没有差别。

6. 常见问题与排查技巧实录

整个建模过程中,我遇到过不少让人抓狂的问题。整理几个高频问题做成速查表,给大家参考:

问题现象根本原因排查方法解决方案
中继节点选择结果反复跳变中继判定阈值过紧,没有迟滞保护查看SNR波形,观察切换频繁的时间点引入滞后比较区间,切换和恢复阈值分开
仿真速度极慢使用了通信工具箱的物理层波形模块查看各子系统的耗时占比用SNR和查表模块替代真实波形调制解调;改为离散求解器
链路质量计算结果异常坐标系不统一,距离计算错误分别输出距离值和SNR值,用单独脚本核对统一使用ENU直角坐标,封装坐标转换模块
代码生成失败使用了不可生成嵌入式代码的通信模块查看代码生成准备诊断(Configuration Diagnostics)用S-Function封装射频功能,或者用抽象函数替代
中继切换存在延迟更新时间或事件触发机制设置不当在Stateflow中使用事件断点改用事件触发方式,缩短链路监测周期
多机协同位置保持出问题中继节点的位置控制器没有限制速度/加速度查看位置误差曲线是否超调给位置控制器增加速度饱和限制,合理设置比例系数

这里再补一个特别值得说的技巧:排查Simulink模型问题,一定不要直接在模型里到处点来点去。我建议在模型里预埋一批重要的中间量输出(比如每架飞机的SNR、中继状态的数字量ID),然后用“信号记录”工具在仿真结束后集中分析。特别是在Stateflow配合大量子系统的情况下,预埋观测信号定位问题的效率远高于临时拉线。

还有一个避坑心得是关于“变步长还是固定步长”的选择。如果你主要做逻辑仿真(中继决策、多机协同),用变步长求解器可以极大加速仿真。一旦你要做代码生成或者跟外部环境实时交互,必须切成固定步长。我踩过坑:在变步长下仿真一切正常,切换到固定步长后中继切换逻辑出现意外延迟,排查了半天才发现是二阶运动学子系统在固定大步长下数值不稳定。最后把运动学模块的采样时间设为0.1秒,问题才彻底解决。

结尾

最后说点实在的。多机接力信号中继这种仿真项目,最容易陷入的误区就是贪多求全——一会儿想加物理层细节,一会儿想搞编队控制,一会儿又想整完整的通信协议仿真。但真正的核心永远只有两个:链路预算算得准不准,中继决策逻辑稳不稳。把这两件事做好了,你的模型就能支撑绝大多数工程验证和方案评估。建模过程中,架构先行、统一坐标系、预埋观测信号,这是我实操下来最重要的三条经验,分享给所有正在折腾的小伙伴。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 11:13:36

得物交易搜索生成式召回:从向量检索到条件生成的范式跃迁

1. 从“卷向量”到“拼生成”:交易搜索召回到底在卷什么做电商搜索的同行这两年应该都有同感:向量检索这条赛道已经卷到不能再卷了。双塔模型、ANN索引、HNSW参数调优、量化压缩,能榨的油水基本榨干了。得物交易搜索团队这次抛出的“生成式召…

作者头像 李华
网站建设 2026/10/3 11:12:42

DeepSeek Harness桌面端发布:从安装配置到内网部署全指南

1. 桌面端来了,为什么这件事比想象中重要 DeepSeek Harness 出官方桌面端这件事,我第一反应不是“终于有 GUI 了”,而是“终于不用再跟终端里的环境变量和路径打架了”。如果你最近在技术社区里刷到过 DSH、dsh 桌面端、deepseek harness 安装…

作者头像 李华
网站建设 2026/10/3 11:11:58

AI漫剧产业爆发下的法律困局与合规突围实操指南

1. AI漫剧到底在爆发什么:从产能革命到版权迷雾AI漫剧这个词,最近半年在内容圈里出现的频率高得离谱。我身边做短剧的朋友、做网文的朋友、甚至做传统动画外包的朋友,几乎都在讨论同一件事:用AI把漫画和剧集的生产流程重做一遍。所…

作者头像 李华
网站建设 2026/10/3 11:11:41

基于OpenAI Agents-API构建企业级数据分析师Agent实战

我接到这个标题的时候,第一反应是:又一个想用大模型做取数的项目。但真正动手做过企业级数据平台的都知道,卡住你的从来不是“大模型能不能写对SQL”这件事,而是“写完SQL之后谁敢直接让它执行”。这篇文章我结合最近几个月在真实…

作者头像 李华
网站建设 2026/10/3 11:09:47

HFSS与SIwave在EMC仿真中的分工与协同

1. 这不是“点几下就能出结果”的仿真——电磁兼容仿真的真实门槛在哪里 很多人第一次打开ANSYS Electronics Desktop,新建一个HFSS项目,画个PCB板、加几个器件、设置个激励、点“Analyze”,等半小时后弹出一串红色报错:“Solutio…

作者头像 李华
网站建设 2026/10/3 11:09:47

山林寻宝小游戏开发:Vibecoding 与单相机多视角切换技术解析

这次我们来看一个典型的 Vibecoding 小项目:山林寻宝小游戏。玩法本身很容易理解,玩家在一片山林场景里移动、探索地图、避开障碍、寻找散落的宝藏。真正值得拆解的技术点是标题里的后半句——单相机多视角切换。整局游戏只维护一台相机,通过…

作者头像 李华