3. 地面站测试环境搭建

地面站自动化测试的核心难点,不在于单个软件能否运行,而在于能否把被测地面站、仿真无人机/无人车、通信链路模拟器、时钟同步、供电与网络隔离这六个要素集成为一个稳定、可重复、可复用的测试台架。台架搭得好,后续所有自动化用例才有意义;台架搭得差,测试结果会充满随机失败,让人分不清是软件缺陷还是环境抖动。本节围绕“集成方法”展开,重点讲清楚各要素之间的连接关系、关键参数和隔离边界。

一、台架的总体结构

一个典型的地面站自动化测试台架,可以按“被测对象—链路—仿真对象—支撑设施”四层来理解。被测地面站(GCS)是测试目标,通常运行在独立主机或虚拟机上,通过串口、UDP/TCP 或 CAN 总线与外部交互。仿真无人机/无人车负责产生符合协议的真实数据流,替代真实飞行器。通信链路模拟器串接在地面站与仿真对象之间,用于注入时延、丢包、抖动和带宽限制。时钟同步为日志对齐和时序断言提供统一时间基准。供电与网络隔离则保证测试环境不受外部干扰,也避免测试故障影响生产网络。

被测地面站 GCS 航线规划 / 遥测显示 指令下发 / 告警处理 日志记录 / 状态管理 通信链路模拟器 时延 / 丢包 / 抖动 带宽限制 / 断链注入 协议透明转发 仿真无人机/无人车 动力学模型 / 传感器模型 MAVLink / 自定义协议 故障注入 / 场景脚本 遥测/指令 遥测/指令 时钟同步 PTP / NTP 统一时间基准 日志时间戳对齐 时序断言与延迟测量 供电与网络隔离 独立 VLAN / 物理网段 程控电源 / 电压监测 防火墙规则 / 端口白名单 测试执行器 用例调度 断言判定 报告生成 集成要点: ① 链路模拟器串接在 GCS 与仿真对象之间,保持协议透明;② 时钟同步覆盖所有节点,日志时间戳统一; ③ 供电与网络隔离保证测试环境独立,避免外部干扰;④ 测试执行器通过 API 驱动各组件,实现用例自动化。

二、被测地面站的接入方式

被测地面站接入台架时,首先要明确它的对外接口类型。常见的有三类:串口(如 RS-232/USB 转串口)、网络(UDP/TCP)和总线(CAN)。以 MAVLink 协议为例,地面站通常通过 UDP 14550 端口接收遥测、发送指令。接入时建议在台架中固定 IP 和端口,例如地面站监听 192.168.10.10:14550,仿真对象发送到该地址。如果地面站支持多链路,应分别配置并记录,避免自动化脚本切换时混淆。

地面站本身应运行在独立主机或虚拟机上,关闭无关的自动更新、防火墙弹窗和后台同步服务。对于需要人工确认的对话框,应在测试前通过配置或脚本关闭,否则自动化用例会在弹窗处卡死。建议为地面站准备一份“测试专用配置”,与生产配置隔离,配置项包括:默认链路地址、日志级别、告警阈值、地图缓存路径等。

三、仿真无人机/无人车的配置

仿真对象的选择取决于测试目标。如果测试地面站的航线规划与遥测显示,可以使用轻量级仿真器(如 ArduPilot SITL 或 PX4 SITL),它们能产生真实的 MAVLink 消息流。如果需要测试多机协同或编队,则要启动多个仿真实例,每个实例分配独立的系统 ID 和端口。例如:

# 启动 3 个 SITL 实例,系统 ID 分别为 1、2、3
sim_vehicle.py -v ArduCopter -I 0 --sysid 1 --out udp:127.0.0.1:14550
sim_vehicle.py -v ArduCopter -I 1 --sysid 2 --out udp:127.0.0.1:14560
sim_vehicle.py -v ArduCopter -I 2 --sysid 3 --out udp:127.0.0.1:14570

仿真对象还应支持故障注入,例如模拟 GPS 丢失、电池电压骤降、舵机卡死等。这些故障可以通过仿真器的参数接口或脚本触发,用于验证地面站的告警逻辑。建议把常用故障场景写成可复用的脚本,每个脚本包含触发条件、持续时间和恢复方式。

四、通信链路模拟器的集成

链路模拟器是台架中最容易被忽视但影响最大的环节。它串接在地面站与仿真对象之间,对数据包进行透明转发,同时注入时延、丢包、抖动和带宽限制。常用的工具有 Linux 的 tc netem、WANem 或专用硬件模拟器。以 tc netem 为例,可以在网桥上添加规则:

# 在 eth1 上注入 100ms 时延、5% 丢包、20ms 抖动
tc qdisc add dev eth1 root netem delay 100ms 20ms loss 5%

集成时要注意:链路模拟器应支持双向规则,即上行和下行可以独立配置;规则切换后要有明确的生效确认,避免旧规则残留。对于自动化测试,建议通过 API 或命令行动态修改规则,而不是手动操作界面。每次用例执行前,应把链路状态重置为“理想链路”,再按用例需要逐步注入损伤。

五、时钟同步与供电网络隔离

时钟同步的目标是让地面站日志、仿真对象日志和链路模拟器日志拥有统一的时间基准。推荐使用 PTP(IEEE 1588)获得亚毫秒级同步;如果条件有限,NTP 也可接受,但精度通常在毫秒级。同步后,所有节点的时间戳应能直接比较,用于判断“指令下发到遥测更新”的端到端延迟。例如,地面站日志记录指令发送时间为 10:00:00.120,仿真对象记录接收时间为 10:00:00.135,则链路延迟约 15ms,可与链路模拟器配置的 100ms 时延对比,判断是否存在额外排队或处理延迟。

供电与网络隔离方面,建议为台架配置独立的程控电源,能够远程控制通断电并监测电流。网络隔离通过独立 VLAN 或物理网段实现,只允许测试所需的端口通信。例如,只放行 UDP 14550-14570 和 SSH 22,其余端口一律拒绝。这样既能防止外部干扰,也能在测试异常时快速定位是网络问题还是软件问题。

六、可复用台架的交付物

为了让台架可复用,建议交付一份“台架配置清单”,记录每个组件的 IP、端口、版本、启动命令和关键参数。以下是一个示例片段:

组件地址/端口关键参数启动方式
被测地面站192.168.10.10:14550日志级别 DEBUG手动启动
仿真无人机 1127.0.0.1:14550sysid=1, 机型 ArduCoptersim_vehicle.py
链路模拟器网桥 br0时延 100ms, 丢包 5%tc netem 脚本
时钟同步PTP 主时钟域 0, 同步周期 1sptp4l 服务
程控电源192.168.10.5012V/5A, 电流监测SCPI 命令

有了这份清单,任何团队成员都能在半小时内重建台架,而不是依赖某个人的记忆。台架搭建完成后,建议先跑一组“冒烟用例”:地面站能收到遥测、能发送指令、链路模拟器规则生效、时钟偏差小于 1ms、电源电流正常。这组用例通过后,再开始执行正式的自动化测试用例。

台架集成时,建议把“理想链路”作为默认状态,所有损伤注入都通过用例显式开启。这样当用例失败时,可以快速判断是软件缺陷还是链路损伤导致的预期行为。
网络隔离不要只依赖地面站主机的防火墙,应在交换机或虚拟网桥上设置规则。否则地面站主机被重装或配置被覆盖后,隔离会失效,可能影响生产网络。