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