跳转至

QGCCtrlAPI 接口文档

简介

简述:该文件实现了与QGroundControl地面站交互的控制接口,同时提供了先进先出缓存工具类,支持PX4飞控无人机任务中通过QGroundControl完成下发控制指令、获取状态信息的交互工作。

在RflySim无人机仿真任务开发流程中,QGroundControl是常用的地面站交互工具,负责提供无人机可视化监控、任务指令下发、飞行参数调试的入口。本模块封装了适配RflySim仿真环境的QGroundControl通信交互逻辑,可以帮助开发者便捷地实现仿真任务对地面站控制功能的调用,同时内置的fifo缓存类可以稳定处理交互过程中的流式数据,保障通信时序的正确性。

该模块适用于需要和QGroundControl地面站联动的仿真任务开发场景,比如第三方算法接入仿真时的指令中转、地面站手动参与仿真控制、飞行状态可视化调试等场景,是RflySimSDK中完成地面站交互功能的核心基础模块。

快速开始

最简可用示例,复制后修改最少配置即可运行。

from RflySimSDK.phm import QGCCtrlAPI
import time

# 1. 初始化QGC控制API,指定无人机ID为1
qgc_ctrl = QGCCtrlAPI(ID=1)

# 2. 发送解锁指令给QGC(MAV_CMD_COMPONENT_ARM_DISARM=400,param1=1表示解锁)
qgc_ctrl.SendQgcCmdLong(command=400, param1=1)
print("已发送无人机解锁指令")
time.sleep(2) # 等待解锁完成

# 3. 发送起飞指令(MAV_CMD_NAV_TAKEOFF=22,param1是目标高度,设置为5米)
qgc_ctrl.SendQgcCmdLong(command=22, param1=5)
print("已发送起飞指令,目标高度5米")

# 4. 获取QGC输出的文本内容(示例,修改为你的实际flag文件路径)
flag_file_path = "C:/RflySim/WorkSpace/qgc_flag.txt"
content = qgc_ctrl.getTxtContent(flag_file_path)
print(f"获取到QGC文本内容: {content}")

# 5. 复制QGC日志文件到目标位置(示例,修改为你自己的源和目标路径)
# source_log = "C:/Program Files/QGroundGroundControl/log.txt"
# target_log = "./my_flight_log.txt"
# qgc_ctrl.copyLogFile(source_log, target_log)
# print("日志文件复制完成")

环境与依赖

  • Python 环境>= 3.8.10
  • 依赖库copymathospymavlink.dialects.v20shutilsocketstructsysthreadingtime
  • 前置准备:调用此接口前,必须先完成RflySimSDK的安装,并且提前启动PX4飞控、QGroundControl地面站相关仿真环境。

核心接口说明

该模块 QGCCtrlAPI.py 包含了配置变量、辅助函数及核心业务类。

全局常量与枚举定义

本节列出模块中所有可直接引用的全局常量和枚举定义。

独立常量


全局/独立函数


QGCCtrlAPI

该类用于与QGroundControl地面站通信,实现发送PX4长命令、获取日志文本内容、复制日志文件以及请求QGC日志功能,适用于RflySim仿真中对无人机进行地面站控制和日志采集场景。

__init__(ID=1)

功能说明:初始化QGCCtrlAPI对象,绑定目标无人机ID 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
ID 任意 1 目标无人机的ID编号

返回值 (Returns)

  • QGCCtrlAPI 实例对象

异常 (Raises)


SendQgcCmdLong(command, param1=0, param2=0, param3=0, param4=0, param5=0, param6=0, param7=0)

功能说明:向QGroundControl发送PX4格式的长命令,实现对无人机的指令控制 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
command 任意 - PX4命令ID,指定要发送的指令类型
param1 任意 0 命令参数1
param2 任意 0 命令参数2
param3 任意 0 命令参数3
param4 任意 0 命令参数4
param5 任意 0 命令参数5
param6 任意 0 命令参数6
param7 任意 0 命令参数7

返回值 (Returns)

异常 (Raises)

示例

# 初始化ID为1的无人机QGC控制对象
qgc_ctrl = QGCCtrlAPI(ID=1)
# 发送解锁命令(示例command为对应PX4解锁命令ID)
qgc_ctrl.SendQgcCmdLong(400, 1, 0, 0, 0, 0, 0, 0)

getTxtContent(flagFilePath)

功能说明:读取指定路径下文本文件的内容,通常用于读取QGC生成的标记文件或日志文本 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
flagFilePath 任意 - 待读取文本文件的路径

返回值 (Returns)

  • str: 读取到的文本文件内容

异常 (Raises)


copyLogFile(source, target)

功能说明:将QGC生成的日志文件从源路径复制到目标路径,用于日志备份保存 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
source 任意 - 日志文件源路径
target 任意 - 日志文件目标路径

返回值 (Returns)

异常 (Raises)


ReqQgcLog(timeout=180, CopterID=1)

功能说明:向QGroundControl请求获取指定无人机的飞行日志,设置超时等待时间 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
timeout 任意 180 获取日志的最大等待超时时间,单位为秒
CopterID 任意 1 需要获取日志的无人机ID

返回值 (Returns)

异常 (Raises)

示例

qgc_ctrl = QGCCtrlAPI(ID=1)
# 请求无人机1的日志,等待最长3分钟
qgc_ctrl.ReqQgcLog(timeout=180, CopterID=1)
# 复制日志到指定路径
qgc_ctrl.copyLogFile("qgc_default_log_path/log.txt", "my_experiment/log_20240101.txt")
# 读取日志内容
log_content = qgc_ctrl.getTxtContent("my_experiment/log_20240101.txt")

fifo

先进先出(FIFO)队列数据结构,用于存储和管理按顺序进出的数据元素,符合先写入先读取的访问规则。

__init__()

功能说明:初始化一个空的先进先出队列对象 参数列表 (Args): 无 返回值 (Returns)

  • fifo 实例对象

异常 (Raises): 无


write(data)

功能说明:向队列尾部写入一个数据元素 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
data 任意类型 - 待写入队列的数据元素

返回值 (Returns): 无 异常 (Raises): 无


read()

功能说明:从队列头部读取并移除最早写入的数据元素 参数列表 (Args): 无 返回值 (Returns)

  • 任意类型: 队列头部最早写入的数据元素

异常 (Raises): 无

示例

from RflySimSDK.phm import fifo
# 初始化FIFO队列
fifo_queue = fifo()
# 写入数据
fifo_queue.write(10)
fifo_queue.write("hello")
# 按顺序读取数据
first_data = fifo_queue.read()
second_data = fifo_queue.read()
# 输出结果: first_data为10, second_data为"hello"

进阶用法示例

展示复杂组合场景(如多类协作、异步控制、批量操作)

import RflySimSDK.phm as phm
import threading
import time

# 实现多线程异步日志获取与批量存储:多任务协作场景
def async_log_worker(qgc_api, fifo, req_ids):
    # 批量请求多架无人机日志
    for req_id in req_ids:
        qgc_api.ReqQgcLog(req_id)
        time.sleep(0.5)
    # 获取所有日志内容后写入管道供主线程处理
    all_log = qgc_api.getTxtContent()
    fifo.write(all_log.encode('utf-8'))

# 初始化接口对象
qgc_ctrl = phm.QGCCtrlAPI()
log_fifo = phm.fifo()
# 需要拉取日志的无人机编号列表
target_uav_ids = [1, 3, 5, 7]

# 启动异步线程处理日志请求,避免阻塞主控制流程
log_thread = threading.Thread(target=async_log_worker, args=(qgc_ctrl, log_fifo, target_uav_ids))
log_thread.start()

# 主任务继续执行无人机飞行控制,同时异步获取日志
qgc_ctrl.SendQgcCmdLong("mode takeoff")
# 从管道读取异步获取到的批量日志
raw_log = log_fifo.read()
parsed_log = raw_log.decode('utf-8')
# 将日志批量拷贝到本地指定目录备份
qgc_ctrl.copyLogFile("./uav_batch_log_backup/")

注意事项与避坑指南

  • SendQgcCmdLong长指令发送限制:该方法单条指令长度受QGC地面站通信协议限制,请勿发送长度超过1024字节的指令,过长指令会被地面站直接丢弃且无返回错误提示。
  • fifo管道读写顺序依赖:使用fifo类进行进程间数据传输时,必须先完成写入操作再执行读取,空管道调用read方法会导致线程永久阻塞,无法响应其他操作。
  • 日志拉取的时序要求:调用ReqQgcLog请求日志后,需要等待至少0.3秒再调用getTxtContent获取内容,未等待完成直接读取会得到空内容或者不完整的日志片段。
  • copyLogFile路径格式要求:该方法要求传入的存储路径必须以斜线/结尾,若路径格式错误会导致日志文件存储失败,不会自动创建目标文件夹。

更新日志

  • 2024-08-02: chore:为生成html格式API添加代码注释
  • 2024-07-18: fix:更新API主页索引
  • 2023-11-10: feat: 新增通过QGC下载日志的接口,适用于硬件在环和软件在环