手把手教你学Simulink--无人机自组网(Ad Hoc)路由协议验证
一、为什么要在Simulink里做路由验证
NS-3、OPNET适合大规模协议细节验证,但Simulink的优势在于:
- 能和飞控、任务调度、通信链路放在同一时间轴上;
- 适合做通信—控制耦合验证;
- 方便后续接硬件在环或半实物仿真。
所以这里的目标不是完整复现RFC 3561,而是建立一个可验证、可对比、可扩展的Ad Hoc路由仿真骨架。
二、系统架构
┌──────────────────────────────────────────────┐ │ 场景层:N架UAV三维轨迹 / 任务流 │ └──────────────────────┬───────────────────────┘ ↓ ┌──────────────────────────────────────────────┐ │ 物理层:距离、路径损耗、SNR、连通性 │ └──────────────────────┬───────────────────────┘ ↓ ┌──────────────────────────────────────────────┐ │ 路由层:邻居发现 / AODV / OLSR / GPSR │ └──────────────────────┬───────────────────────┘ ↓ ┌──────────────────────────────────────────────┐ │ 转发层:多跳路径、队列、丢包、重传 │ └──────────────────────┬───────────────────────┘ ↓ ┌──────────────────────────────────────────────┐ │ 评估层:PDR、时延、跳数、开销、连通率 │ └──────────────────────────────────────────────┘三、无人机移动性建模
FANET和地面MANET最大区别在于三维高速移动。 拓扑变化会直接触发路由重建。
function [pos, vel] = uav_mobility_update(pos, vel, dt, vmax, area) % 简化Random Waypoint三维移动 N = size(pos, 1); for i = 1:N if norm(vel(i,:)) < 1e-6 || any(pos(i,:) > area) || any(pos(i,:) < 0) dest = rand(1,3) .* area; dir = dest - pos(i,:); d = max(norm(dir), 1); vel(i,:) = (dir/d) * (vmax * (0.5 + 0.5*rand)); end pos(i,:) = pos(i,:) + vel(i,:) * dt; pos(i,:) = max(0, min(pos(i,:), area)); end endSimulink里可以用MATLAB Function + Bus传递每架UAV的位置、速度、ID和状态。
四、空-空链路建模
链路是否可用取决于距离、路径损耗和SNR。
function [adj, snr_mat] = air_to_air_links(pos, comms_range, tx_power, noise_floor, fc) N = size(pos, 1); adj = false(N); snr_mat = zeros(N); c = 3e8; for i = 1:N for j = i+1:N d = norm(pos(i,:) - pos(j,:)); if d < 1 continue; end fspl = (4*pi*d*fc/c)^2; rx_power = tx_power / fspl; snr = rx_power / max(noise_floor, 1e-30); snr_mat(i,j) = snr; snr_mat(j,i) = snr; if d <= comms_range && snr > 10 % SNR门限可配置 adj(i,j) = true; adj(j,i) = true; end end end end更严谨时可以把自由空间损耗换成3GPP空地路径损耗,或加入Rician衰落。
五、AODV路由协议核心逻辑
AODV是按需路由:有数据要发、且没有有效路由时,才发起路由发现。 它包含四个关键信令:
| 信令 | 作用 |
|---|---|
| RREQ | 源节点广播寻路 |
| RREP | 目的节点或有路由的节点回传路径 |
| HELLO | 周期邻居保活 |
| RERR | 链路中断后通知上游 |
简化AODV实现
function [routes, overhead] = aodv_step(adj, src, dst, routes, hello_timer, dt) N = size(adj, 1); overhead = 0; % 1. 邻居发现 / HELLO维护 for i = 1:N neighbors{i} = find(adj(i,:)); hello_timer(i) = hello_timer(i) + dt; if hello_timer(i) > 1.0 overhead = overhead + length(neighbors{i}); hello_timer(i) = 0; end end % 2. 若已有有效路由,直接返回 if isfield(routes, 'path') && ~isempty(routes.path) if all(routes.path <= N) && all(routes.path > 0) return; end end % 3. 路由发现:BFS泛洪 RREQ visited = false(1, N); prev = zeros(1, N); q = src; visited(src) = true; rreq_count = 0; while ~isempty(q) cur = q(1); q(1) = []; rreq_count = rreq_count + 1; if cur == dst % 重建路径 path = dst; while path(end) ~= src path(end+1) = prev(path(end)); end path = fliplr(path); routes.path = path; routes.hops = length(path) - 1; routes.created = true; overhead = overhead + rreq_count; return; end for nb = neighbors{cur} if ~visited(nb) visited(nb) = true; prev(nb) = cur; q(end+1) = nb; end end end % 4. 未找到路径,触发RERR routes.path = []; routes.hops = 0; routes.created = false; overhead = overhead + rreq_count + 1; end如果要对比OLSR,可以把邻居发现改为MPR选择 + 周期拓扑广播。
六、数据转发与性能统计
路由表给出路径后,数据转发可以简化为逐跳传输模型。
function [metrics] = forward_packets(adj, routes, num_pkts, hop_delay, drop_prob) delivered = 0; total_delay = 0; total_hops = 0; for k = 1:num_pkts if isempty(routes.path) || ~routes.created continue; end path = routes.path; hops = length(path) - 1; % 每跳独立丢包 drop = false; for h = 1:hops if rand < drop_prob || ~adj(path(h), path(h+1)) drop = true; break; end end if ~drop delivered = delivered + 1; total_delay = total_delay + hops * hop_delay; total_hops = total_hops + hops; end end metrics.pdr = delivered / max(num_pkts, 1); metrics.avg_delay = total_delay / max(delivered, 1); metrics.avg_hops = total_hops / max(delivered, 1); end七、Simulink模型搭建建议
推荐结构:
UAV Swarm Ad Hoc Routing ├── Scenario Generator │ └── UAV Mobility (MATLAB Function) ├── Channel & Link Layer │ └── Adjacency Matrix (MATLAB Function) ├── Routing Engine │ ├── AODV Subsystem │ ├── OLSR Subsystem │ └── Route Selector (Protocol Switch) ├── Traffic Generator │ └── CBR / Burst Traffic ├── Forwarding & Queue └── Performance Monitor ├── PDR ├── E2E Delay ├── Hop Count └── Control Overhead关键技巧:
- 用Bus Creator把每架UAV的位置、速度、ID打包;
- 用For Each Subsystem并行处理多节点邻居关系;
- 用Stateflow管理路由状态:Idle / Discovering / Active / Broken;
- 用To Workspace输出时序数据,MATLAB后处理画CDF和热力图。
八、建议仿真场景
| 场景 | 验证点 |
|---|---|
| 编队飞行 | 拓扑稳定时路由开销 |
| 随机分散探索 | AODV重发现频率 |
| 中继链路断裂 | RERR触发与路径恢复 |
| 节点失效 | 网络连通率变化 |
| AODV vs OLSR | 时延、开销、PDR对比 |
九、建议输出指标
仿真结束后至少输出:
- 分组投递率 PDR
- 端到端时延均值与P95
- 平均跳数
- 控制开销 / 数据分组比
- 路由重建次数
- 网络连通率随时间变化
- 三维拓扑动态图:活跃链路、断裂链路、当前路由路径
如果继续扩展,可以把路由输出接到编队一致性控制器里,验证“路由断裂—控制发散—路由恢复—编队重聚”的完整闭环;也可以把AODV的跳数度量替换成链路寿命、SNR、剩余能量,做成QoS感知或Q-Learning增强路由。