跳转至

MavDataRec 接口文档

简介

简述:该文件定义了MavDataRec类,用于记录存储无人机飞行过程中的MAVLink协议数据。

MAVLink是无人机领域广泛使用的轻量级通信协议,在无人机仿真与实际飞行任务中,会产生大量飞行状态、控制指令、传感器读数等通信数据,这些数据对任务复现、算法调试、性能分析都有着重要意义。本模块属于RflySimSDK的编队控制模块组,适用于RflySim平台的无人机仿真任务场景,可帮助用户完整留存仿真飞行过程中的所有MAVLink通信数据,方便后续离线分析与算法迭代验证。

快速开始

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

from RflySimSDK.phm.MavDataRec import MavDataRec
# 导入MAVLink连接对象(实际使用时替换为你自己建立的MAV连接)
from RflySimAPI import MavlinkInterface

# 1. 建立MAV连接,此处使用RflySim默认配置
mav = MavlinkInterface()
mav.connect()

# 2. 创建MAV数据记录对象,传入已建立的MAV连接
data_rec = MavDataRec(mav)

# 3. 配置并开始记录消息
# NameList:要记录的MAV消息名称,这里记录HIGHRES_IMU和ATTITUDE两种消息
# LenList:每种消息要缓存的长度,分别保存最新的10条HIGHRES_IMU和20条ATTITUDE
data_rec.startRecMsg(NameList=['HIGHRES_IMU', 'ATTITUDE'], LenList=[10, 20])

# 4. 运行10秒模拟任务,期间持续记录数据
import time
time.sleep(10)

# 5. 获取最新缓存的记录数据
rec_data = data_rec.getMavMsg()
# 打印获取到的HIGHRES_IMU数据
print("获取到的HIGHRES_IMU记录:", rec_data['HIGHRES_IMU'])

# 6. 停止消息记录
data_rec.stopRecMsg()

# 断开MAV连接
mav.close()

环境与依赖

  • Python 环境>= 3.8.10
  • 依赖库threading
  • 前置准备:调用此接口前,必须先完成RflySimSDK的初始化导入。

核心接口说明

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

全局常量与枚举定义

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

独立常量


全局/独立函数


MavDataRec

MAVLink消息数据记录类,用于在RflySim无人机仿真中记录指定类型的MAVLink消息数据,支持自定义消息类型和缓存长度,常用于无人机飞行数据离线分析、PHM(预测与健康管理)相关的数据采集场景。

__init__(self, mav)

功能说明:初始化MAVLink数据记录实例,绑定MAVLink通信对象 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
mav object - 已建立连接的MAVLink通信对象,用于接收无人机消息

返回值 (Returns)

  • MavDataRec 实例对象

异常 (Raises): 无


startRecMsg(NameList=['HIGHRES_IMU'], LenList=[10])

功能说明:开始记录指定列表中的MAVLink消息,设置每条消息的缓存长度 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
NameList list[str] ['HIGHRES_IMU'] 需要记录的MAVLink消息名称列表,默认记录高精度IMU消息
LenList list[int] [10] 对应每个消息类型的缓存长度,即最多存储多少条最新消息,长度需要和NameList一致

返回值 (Returns)

异常 (Raises): 无


stopRecMsg()

功能说明:停止所有正在进行的MAVLink消息记录,清空已注册的记录项 返回值 (Returns)

异常 (Raises): 无


getMavMsg()

功能说明:获取当前缓存的所有已记录MAVLink消息数据 返回值 (Returns)

  • dict: 键为消息名称,值为对应缓存的消息数据列表

异常 (Raises): 无

示例

from RflySimSDK.phm import MavDataRec
# 绑定已建立的MAVLink连接对象mav
recorder = MavDataRec(mav)
# 开始记录IMU和姿态消息,分别缓存100条数据
recorder.startRecMsg(NameList=['HIGHRES_IMU', 'ATTITUDE'], LenList=[100, 100])
# 飞行过程中获取已记录数据
recorded_data = recorder.getMavMsg()
imu_data = recorded_data['HIGHRES_IMU']
# 停止记录
recorder.stopRecMsg()

进阶用法示例

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

import asyncio
from RflySimSDK.phm import MavDataRec
from concurrent.futures import ThreadPoolExecutor

# 批量初始化多无人机日志记录任务,异步控制不同时段的记录启停
async def batch_mav_data_rec(drone_id_list, rec_duration):
    rec_instances = [MavDataRec(drone_id) for drone_id in drone_id_list]
    # 批量启动所有无人机的MAVLink消息记录
    for inst in rec_instances:
        inst.startRecMsg()
    print(f"已启动{len(rec_instances)}架无人机的消息记录,记录持续{rec_duration}秒")

    # 异步等待记录完成,过程中可以异步获取最新消息做预处理
    await asyncio.sleep(rec_duration)
    # 多线程并行批量获取并存储记录到本地,提升大流量数据处理效率
    with ThreadPoolExecutor(max_workers=len(rec_instances)) as pool:
        all_mav_data = list(pool.map(lambda x: x.getMavMsg(), rec_instances))
    # 批量停止所有记录任务
    for inst in rec_instances:
        inst.stopRecMsg()
    return all_mav_data

# 执行多机协作数据采集任务
if __name__ == "__main__":
    drone_list = [1, 2, 3]
    mav_data = asyncio.run(batch_mav_data_rec(drone_list, 10))
    for idx, data in enumerate(mav_data):
        print(f"无人机{drone_list[idx]}共记录到{len(data)}条MAVLink消息")

注意事项与避坑指南

  • 启动前重复启动检查:调用startRecMsg()前需要确认当前记录任务未处于启动状态,重复启动会导致内存中缓存的消息数据重复堆积,最终获取到的消息会包含多段重复数据,占用额外内存且干扰后续分析。
  • 获取消息时机限制:调用getMavMsg()必须在startRecMsg()启动后、stopRecMsg()停止前执行,若在任务未启动或已经停止后调用,会返回空列表或仅返回不完整的半缓存数据,无法得到完整的记录结果。
  • 多实例资源冲突规避:同一架无人机对应创建多个MavDataRec实例同时调用startRecMsg()时,会出现MAVLink端口数据读取竞争,导致多个实例都只能获取到不完整的消息分片,建议单无人机同一时间段仅保留一个活动记录实例。
  • 长时记录内存管控:针对时长超过10分钟的长时飞行数据记录,建议分段调用startRecMsg()stopRecMsg()分段存储获取到的消息,避免持续缓存所有消息数据导致内存占用持续升高,引发程序运行卡顿甚至内存溢出问题。

更新日志

  • 2024-08-02: chore:为生成html格式API添加代码注释
  • 2024-07-18: fix:更新API主页索引
  • 2023-10-23: feat: 新增必要接口文件