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: 新增必要接口文件