3. QGC连接无人船仿真环境

在真正把无人船放进水里之前,先在电脑里跑一个“虚拟船”,是成本最低、风险最小的调试方式。QGroundControl(下称 QGC)本身并不产生仿真数据,它通过 MAVLink 协议与一个运行在本地或局域网中的飞控仿真器通信。ArduPilot 提供的 SITL(Software In The Loop)就是这样一个仿真器:它在普通 PC 上编译并运行 ArduRover(地面/水面车辆固件)或 ArduSub(BlueROV 等水下机器人固件)的完整飞控代码,把传感器、执行机构、船体动力学都用软件模型替代,从而让 QGC 以为自己在和一艘真船对话。本节要完成三件事:把 SITL 跑起来、让 QGC 连上它、并在 QGC 里确认船体姿态与传感器数据是合理的。

一、先理解连接链路:谁在仿真,谁在显示

很多初学者会把“QGC 连不上”误判为 QGC 的问题,其实链路是分层的。SITL 进程内部运行着飞控固件,固件通过一个虚拟串口或 UDP 端口对外输出 MAVLink 消息;QGC 作为地面站,通过 UDP(默认 14550 端口)接收这些消息,并把控制指令回传。理解这条链路,排障时才能定位到“是仿真没起来”“是端口没对上”还是“是 QGC 的链路配置错了”。下图把这条链路和本节要检查的关键数据项放在一起,便于对照。

SITL 仿真与 QGC 的连接链路及检查点 SITL 仿真进程(本机) ArduRover / ArduSub 固件 完整飞控代码在 PC 上运行 传感器模型 IMU / 磁罗盘 / GPS / 深度 船体动力学模型 推力、阻力、姿态响应 MAVLink 输出端口 UDP 14550(默认) 遥测上行 指令下行 MAVLink QGroundControl 通信链路配置 UDP 端口 / 自动连接 船体姿态显示 横滚 / 俯仰 / 航向 传感器数据面板 电压、GPS 星数、深度 解锁与模式状态 DISARMED / MANUAL 等 连接后必查项 心跳包持续 姿态角合理 航向随转动变化 GPS 定位有效 电压读数正常 模式可切换 无预解锁报错

二、搭建 SITL:以 ArduRover 为例

在 Windows 上最省事的方式是使用 Mission Planner 自带的 SITL 启动器,或使用 ArduPilot 官方提供的 WSL/Ubuntu 环境;在 Linux 与 macOS 上则可以直接用 sim_vehicle.py 脚本。以 Ubuntu 为例,先克隆 ArduPilot 仓库并切到稳定分支,然后执行启动脚本。下面是一组典型命令,参数含义在注释中说明:

# 进入 ArduPilot 源码目录
cd ~/ardupilot

# 启动 Rover 的 SITL,-v 指定车型,--console 打开 MAVProxy 控制台
# -L 指定初始位置(这里用默认的 CMAC 场地)
sim_vehicle.py -v Rover -L CMAC --console --map

# 若要做水下机器人仿真,把车型换成 Sub
# sim_vehicle.py -v Sub -L CMAC --console --map

启动成功后,终端会持续滚动输出飞控的启动日志,最后出现类似 Ready to ARM 的提示,并显示 MAVProxy 的命令行。此时 SITL 已经在 UDP 14550 端口上广播 MAVLink 心跳。需要特别注意的是,sim_vehicle.py 默认会同时启动一个 MAVProxy 转发进程,它自己也会占用端口;如果 QGC 和 MAVProxy 抢同一个端口,就会出现“QGC 能连上但数据时断时续”的现象。稳妥的做法是让 MAVProxy 把数据转发到另一个端口,或在启动时加 --out=udp:127.0.0.1:14551,再让 QGC 监听 14551。

三、在 QGC 中建立连接

打开 QGC,进入“应用设置 → 通信链路”,新增一条 UDP 链路。若 SITL 与 QGC 在同一台机器上,监听端口填 14550(或上一步转发出的 14551),勾选“自动连接”。保存后回到飞行视图,正常情况下几秒内左上角会出现心跳指示,电池、GPS、姿态等控件从灰色变为有数据状态。如果一直显示“未连接”,按以下顺序排查:确认 SITL 终端仍在运行且没有报错退出;用 netstat -anu | grep 14550 确认端口处于监听状态;检查 QGC 链路里填的端口是否与 SITL 输出端口一致;最后确认本机防火墙没有拦截 UDP 回环流量。

SITL 默认的初始位置在 CMAC 场地(澳大利亚),GPS 坐标是固定的。若你的任务规划基于本地水域,可在启动时用 --location 指定经纬度,或在 QGC 的“仿真”菜单中直接设置初始位置,避免后续航点距离计算出现明显偏差。

四、检查船体状态与传感器数据

连接成功只是第一步,真正要确认的是“这艘虚拟船的状态是否可信”。在 QGC 的飞行视图中,重点看四类信息。第一是姿态:横滚与俯仰在静止时应接近 0°,航向应稳定在初始值附近;用手动方式在 MAVProxy 控制台输入 arm throttle 解锁后给一点推力,观察姿态是否平滑变化而不是跳变。第二是 GPS:SITL 默认会模拟出 3D 定位,星数通常在 10 颗以上,若显示 0 颗或“无定位”,说明 GPS 模型未启用或初始位置未注入。第三是电源:SITL 会模拟电池电压,默认在 12.6V 左右缓慢下降,若读数长期不变或为 0,说明电源模型参数需要检查。第四是模式与解锁状态:在“飞行模式”下拉框中应能切换到 MANUAL、HOLD、AUTO 等模式,切换后状态栏应同步更新。

对于 BlueROV 这类水下平台,还要额外关注深度与漏水检测通道。ArduSub 的 SITL 会模拟深度传感器,在 QGC 的“传感器”页面可以看到深度值随下潜指令变化;若深度始终为 0,通常是 SIM_ 参数中的深度传感器未使能。下表给出一组示例判据,数值为教学示例,实际以你所用的固件版本与模型参数为准。

检查项 正常表现(示例) 异常时的常见原因
心跳 1Hz 持续,无中断 端口冲突、SITL 已退出
横滚/俯仰 静止时接近 0°,变化平滑 IMU 模型未初始化
航向 随转向指令连续变化 磁罗盘模型未使能
GPS 星数 ≥10 颗,3D 定位 初始位置未注入
电池电压 约 12.6V 并缓慢下降 电源模型参数缺失
深度(Sub) 随下潜指令变化 深度传感器未使能

五、把“能连上”变成“可复现”