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:以 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 回环流量。
--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) | 随下潜指令变化 | 深度传感器未使能 |