查看: 1260|回复: 0

ardupilot 日志文件解析

[复制链接]

42

主题

770

帖子

1532

积分

金牌飞友

Rank: 6Rank: 6

积分
1532
飞币
759
注册时间
2017-8-28
发表于 2022-12-4 19:58:02 | 显示全部楼层 |阅读模式

2019年04月05日,我开源了自己写的 ArduPilotLog。
ardupilot 日志系统非常好用,所以我打算将之移植出来。
在移植之前,先来解析一下 ardupilot 日志文件,为后面移植代码打个基础。

公众号回复 ardupilotlog 得到 github 开源地址。
日志文件的新生命


ArduPilotLog的重大作用之一,就是:将日志转为 sqlite 数据库文件。这个功能为日志文件赋予了新的生命。
这个功能是“站在巨人的肩膀上”产生的,因为 ardupilot 原有日志里具有建立数据库所需的全部内容,只是没有以数据库文件的形式存在而已。



    ardupilot 日志文件的生命力所在
    1、24.9 MB 的 *.bin 日志文件,生成的 sqlit 数据库文件有 48.2MB。说明 *.bin 文件数据更紧凑、体积更小。
    2、*.bin 文件本身包含数据库“表头”和“表体”的全部信息,非常方便转换。
    3、想在单片机上跑个 sqlite 不是很容易,但在单片机上记录 *.bin 日志文件十分容易。并且对单片机要求比较低,低到只要能跑 FatFS 文件系统就行。
ardupilot 日志文件分析


要点提示:
1、日志文件同一内存分布下的两种内容。
2、日志文件与数据库文件的关系。
3、日志文件的内存分布。



    日志文件的两种内容
    1、日志解码格式;
    2、日志数据。


ardupilot 日志文件解析w2.jpg


    内存分布


ardupilot 日志文件解析w3.jpg

读日志文件时怎样区分两种信息


结合 ArduPilotLog 关键代码说明。

通过上文可以知道:两种信息的内存分布是相同的,唯一的联系(也是用以区分的标记)就是 msgid。

因此,ArduPilotLog 读到 msgid 为 0x80 的数据时将之视为“解码格式”信息。

ardupilot 日志文件解析w4.jpg

ardupilot 里写入“解码信息”的关键函数


个函数是移植 ardupilot 日志系统所需的函数之一。


ardupilot 日志文件解析w5.jpg

移植思路

1、将“解码格式”写入日志文件首部(因为读文件解码时要先获知各个msgid的日志数据按什么格式来解码)。
2、按日志的内存分布封装日志函数,用于记录日志数据。

移植 ardupilot 日志系统其实非常简单。了解日志文件构成之后,按 ardupilot 架构往外搬就行了。

如果对软件架构没有认识,可以看下我的《软件架构训练计划》,在 github 上有开源训练内容。
无私奉献

有关 ardupilot 日志的更详细的文档,可以在我的公众号内回复 apm 获得。
内容包括:
1、我录制的 ardupilot 入门视频教程。
2、我常用的 ardupilot 开发环境虚拟机。
3、我做过的 ardupilot 相关文档。
关注作者

欢迎扫码关注我的公众号MultiMCU EDU。

提示:在公众号“关于我”页面可加作者微信好友。

喜欢本文求点赞,有打赏我会更有动力。
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

快速回复 返回顶部 返回列表