- 无人机
- 智能硬件
【免费下载链接】qgroundcontrol
Cross-platform ground control station for drones (Android, iOS, Mac OS, Linux, Windows)
本文以 QGroundControl 用户指南中的 Camera Tools 文档 为核心骨架,结合仓库内相机控制与视频管理的真实源码实现,系统讲解飞行视图(Fly View)中相机工具的完整能力:如何拍摄静态照片、录制视频、通过面板配置相机参数,以及视频流页面的启用、显示与本地录制。读完本文,你将掌握从连接相机、识别相机能力到完成拍照、录像、参数配置的完整操作链路,并理解这些操作在底层如何通过 MAVLink 命令落地。
一、相机工具能做什么
QGroundControl 的相机工具(Camera Tools)是飞行视图内的一个核心功能区,用于三件事:
- 拍摄静态图像(Still Image)——单击拍照,或按设定时间间隔进行定时连拍(Time Lapse);
- 录制视频(Video)——开始/停止机载录像,或在地面站本地录制视频流;
- 配置相机(Configure Camera)——通过面板齿轮图标打开配置项,调整曝光、白平衡、分辨率等参数。
需要特别强调的是:相机捕获与配置选项完全取决于当前连接的相机,不是所有选项在所有相机上都会出现。这也是理解相机工具的第一原则。
二、相机能力由连接方式决定
QGC 支持的相机接入方式有两类,能力差异明显:
- 简单机载相机(Simple autopilot-connected camera):只暴露最基本的功能,配置项有限;
- 支持 MAVLink Camera Protocol 的相机:QGC 可以额外使用该协议提供的所有服务。例如,若相机支持视频模式,你就可以在静态拍摄与视频模式之间切换,并开始/停止录制。
这套能力路由在 src/Camera/VehicleCameraControl.cc 中有清晰的实现痕迹:takePhoto()会先检查_mavlinkCameraInfo.flags(如CAMERA_CAP_FLAGS_CAPTURE_IMAGE、CAMERA_CAP_FLAGS_CAPTURE_VIDEO、CAMERA_CAP_FLAGS_CAN_CAPTURE_VIDEO_IN_IMAGE_MODE),据此决定走 MAVLink 命令路径还是降级路径;startVideoRecording()中同样以CAMERA_CAP_FLAGS_CAPTURE_VIDEO标志判断是发送MAV_CMD_VIDEO_START_CAPTURE还是直接调用本地VideoManager录制(VehicleCameraControl.cc#L527-L541)。
三、相机配置面板:齿轮图标与 Camera Definition File
配置面板通过面板上的齿轮图标打开。面板中展示的大多数设置项并非写死在地面站里,而是由相机自己定义的——它们来自相机的MAVLink Camera Definition File(相机定义文件)。也就是说,相机厂商把「我有哪些参数、每个参数有哪些取值」以 XML 形式发布,QGC 读取后动态生成配置界面。
仓库中提供了一个完整的示例定义文件:src/Camera/camera_definition_example.xml,其结构如下:
<definition>:相机型号与厂商(示例中为 Super Dupper Industries 的 SD II);<parameters>:一组<parameter>定义,每个参数含name、type(如uint32、float、bool)、default值和<options>枚举项;- 参数之间存在联动约束(
<exclusions>与<parameterranges>),例如:CAM_MODE设为 Photo(value=0)时,排除视频类参数CAM_VIDRES、CAM_VIDFMT、CAM_AUDIOREC;- 设为 Video(value=1)时,排除照片类参数
CAM_PHOTOFMT、CAM_PHOTOQUAL、CAM_PHOTORES,且CAM_ISO只保留部分档位(camera_definition_example.xml#L8-L38);
- 示例中还定义了 ISO、曝光补偿、快门速度、光圈、白平衡、测光模式、色彩模式、照片/视频分辨率、图像格式(Jpeg/Raw/Jpeg+Raw)等常见项(camera_definition_example.xml#L39-L245);
<videostreams>可声明多个视频流(如可见光 + 热成像),exclusive="0"表示各流可同时运行,exclusive="1"表示用户只能选择其一(camera_definition_example.xml#L247-L259);<localization>用于多语言显示,运行时将原始描述替换为对应语言翻译(camera_definition_example.xml#L260-L299)。
四、末尾的硬编码通用设置
与相机定义文件动态生成的参数不同,配置面板末尾的几个通用设置是 QGC 硬编码的,对所有相机几乎都可用:
| 设置项 | 可选值 | 说明 |
|---|---|---|
| Photo Mode | Single / Time Lapse | 单张拍摄或定时连拍 |
| Photo Interval | (仅 Time Lapse 时显示) | 相邻两张照片的间隔秒数 |
| Reset Camera Defaults | — | 向相机发送重置命令,恢复出厂默认设置 |
| Format(storage) | — | 格式化相机存储卡 |
这些设置对应 src/Camera/VehicleCameraControl.cc 中的真实实现:
- Photo Mode / Photo Interval:
setPhotoCaptureMode()与setPhotoLapse()将选择持久化到QSettings(键分别为kPhotoMode与kPhotoLapse),并在拍照时读取(VehicleCameraControl.cc#L378-L394); - Reset Camera Defaults:
resetSettings()发送MAV_CMD_RESET_CAMERA_SETTINGS命令,参数1表示执行重置(VehicleCameraControl.cc#L628-L639); - Format:
formatCard(id)发送MAV_CMD_STORAGE_FORMAT,参数依次为存储 ID(1为第一张卡,2为第二张)与1(执行格式化)(VehicleCameraControl.cc#L641-L654)。
一个值得注意的实现细节:执行重置或格式化期间,_resetting标志会阻止其他拍摄/录制操作,避免并发冲突。
五、拍照:从单击快门到定时连拍
takePhoto()是拍照的入口(VehicleCameraControl.cc#L440-L487),其行为按相机能力分两条路径:
- MAVLink 路径(相机支持
CAMERA_CAP_FLAGS_CAPTURE_IMAGE,且当前不在视频模式、或支持拍照模式下录像):发送MAV_CMD_IMAGE_START_CAPTURE,参数含义为——- 参数 1:相机编号(
0表示所有相机); - 参数 2:连拍间隔秒数(
_photoLapse;单张模式下为0,被忽略); - 参数 3:总拍摄张数(定时连拍时为
_photoLapseCount,0表示不限张数)。
- 参数 1:相机编号(
- 本地降级路径:不支持 MAVLink 拍照的相机,单张模式直接调用
VideoManager::instance()->grabImage()抓取视频帧作为照片;定时连拍在这种相机上不支持,QGC 会弹窗提示。
定时连拍进行中,可调用stopTakePhoto()发送MAV_CMD_IMAGE_STOP_CAPTURE提前结束序列(VehicleCameraControl.cc#L489-L511)。
拍照/录像模式之间的切换由toggleCameraMode()完成:当前为 Photo/Survey 模式则切到 Video,当前为 Video 模式则切回 Photo(VehicleCameraControl.cc#L414-L423);若相机定义文件中有CAM_MODE参数则直接写参数值,否则发送MAV_CMD_SET_CAMERA_MODE(0:photo,1:video)。
六、视频录制:机载录制与本地录制
startVideoRecording()/stopVideoRecording()同样区分两条路径(VehicleCameraControl.cc#L513-L572):
- 相机支持
CAMERA_CAP_FLAGS_CAPTURE_VIDEO时,发送MAV_CMD_VIDEO_START_CAPTURE/MAV_CMD_VIDEO_STOP_CAPTURE,将录制指令交给机载相机/飞控; - 否则,调用
VideoManager::instance()->startRecording()/stopRecording(),由 QGC 在地面站本地对收到的视频流进行编码落盘。
每次操作前,QGC 都会检查_resetting状态与当前的captureVideoState(Idle/Capturing/Disabled),避免重复开始或无效停止。视频流本身在 src/VideoManager/VideoManager.cc 中管理,通过aspectRatio()等属性向界面暴露视频宽高比信息(VideoManager.cc#L409-L423)。
七、视频流页面(Video Stream)
视频流页面(页面锚点#video_instrument_page)用于启用/禁用视频流。启用之后,你可以进行以下操作:
- 开始/停止视频流:在页面内切换视频流的接收与停止;
- 启用网格叠加层(Grid Overlay):在视频画面上叠加网格线,便于目视对齐航线或目标;
- 更改图像适配屏幕的方式:控制视频画面如何填充显示区域;
- 用 QGC 本地录制视频:将收到的视频流直接录制到地面站本地磁盘。
7.1 视频显示的底层配置
视频显示相关的所有设置都在 src/Settings/Video.SettingsGroup.json 中定义,关键项包括:
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
videoSource | string | 空 | 视频流来源:UDP、TCP、RTSP 或 UVC 相机 |
udpUrl | string | 0.0.0.0:5600 | UDP 视频流绑定地址与端口 |
rtspUrl | string | 空 | RTSP 视频流地址,如rtsp://192.168.42.1:554/live |
tcpUrl | string | 空 | TCP 视频流地址与端口 |
aspectRatio | float | 1.777777 | 视频宽高比(宽/高),设为 0 表示自动探测 |
gridLines | bool | false | 是否在视频视图上叠加网格线 |
videoFit | uint32 | 1 | 画面适配方式(见下表) |
showRecControl | bool | true | 是否在界面显示录制控制按钮 |
recordingFormat | uint32 | 2 | 本地录制文件格式:2=mp4、1=mov、0=mkv |
maxVideoSize | uint32 | 10240 MB(移动端 2048) | 视频录制最大占用磁盘空间 |
enableStorageLimit | bool | false(移动端 true) | 超限时自动删除最旧录像 |
streamEnabled | bool | true | 视频流默认启用开关 |
disableWhenDisarmed | bool | false | 解锁(disarmed)时关闭视频流以节省带宽 |
lowLatencyMode | bool | false | 关闭 RTP 播放缓冲与重传恢复以降低延迟 |
其中videoFit的四种适配模式(Video.SettingsGroup.json#L68-L76):
| 枚举值 | 含义 |
|---|---|
| 0 | Fit Width(按宽度适配) |
| 1 | Fit Height(按高度适配,默认) |
| 2 | Fill(填满画面,可能裁切) |
| 3 | No Crop(不裁切) |
这些设置在 QML 界面中的实际消费点可见于 src/FlyView/FlightDisplayViewVideo.qml:_showGrid读取videoSettings.gridLines.rawValue控制网格线可见性(FlightDisplayViewVideo.qml#L18),_fitMode读取videoSettings.videoFit.rawValue决定fillMode(Image.PreserveAspectCrop等)与画面布局(FlightDisplayViewVideo.qml#L25),aspectRatio则从QGroundControl.videoManager.aspectRatio获取用于计算画面尺寸(FlightDisplayViewVideo.qml#L17)。
7.2 视频流来源配置
视频流页面显示的画面上游由videoSource决定,常见组合:
- UDP:地面站绑定
0.0.0.0:5600接收飞控转发来的 MPEG-TS 视频流(默认最常用); - RTSP:直接连接相机自带的 RTSP 服务地址;
- TCP:某些图传设备以 TCP 推流;
- UVC:通过 USB 直连的摄像头。
八、操作建议与适用范围
- 面板中「哪些设置项可见、有哪些档位」完全由相机的 Camera Definition File 决定,不同相机(乃至同型号不同固件)展示的配置界面可能不同,这属于正常现象;
- 「Photo Mode / Photo Interval / Reset / Format」四项为 QGC 硬编码的通用设置,不依赖相机定义文件;
- 定时连拍功能需要相机具备 MAVLink 静态拍摄能力;仅靠视频流抓帧的降级路径不支持定时连拍;
- 本地录制(VideoManager 路径)适用于地面站侧录制视频流,录制格式、存储上限、超限自动清理等策略均可通过 Video.SettingsGroup.json 对应的设置页配置;
- 若视频画面比例异常,可检查
aspectRatio(0为自动探测)与videoFit的组合;若需要在画面上辅助对齐,可打开gridLines。
延伸阅读
- 相机控制的底层实现:src/Camera/VehicleCameraControl.cc(拍照、录像、重置、格式化、变焦、对焦的 MAVLink 命令封装)与 src/Camera/VehicleCameraControl.h
- 相机定义文件完整示例:src/Camera/camera_definition_example.xml(参数、联动约束、视频流声明、本地化)
- 视频管理与接收:src/VideoManager/VideoManager.cc(视频流属性、本地录制)
- 视频显示界面:src/FlyView/FlightDisplayViewVideo.qml(网格线、适配模式、宽高比)
- 视频设置项定义:src/Settings/Video.SettingsGroup.json(全部视频相关配置及默认值)
- 相机管理器与接口:src/Camera/QGCCameraManager.cc、src/Camera/QGCCameraIO.cc(相机枚举与 IO 调度)
- 无人机
- 智能硬件
【免费下载链接】qgroundcontrol
Cross-platform ground control station for drones (Android, iOS, Mac OS, Linux, Windows)
相关推荐
QGroundControl 相机工具(Camera Tools)完全指南:拍照、录像与相机配置
QGroundControl 相机工具(Camera Tools)完全指南:拍照、录像与相机配置 本篇技术指南以 QGroundControl 的 Camera
无人机智能硬件Flet Camera 控件完全指南:实时相机预览、拍照、录像与图像流
Flet Camera 控件完全指南:实时相机预览、拍照、录像与图像流 Flet 的 flet camera 扩展包让纯 Python 开发者无需任何前端经验,
前端跨平台桌面应用移动开发uni-app x camera 相机组件完全指南:属性、事件、拍照录像与扫码实战
uni app x camera 相机组件完全指南:属性、事件、拍照录像与扫码实战 本文围绕 uni app x 内置的 camera 相机组件展开,系统讲解其
示例工程前端移动开发跨平台
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考