QGC代码解析之地图和位置服务(二十三)

地图和位置服务系统提供 QGroundControl 的地图功能,包括在线图块获取、离线地图缓存以及与多家地图提供商的集成。该系统作为 Qt Location 插件,用于处理基于图块的飞行显示和任务规划地图。

本文档涵盖地图引擎、图块缓存和地图提供程序集成。有关显示地图的 UI 组件,请参阅飞行显示和主视图

系统架构

该地图系统以 Qt Location 插件的形式构建,集成了多个地图提供商和复杂的图块缓存机制。该架构由多个关键层级构成,协同工作,提供无缝的地图功能。

核心系统组件

Tile 请求流程

地图提供商系统

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

提供商架构

提供商注册和访问

该类UrlFactory作为所有地图提供者的静态注册表,提供通过类型或 Qt 地图 ID 访问提供者的方法:

方法目的返回类型
getProviders()获取所有注册的提供商QList<SharedMapProvider>
getMapProviderFromQtMapId()通过 Qt 地图 ID 查找提供商SharedMapProvider
getMapProviderFromProviderType()按类型字符串查找提供商SharedMapProvider
getProviderTypes()获取提供者类型名称列表QStringList
getTileURL()获取坐标的瓦片 URLQUrl
getTileCount()计算瓷砖面积QGCTileSet

瓦片缓存系统

图块缓存系统使用 SQLite 数据库为地图图块提供持久存储,并由后台工作线程异步管理所有缓存操作。

缓存数据库模式

视频源类型和协议支持

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

视频配置系统

该类VideoSettings通过 QGroundControl 基于事实的设置系统管理所有与视频相关的配置。它根据编译时特性和运行时设备可用性动态构建可用的视频源选项。

设置事实结构

视频设置被定义为具有元数据的事实src/设置/视频.SettingsGroup.json1-139关键配置元素包括:

环境目的类型默认
videoSource活动视频输入源字符串枚举因平台而异
udpUrlUDP 流端点细绳“0.0.0.0:5600”
rtspUrlRTSP 流 URL细绳“”
tcpUrlTCP 流端点细绳“”
aspectRatio显示宽高比漂浮1.777777
videoFit缩放模式枚举“适合身高”
recordingFormat录音文件格式枚举“mkv”
maxVideoSize录音存储限制uint3210240 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 解码器

低延迟模式优化

何时启lowLatencyModesrc/设置/视频.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:混合热/可见光与不透明度控制

录音及存储管理

视频录制系统提供自动存储管理,具有可配置的限制和格式选项。

录制配置

环境选项目的
recordingFormatmkv、mov、mp4输出文件容器格式
maxVideoSizeMB 限制最大存储分配
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 视频系统src/设置/VideoSettings.cc36-40

#ifdef QGC_HERELINK_AIRUNIT_VIDEO
    videoSourceList.append(videoSourceHerelinkAirUnit);
#else
    videoSourceList.append(videoSourceHerelinkHotspot);
#endif

这允许根据部署目标进行不同的 Herelink 配置。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值