跳转至

MavDataRec 接口文档

简介

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

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

快速开始

以下示例为已建立 MAVLink 循环的 1 号无人机记录三类消息,并通过 msgDic 读取各消息的环形缓存。

参考例程:[RflySim安装路径]\RflySimAPIs\7.RflySimPHM\0.ApiExps\e11_moder_ver

import time

import MavDataRec
import PX4MavCtrlV4 as PX4MavCtrl


mav = PX4MavCtrl.PX4MavCtrler(1)
mav.InitMavLoop()
time.sleep(0.5)

recorder = MavDataRec.MavDataRec(mav)
recorder.startRecMsg(
    ["SERVO_OUTPUT_RAW", "VIBRATION", "HIGHRES_IMU"],
    [5, 3, 19],
)

time.sleep(10)
for messageName, messages in recorder.msgDic.items():
    print(messageName, "缓存数量:", len(messages))

recorder.stopRecMsg()

环境与依赖

  • 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()

进阶用法示例

以下示例在记录线程运行期间周期读取电机、振动和 IMU 缓存,可将这些数据交给健康评估算法处理。

参考例程:[RflySim安装路径]\RflySimAPIs\7.RflySimPHM\0.ApiExps\e11_moder_ver

import time

import MavDataRec
import PX4MavCtrlV4 as PX4MavCtrl


mav = PX4MavCtrl.PX4MavCtrler(1)
mav.InitMavLoop()

recorder = MavDataRec.MavDataRec(mav)
recorder.startRecMsg(
    ["SERVO_OUTPUT_RAW", "VIBRATION", "HIGHRES_IMU"],
    [5, 3, 19],
)

try:
    for _ in range(20):
        motor = list(recorder.msgDic["SERVO_OUTPUT_RAW"])
        vibration = list(recorder.msgDic["VIBRATION"])
        imu = list(recorder.msgDic["HIGHRES_IMU"])
        print(
            "motor:", len(motor),
            "vibration:", len(vibration),
            "imu:", len(imu),
        )
        time.sleep(0.5)
finally:
    recorder.stopRecMsg()

注意事项与避坑指南

  • 启动前重复启动检查:调用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: 新增必要接口文件