添加新日志信息¶
数据闪存日志 飞行日志存储在飞行控制器的机载闪存中,可在飞行后下载。飞行日志提供了每次飞行的详细信息,尤其是在以下情况下非常重要 诊断故障原因.
本页介绍如何编写新的数据闪存日志信息。
简单方法¶
空白 写(缢 烧焦 *名字, 缢 烧焦 *标签, 缢 烧焦 *ft, ...); 空白 写(缢 烧焦 *名字, 缢 烧焦 *标签, 缢 烧焦 *单位, 缢 烧焦 *mults, 缢 烧焦 *ft, ...);
使用顶层函数的示例见 Compass_learn.cpp:
美联社::记录仪().写("COFS";, "TimeUS,OfsX,OfsY,OfsZ,Var,Yaw,WVar,N";, "QffffffI";, AP_HAL::微64(), (双人)best_offsets.x, (双人)best_offsets.y, (双人)best_offsets.z, (双人)最佳错误, (双人)最佳偏航度, (双人)最差错误, 样本数);
第一个参数是信息名称。该名称应为 4 个字符或更少,并且是唯一的
第 2 个参数是一个最多包含 16 个字段名的逗号分隔列表;总共限制为 64 个字符
第 3 个参数是格式字符串(最多 16 个字符),每个字母代表相应字段的格式。每个字母的含义如下 此处在 AP_Logger/LogStructure.h 中
其余参数是要记录的实际值。您可能会注意到,在上面的示例中,有些字段的格式是 float ("f") ,但被转换成了
(双)
这是正确的,也是避免编译器警告所必需的。
第 2 个 Log_Write 函数与第 1 个函数相同,只是多了两个字符串参数、 "单位" 和 "mults".与 "格式 "参数类似,这些参数中的每个字符都指定了 单位 (即表示学位的 "d")或 乘法器 (例如,"2 "表示 *100,"B "表示 *0.01)。这有助于图形工具在向用户显示输出时正确缩放。
例如,下面是一条 "TEST "日志信息,输出当前系统时间和高度。
美联社::记录仪().写("测试";, "TimeUS,Alt";, "sm";, // 单位: 秒钟, 米数 "FB";, // 多: 1e-6, 1e-2 "Qf";, // 格式: uint64_t, 浮动 AP_HAL::微64(), (双人)厘米高度);
时间以秒("s")为单位,乘数为 "F",表示该值应除以 100 万,格式为 "Q",表示以 64 位无符号整数输出。
海拔高度的单位为米("m"),乘数为 "B",表示该值应除以 100(从厘米转换为米),格式为 "f",因为该值是浮点数。
更难的方式¶
对于常用报文,尤其是以相对较高的速率(50 赫兹或以上)输出的报文,可以使用效率稍高的记录方法。
决定日志记录是否来自一个库(即对 Log_Write 的调用将来自于 图书馆目录)或载具代码(即从 ArduCopter, ArduPlane等)。
在 载具的 #define 列表或 defines.h 中的 enum 或 AP_Logger/LogStructure.h 的 LogMessages 枚举.
定义一个结构,用于保存要记录到载具的 Log.cpp 文件或 AP_Logger/LogStructure.h.所有日志文件信息的第一个字段都应为 time_us。
结构 包装 日志测试 { 日志包头; uint64_t 时间; 浮动 a_value; }
添加日志信息的名称、 单位, 乘法器 和 格式 字符串到 载具的日志结构数组 或 AP_Logger/LogStructure.h 的 LOG_EXTRA_STRUCTURES 数组
在载具代码或 AP_Logger 库中添加一个名为 Write_<something-or-other>的新方法,该方法用于填充结构,然后调用 AP_Logger/WriteBlock()
空白 旋翼飞行器::日志写入测试() { 结构 日志测试 pkt = { log_packet_header_init(LOG_TEST_MSG), 时间 : AP_HAL::微64(), a_value : 1234 }; 记录仪.写入块(及样品;pkt, 尺寸(pkt)); }
从 调度 或从代码中的其他地方记录您希望记录的值