QGroundControl 模拟仿真工具实战:从 Mock Vehicle 到 ArduCopter SITL 的完整测试方案
发布时间:2026/10/15 2:09:54 锦皓数字建站

无人机智能硬件【免费下载链接】qgroundcontrolCross-platform ground control station for drones (Android, iOS, Mac OS, Linux, Windows)项目地址https://gitcode.com/gh_mirrors/qg/qgroundcontrol点击查看免费下载本指南系统讲解 QGroundControlQGC仓库自带的tools/simulation模拟测试工具集轻量级 MAVLink 模拟器mock_vehicle.py与基于 Docker 的 ArduCopter SITL 全仿真启动器run_arducopter_sitl.py。读完本文你将掌握在无实体飞控硬件的情况下完成 UI 测试、多载具联调、任务与地理围栏验证的完整方案包括参数含义、连接方式与底层实现原理。两条仿真路线速览官方文档将仓库内的仿真工具划分为两条互补的路线覆盖快速 UI 检查与完整集成测试两类场景工具适用场景环境准备mock_vehicle.pyUI 测试、快速检查python tools/setup/install_python.py devrun_arducopter_sitl.py完整仿真、任务测试需要 Dockermock_vehicle.py是一个最小 MAVLink 模拟器不模拟飞行动力学run_arducopter_sitl.py则启动真实的 ArduPilot 软件在环SITL固件支持任务、地理围栏与全部 MAVLink 命令。下面分别深入展开。Mock Vehicle轻量级 MAVLink 模拟器mock_vehicle.py源码见 tools/simulation/mock_vehicle.py是一个基于 pymavlink、协议版本为 MAVLink v2.0 的虚拟载具向 QGC 周期发送遥测数据并应答基本指令专门服务于界面开发与 UI 自动化测试。环境准备项目使用 uv 管理 Python 工具链依赖。执行以下命令创建/同步开发环境对应依赖组dev其中包含 pymavlink参见 tools/pyproject.toml 的dependency-groups定义python tools/setup/install_python.py dev安装脚本的具体行为见 tools/setup/install_python.py默认在tools/.venv创建虚拟环境并打印激活路径。运行模拟器前需先激活该环境或直接以tools/.venv/bin/python调用脚本。基本运行# UDP 模式QGC 自动连接本地 14550 端口 ./mock_vehicle.py # 多载具两个不同 System ID、不同端口的实例 ./mock_vehicle.py --system-id 1 --port 14550 ./mock_vehicle.py --system-id 2 --port 14551 # TCP 模式SITL 风格 ./mock_vehicle.py --tcp --port 5760 # 指定初始位置例如旧金山 ./mock_vehicle.py --lat 37.7749 --lon -122.4194命令行参数详解源码中main()的参数定义位于 mock_vehicle.py与文档一致并补充了--lat/--lon/--alt三个位置参数选项默认值说明--host127.0.0.1主机地址绑定/连接的 IP--port14550端口号--tcp关闭使用 TCP 而非 UDP--system-id1MAVLink 系统 ID多载具时须区分--rate10遥测发送频率Hz--sitl关闭SITL 兼容模式强制 TCP 连接 5760 端口忽略--port--lat/--lon/--alt苏黎世 47.3977, 8.5456, 100m初始经纬度与海拔米优先级高于环境变量从源码可见连接逻辑mock_vehicle.py中--sitl优先其次--tcp均调用connect_tcp建立tcp:host:port连接其余情况走connect_udp使用udpout:host:portpymavlink 的 UDP 主动输出模式。环境变量控制初始位置除命令行参数外脚本还支持三个环境变量见 mock_vehicle.pyMOCK_VEHICLE_LAT初始纬度默认 47.3977苏黎世MOCK_VEHICLE_LON初始经度默认 8.5456MOCK_VEHICLE_ALT初始海拔米默认 100命令行参数优先于环境变量环境变量又优先于内置默认值。模拟能力与 MAVLink 实现细节MockVehicle类维护一个VehicleStatemock_vehicle.py包含经纬高、姿态、地速空速、爬升率、电池电压/剩余电量、armed 状态、飞行模式默认 STABILIZE、GPS 定位状态默认 3D 定位、12 颗卫星等状态量。主循环run()mock_vehicle.py以 1Hz 发送心跳、按--rate指定的频率发送遥测并持续轮询处理入站命令。周期性遥测消息每条都对应一个明确的发送函数消息实现函数内容要点HEARTBEATsend_heartbeat载具类型 QUADROTOR、飞控标识 ArduPilotMega、根据 armed 状态叠加 SAFETY_ARMED 标志位、自定义模式码SYS_STATUSsend_sys_status传感器 present/enabled/health 全 1、50% 负载、电压mV、剩余电量GPS_RAW_INTsend_gps经纬度1e7 定点、高度mm、地速、航向、卫星数GLOBAL_POSITION_INTsend_global_position绝对/相对高度、三轴速度cm/s、航向ATTITUDEsend_attitude滚转/俯仰/偏航角与角速率VFR_HUDsend_vfr_hud空速、地速、航向、50% 油门、高度、爬升率BATTERY_STATUSsend_battery_status锂电池类型、电压序列、剩余电量HOME_POSITIONsend_home_position原点位置与姿态四元数指令应答handle_commands/handle_command_longmock_vehicle.pyMAV_CMD_COMPONENT_ARM_DISARM根据param1切换 armed 状态并回MAV_RESULT_ACCEPTEDMAV_CMD_REQUEST_AUTOPILOT_CAPABILITIES回发AUTOPILOT_VERSION固件版本 4.0.0并 ACKSET_MODE按内置模式映射表切换模式STABILIZE/ACRO/ALT_HOLD/AUTO/GUIDED/LOITER/RTL/LAND映射表见 mock_vehicle.pyPARAM_REQUEST_LIST回发参数列表SYSID_THISMAV、BATT_CAPACITY、BATT_LOW_VOLT、RTL_ALT见send_parameters状态演化update_simulationmock_vehicle.pyarmed 后航向每秒递增 1° 并沿航向缓慢漂移经纬度同时电池电量按 0.01%/tick 消耗、电压随之下降——这保证了 QGC 界面上的位置、航向与电量信息是活的。已知限制文档明确列出无飞行动力学模型、不执行任务mission、MAVLink 消息支持范围有限。因此它适合验证 UI 展示、命令链路与多载具界面而不适合验证任务规划的执行效果。ArduCopter SITL基于 Docker 的完整仿真当需要验证任务上传/下载、地理围栏以及完整 MAVLink 命令交互时应使用run_arducopter_sitl.py源码见 tools/simulation/run_arducopter_sitl.py。它启动真实 ArduPilot Copter 固件当前仓库配置版本为Copter-4.5.6镜像标签ardupilot-sitl-4.5.6见 run_arducopter_sitl.py的 SITL 进程具备完整的飞行动力学与任务执行能力。前置条件仅需本机安装 Docker含dockerCLI。模拟器启动前会检查本机镜像docker image inspect ardupilot-sitl-4.5.6若镜像不存在脚本会自动执行docker build构建基础镜像首次构建约需 10–15 分钟视网络与机器性能而定。运行与连接# 运行首次会自动构建镜像 ./run_arducopter_sitl.py # 附加模拟网络时延模拟 Herelink 图传链路场景 ./run_arducopter_sitl.py --with-latency # QGC 连接地址tcp://localhost:5760启动参数源码补充README 仅展示--with-latency从 run_arducopter_sitl.py 可见还有两个可选参数参数默认值说明--with-latency关闭通过tc netem注入 50ms±10ms 网络延迟模拟弱网链路--namearducopter-sitlDocker 容器名--timeout60等待 SITL TCP 5760 端口就绪的超时秒必须为正Docker 容器管理docker logs -f arducopter-sitl # 实时查看仿真日志 docker stop arducopter-sitl # 停止仿真 docker rm arducopter-sitl # 移除容器就绪检测与端口绑定的实现原理启动器的工作流程run_arducopter_sitl.py值得细读容器接管策略先检查同名容器是否存在仅当该容器带有所有权标签org.qgroundcontrol.sitltrue时才自动docker rm -f替换否则报错提示手动处理——这保证了脚本不会误删用户自己创建的容器。启动命令容器内执行arducopter -S --model --speedup 1 --defaults .../copter.parm --home 42.3898,-71.1476,14.0,270.0 --serial0 tcp:0:5760:wait并将127.0.0.1:5760:5760映射到宿主机tcp:0:5760:wait意味着 SITL 等待第一个 TCP 客户端连接。就绪检测技巧脚本并未抢占这个第一个连接一旦连接被消费QGC 就接不上了而是周期性执行docker exec ... cat /proc/net/tcp /proc/net/tcp6从容器内核对 TCP 表中查找本地端口5760十六进制:1680是否处于监听状态状态0A见 run_arducopter_sitl.py就绪后才提示用户连接。这正是文档末尾所述绑定 TCP 5760 端口并等待 guest 监听器就绪而不消耗其第一个客户端连接。时延注入--with-latency模式下为容器增加NET_ADMIN能力并改用 bash 入口先执行tc qdisc add dev eth0 root netem delay 50ms 10ms再 exec 启动 SITL 进程模拟端到端链路延迟Herelink 场景。失败清理启动失败时自动打印最近 20 行容器日志并删除异常容器便于排错。注意旧容器冲突README 特别提醒如果之前用同名如arducopter-sitl手动启动过 SITL 容器由于旧容器不携带org.qgroundcontrol.sitl所有权标签启动器不会自动替换需先用docker rm -f arducopter-sitl或改名显式清理后再运行本脚本。两种方案对比特性mock_vehicle.pyArduCopter SITL启动耗时秒级首次 10–15 分钟构建镜像依赖pymavlinkDocker飞行动力学❌✅任务执行❌✅地理围栏支持❌✅全部 MAVLink 命令❌✅资源占用低中等最佳场景UI 测试集成测试一句话选型开发界面、验证遥测显示与多载具 UI 用 Mock Vehicle验证任务、围栏与完整协议交互用 ArduCopter SITL。在 QGC 中连接模拟载具Mock VehicleUDP 模式QGC 默认支持 UDP 广播自动发现并连接常见设备参见 通信链路文档因此./mock_vehicle.py默认以 UDP 14550 运行后QGC 通常会自动连接无需任何手动配置。ArduCopter SITLTCP 模式SITL 走 TCP需要手动添加通信链路进入Application Settings应用设置→ Comm Links通信链路→ Add添加类型选择 TCPHost 填localhostPort 填5760保存并连接。QGC 支持 Serial/TCP/UDP/Bluetooth 四种链路类型其中 TCP 链路配置即主机地址 端口两项见 通信链路文档 的 Link Management 小节。若使用mock_vehicle.py --sitl或--tcp同样按 TCP 链路方式连接。附Mock NTRIP Caster 辅助工具同目录还提供了第三个工具mock_ntrip_caster.pytools/simulation/mock_ntrip_caster.py用于在没有真实差分基站或互联网的情况下测试 QGC 的 NTRIP 客户端对应 QGC 的 NTRIP 连接/挂载点设置界面参见 src/AppSettings/NtripConnectionSettings.qml 与 src/GPS/NTRIP 源码目录。它实现了一个简化 NTRIP Caster默认监听0.0.0.0:2101提供MOCK1、MOCK2、MOCK_AUTH三个挂载点source table 定义见脚本内SOURCE_TABLE交替推送 RTCM3 帧消息 1005基准站 ARP 坐标与 1077GPS MSM7CRC-24Q 校验算法与 QGC 的RTCMParser::crc24q一致参数--host/--port/--rate每秒消息数、--auth user:pass启用 Basic 认证、--error可注入bad_crc每第 10 条帧故意破坏 CRC、drop发送 10 条后断开、http_401、http_500等故障用于验证 QGC 在异常链路下的表现典型用法./mock_ntrip_caster.py # 默认 localhost:2101 ./mock_ntrip_caster.py --auth user:pass # 需要认证 ./mock_ntrip_caster.py --error bad_crc # 每 10 条注入坏 CRC延伸仓库内的其他测试手段Mock Link应用内模拟QGC 调试版本内置的 Mock Link 可在界面上直接创建/停止指向多个模拟载具的连接支持任务上传/下载、参数查看修改、多载具 UI 测试文档见 Mock Link 说明实现位于 src/Comms/MockLink。与tools/simulation的脚本相比它无需 Python 环境即可快速起多机。测试目录仓库在 test 下维护了大量针对 Comms、MissionManager、GPS 等模块的单元/集成测试可作为理解上述模拟器预期行为的参考。综上tools/simulation提供了一条从秒级起机的界面测试到真实固件的集成验证的完整仿真链路结合文档、脚本源码与 QGC 链路配置开发者无需任何实体硬件即可覆盖绝大多数地面站开发与回归测试场景。赞分享无人机智能硬件【免费下载链接】qgroundcontrolCross-platform ground control station for drones (Android, iOS, Mac OS, Linux, Windows)项目地址https://gitcode.com/gh_mirrors/qg/qgroundcontrol点击查看免费下载相关推荐QGroundControl 开发者工具实战Mock Link 模拟载具与 MAVLink 调试工具全解析QGroundControl 开发者工具实战Mock Link 模拟载具与 MAVLink 调试工具全解析 本篇技术指南围绕 QGroundControlQ无人机智能硬件INAV SITL 软件在环仿真完全指南从编译构建到完整 FPV 飞行模拟INAV SITL 软件在环仿真完全指南从编译构建到完整 FPV 飞行模拟 SITLSoftware In The Loop是 INAV 的软件在环仿真模无人机嵌入式智能硬件Midway 数据模拟Mock能力全解析从测试期 Mock 到开发期仿真数据Midway 数据模拟Mock能力全解析从测试期 Mock 到开发期仿真数据 Midway 在框架内核中内置了完整的数据模拟simulation/moc后端微服务云原生上一篇Star History 博客 Starlet 系列深度解读MetisFL 开源联邦学习框架的愿景、架构与生产化特性下一篇Meross HomeAssistant安全指南保护您的智能家居数据与隐私创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。