地图和位置服务系统提供 QGroundControl 的地图功能,包括在线图块获取、离线地图缓存以及与多家地图提供商的集成。该系统作为 Qt Location 插件,用于处理基于图块的飞行显示和任务规划地图。
本文档涵盖地图引擎、图块缓存和地图提供程序集成。有关显示地图的 UI 组件,请参阅飞行显示和主视图。
系统架构
该地图系统以 Qt Location 插件的形式构建,集成了多个地图提供商和复杂的图块缓存机制。该架构由多个关键层级构成,协同工作,提供无缝的地图功能。
核心系统组件

Tile 请求流程

地图提供商系统
地图提供程序系统在通用接口后面抽象不同的图块服务,从而允许 QGroundControl 支持具有一致行为的多个地图提供程序。
提供商架构

提供商注册和访问
该类UrlFactory作为所有地图提供者的静态注册表,提供通过类型或 Qt 地图 ID 访问提供者的方法:
| 方法 | 目的 | 返回类型 |
|---|---|---|
getProviders() | 获取所有注册的提供商 | QList<SharedMapProvider> |
getMapProviderFromQtMapId() | 通过 Qt 地图 ID 查找提供商 | SharedMapProvider |
getMapProviderFromProviderType() | 按类型字符串查找提供商 | SharedMapProvider |
getProviderTypes() | 获取提供者类型名称列表 | QStringList |
getTileURL() | 获取坐标的瓦片 URL | QUrl |
getTileCount() | 计算瓷砖面积 | QGCTileSet |
瓦片缓存系统
图块缓存系统使用 SQLite 数据库为地图图块提供持久存储,并由后台工作线程异步管理所有缓存操作。
缓存数据库模式

视频源类型和协议支持
系统支持多种不同传输协议的视频输入源:

视频配置系统
该类VideoSettings通过 QGroundControl 基于事实的设置系统管理所有与视频相关的配置。它根据编译时特性和运行时设备可用性动态构建可用的视频源选项。
设置事实结构
视频设置被定义为具有元数据的事实src/设置/视频.SettingsGroup.json1-139关键配置元素包括:
| 环境 | 目的 | 类型 | 默认 |
|---|---|---|---|
videoSource | 活动视频输入源 | 字符串枚举 | 因平台而异 |
udpUrl | UDP 流端点 | 细绳 | “0.0.0.0:5600” |
rtspUrl | RTSP 流 URL | 细绳 | “” |
tcpUrl | TCP 流端点 | 细绳 | “” |
aspectRatio | 显示宽高比 | 漂浮 | 1.777777 |
videoFit | 缩放模式 | 枚举 | “适合身高” |
recordingFormat | 录音文件格式 | 枚举 | “mkv” |
maxVideoSize | 录音存储限制 | uint32 | 10240 MB |
streamEnabled | 启用/禁用流媒体 | 布尔值 | 真的 |
lowLatencyMode | 减少延迟优化 | 布尔值 | 错误的 |
forceVideoDecoder | 硬件解码器选择 | 枚举 | “默认” |
动态源检测
视频源在初始化过程中动态填充src/设置/VideoSettings.cc24-65:
// Network streaming sources (conditional on GStreamer)
#if defined(QGC_GST_STREAMING) || defined(QGC_QT_STREAMING)
videoSourceList.append(videoSourceRTSP);
videoSourceList.append(videoSourceUDPH264);
// ... additional network sources
#endif
// UVC device enumeration
#ifndef QGC_DISABLE_UVC
videoSourceList.append(UVCReceiver::getDeviceNameList());
#endif
该streamConfigured()方法验证所选视频源是否具有正确的配置参数
流协议和 GStreamer 集成
QGroundControl 使用 GStreamer 作为其网络流的主要视频处理引擎。该集成支持多种传输协议和视频编解码器。
GStreamer 管道架构

特定平台的解码器选择
系统根据目标平台自动过滤可用的硬件解码器src/设置/VideoSettings.cc240-271:
- Android:删除 DirectX3D、VideoToolbox、VA-API、NVIDIA、Intel 解码器
- Linux:删除 DirectX3D、VideoToolbox 解码器
- Windows:删除 VideoToolbox、Vulkan 解码器
- macOS:删除 DirectX3D、VA-API 解码器
- iOS:删除 DirectX3D、VA-API、NVIDIA、Intel 解码器
低延迟模式优化
何时启lowLatencyMode用src/设置/视频.SettingsGroup.json123-128系统:
rtpjitterbuffer从管道中移除元素- 将视频接收器设置为异步模式
- 将延迟减少约 200 毫秒
- 网络连接不佳时可能会导致帧丢失
视频显示和渲染系统
飞行显示视频组件处理实时视频渲染、纵横比管理、覆盖图形和用户交互控制。
显示组件架构

宽高比和缩放逻辑
视频显示器实现了复杂的缩放逻辑src/FlightDisplay/FlightDisplayViewVideo.qml86-115:
function getWidth() {
if(_ar != 0.0){
if(_isMode_FIT_HEIGHT
|| (_isMode_FILL && (root.width/root.height < _ar))
|| (_isMode_NO_CROP && (root.width/root.height > _ar))){
return root.height * _ar
}
}
return root.width
}
缩放模式提供不同的行为:
- FIT_WIDTH:视频宽度与容器匹配,高度按比例缩放
- FIT_HEIGHT:视频高度与容器匹配,宽度按比例缩放
- FILL:视频完全填满容器,可能会裁剪内容
- NO_CROP:视频在容器内保留原始宽高比
热成像集成
该系统支持多种显示模式的热像仪叠加src/FlightDisplay/FlightDisplayViewVideo.qml176-213:
- THERMAL_OFF:无热显示
- THERMAL_FULL:热成像视频填满整个显示区域
- THERMAL_PIP:画中画热覆盖
- THERMAL_BLEND:混合热/可见光与不透明度控制
录音及存储管理
视频录制系统提供自动存储管理,具有可配置的限制和格式选项。
录制配置
| 环境 | 选项 | 目的 |
|---|---|---|
recordingFormat | mkv、mov、mp4 | 输出文件容器格式 |
maxVideoSize | MB 限制 | 最大存储分配 |
enableStorageLimit | 布尔值 | 启用自动清理 |
showRecControl | 布尔值 | 在 UI 中显示录制控件 |
存储限制行为
何时enableStorageLimit为真src/设置/视频.SettingsGroup.json92-98:
- 系统监控录制视频文件的总大小
- 超过限制时自动删除最旧的录音
- 默认限制:桌面 10240 MB,移动 2048 MB
- 存储在应用程序加载/保存路径的“视频”子目录中的文件
文件命名和组织
视频文件以系统命名的方式保存在配置的目录结构中。录制系统与应用程序的文件管理功能集成,确保所有已保存数据类型的组织方式一致。
相机控制集成
该媒体系统与 MAVLink 摄像机控制集成,可实现高级摄像机操作,包括缩放、捕捉模式和万向节控制。
相机控制流程

缩放控制实现
视频显示实现了捏合缩放功能,可转换为 MAVLink 缩放命令src/FlightDisplay/FlightDisplayViewVideo.qml215-234:
PinchArea {
id: pinchZoom
enabled: _hasZoom
onPinchUpdated: {
if(_hasZoom) {
var z = 0
if(pinch.scale < 1) {
z = Math.round(pinch.scale * -10)
} else {
z = Math.round(pinch.scale)
}
if(pinchZoom.zoom != z) {
_camera.stepZoom(z)
}
}
}
}
特定平台的考虑因素
媒体系统通过条件编译和运行时检测来适应不同平台的能力和限制。
UVC 摄像头支持
QGC_DISABLE_UVC未定义的平台支持 USB 视频类摄像头src/设置/VideoSettings.cc42-44:
#ifndef QGC_DISABLE_UVC
videoSourceList.append(UVCReceiver::getDeviceNameList());
#endif
该类UVCReceiver处理:
- 设备枚举和检测
- 无需 GStreamer 即可直接捕获视频
- 特定于平台的 USB 摄像头驱动程序
移动平台优化
移动平台针对资源密集型设置接收不同的默认值:
- maxVideoSize:移动设备上为 2048 MB,桌面上为 10240 MB
- enableStorageLimit:移动设备上默认为 true,以防止存储耗尽
Herelink 集成
特别支持具有平台特定变体的 Herelink 视频系统src/设置/VideoSettings.cc36-40:
#ifdef QGC_HERELINK_AIRUNIT_VIDEO
videoSourceList.append(videoSourceHerelinkAirUnit);
#else
videoSourceList.append(videoSourceHerelinkHotspot);
#endif
这允许根据部署目标进行不同的 Herelink 配置。
756

被折叠的 条评论
为什么被折叠?



