Px4 ULog文件详解

2023-05-16

Px4 ULog文件详解

  • 简介
  • 数据类型
  • 文件组织
    • 文件头
    • 定义段
      • 消息
        • 标记位消息
        • 格式定义消息
        • 信息消息
        • 复合信息消息
        • 参数消息
    • 数据段
      • 订阅消息
      • 取消订阅消息
      • 日志数据消息
      • 字符串消息
      • 同步消息
      • 丢失
  • 附录

简介

ULog 是用于记录数据的文件格式,该格式是自解析的,即它包含了自己记录的消息格式。
Ulog可以用于记录输入、内部状态、和log消息。所有二进制数据使用小端格式。

数据类型

ULog使用C语言中的数据类型

TypeBytes
int8_t,uint8_t1
int16_t, uint16_t1
int32_t, uint32_t4
int64_t, uint64_t8
float4
double8
bool, char1

所有以上类型都可以以数组形式使用,比如float[5],所有的字符串char[length]都不包含\0,字符串是大小写敏感的。

文件组织

ULog文件有以下三个部分组成

文件头
定义段
数据段

文件头

文件头固定16字节长度,数据如下:

0x55 0x4c 0x6f 0x67 0x01 0x12 0x350x01uint64_t
File magic (7B)Version (1B)Timestamp (8B)

Timestamp是一个64位整型数据,标记了日记记录的开始时间,单位是毫秒。

定义段

定义部分是变长的,包含了版本信息、数据格式定义和参数值。
定义部分和数据部分都由消息流组成。

消息

每个消息都由消息头开始

struct message_header_s {
    uint16_t msg_size;
    uint8_t msg_type
};

msg_size是消息除去头部分后的字节数(头部分占3字节)。
msg_type有如下定义:

  • ‘B’: 标记位消息
  • ‘F’ :单个(复合)类型的格式定义,可以在另一个定义中作为嵌套类型记录或使用。
  • ‘I’:信息消息
  • ‘M’:复合信息消息
  • ‘P’:参数消息

标记位消息

struct ulog_message_flag_bits_s {
  uint8_t compat_flags[8];
  uint8_t incompat_flags[8];
  uint64_t appended_offsets[3]; ///< file offset(s) for appended data if appending bit is set
};

该消息必须作为第一条消息,紧跟在文件头后面,所以它有确定的偏移量;

  • compat_flags:
    目前没有任何定义,设置为0
  • incompat_flags:
    如果日志包含数据并且appended_offsets数组有非零值,则incompat_flags[0]的LSB设置为1
  • appended_offsets:
    数据的文件偏移量,如果没有数据段,appended_offsets必须全部设为0。附加数据使用以下流程:
    1、设置incompat_flags位
    2、将第一个attachment_offsets设置为0到日志文件的长度。
    3、添加有效消息

格式定义消息

struct message_format_s {
  struct message_header_s header;
  char format[header.msg_size-hdr_size];
};

header是上文中的消息头。
format具有以下格式的纯文本字符串:
message_name:field0;field1;…
他可以有任意字段的field,每个field以;分隔。field具有以下格式:
type field_name / type[array_length] field_name

type是上文中提到的数据类型,或者是嵌套类型。
field_name是用户自定义的名称,但是有一些名称是特殊的:

  • timestamp 每条记录的消息必须包含一个时间戳字段,但不需要是第一个字段。目前使用的类型是uint64_t,单位是微秒。对于相同的消息,时间戳必须是单调递增的。
  • Padding如果名称以_padding开头的字段名称,解析器会忽略其数据。 这些字段用于确保正确对齐。

信息消息

struct message_info_s {
  struct message_header_s header;
  uint8_t key_len;
  char key[key_len];
  char value[header.msg_size-hdr_size-1-key_len]
};

header是上文中的消息头。
key_lenkey的长度。
key是一个纯字符串:
message_name:field
field类似于格式定义消息,不同的是它只有一个field且不需要;结尾。
value包含key中描述的数据
特定的信息消息在整个日志最多出现一次,解析器可以将其存储为字典
预定义的信息消息是:

keyDescriptionExample for value
char[value_len] sys_nameName of the system“PX4”
char[value_len] ver_hwHardware version (board)“PX4FMU_V4”
char[value_len] ver_hw_subtypeBoard subversion (variation)“V2”
char[value_len] ver_swSoftware version (git tag)“7f65e01”
char[value_len] ver_sw_branchgit branch“master”
uint32_t ver_sw_releaseSoftware version (see below)0x010401ff
char[value_len] sys_os_nameOperating System Name“Linux”
char[value_len] sys_os_verOS version (git tag)“9f82919”
uint32_t ver_os_releaseOS version (see below)0x010401ff
char[value_len] sys_toolchainToolchain Name“GNU GCC”
char[value_len] sys_toolchain_verToolchain Version“6.2.1”
char[value_len] sys_mcuChip name and revision“STM32F42x, rev A”
char[value_len] sys_uuidUnique identifier for vehicle (eg. MCU ID)“392a93e32fa3”
char[value_len] replayFile name of replayed log if in replay mode“log001.ulg”
int32_t time_ref_utcUTC Time offset in seconds-3600

ver_sw_release和ver_os_release的格式为:0xAABBCCTT,其中AA为major,BB为minor,CC为patch,TT为类型。 类型定义如下:> = 0:开发,> = 64:alpha版本,> = 128:beta版本,> = 192:RC版本,== 255:发布版本。 因此,例如0x010402ff转换为发行版v1.4.2。

复合信息消息

struct ulog_message_info_multiple_header_s {
  uint8_t is_continued; ///< can be used for arrays
  uint8_t key_len;
  char key[key_len];
  char value[header.msg_size-hdr_size-2-key_len]
};

与信息消息相同,但是它可以有多个具有相同key的消息(解析器将它们存储为列表)。 is_continued可用于拆分消息:如果设置为1,则它是具有相同key的上一消息的一部分。

参数消息

struct message_info_s {
  struct message_header_s header;
  uint8_t key_len;
  char key[key_len];
  char value[header.msg_size-hdr_size-1-key_len]
};

如果一个参数在运行时动态改变,该条消息也可出现在数据段。它的数据格式必须是int32_t/float.

数据段

下列消息会出现在数据段:

  • ‘A’:订阅消息
  • ‘R’:取消订阅消息
  • ‘D’:日志数据
  • ‘L’:字符串消息
  • ‘S’:同步消息
  • ‘O’:丢失
  • ‘I’:信息消息
  • ‘M’:复合信息消息
  • ‘P’:参数消息

订阅消息

struct message_add_logged_s {
  struct message_header_s header;
  uint8_t multi_id;
  uint16_t msg_id;
  char message_name[header.msg_size-hdr_size-3];
};

该消息必须出现在message_data_s前,用于登记message_data_s消息的id和名称。
header:上文中定义的消息头。
multi_id:相同的消息可以有多个实例,比如有两个相同的传感器,则默认第一个为0。
msg_id:用于匹配message_data_s的唯一id。
message_name:消息名称,必须与message_format_s定义中:
message_name:field0;field1;…
的名称message_name保持一致。

取消订阅消息

目前没有使用

日志数据消息

struct message_data_s {
  struct message_header_s header;
  uint16_t msg_id;
  uint8_t data[header.msg_size-hdr_size];
};

header:上文中定义的消息头。
msg_id:message_add_logged_s定义的唯一id。
data:message_format_s中定义的二进制数据部分。

字符串消息

struct message_logging_s {
  struct message_header_s header;
  uint8_t log_level;
  uint64_t timestamp;
  char message[header.msg_size-hdr_size-9]
};

header:上文中定义的消息头。
log_level:类似linux中的消息级别:

NameLevel valueMeaning
EMERG‘0’System is unusable
ALERT‘1’Action must be taken immediately
CRIT‘2’Critical conditions
ERR‘3’Error conditions
WARNING‘4’Warning conditions
NOTICE‘5’Normal but significant condition
INFO‘6’Informational
DEBUG‘7’Debug-level messages

timestamp:微妙时间戳。
message:消息内容。

同步消息

目前未使用

丢失

标记给定持续时间的丢失(丢失的日志消息),以ms为单位。 丢失可能发生在设备不够快时。

struct message_dropout_s {
  struct message_header_s header;
  uint16_t duration;
};

header:上文中定义的消息头。
duration:持续时间

附录

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Px4 ULog文件详解 的相关文章

  • PX4与TX2通信

    PX4与TX2通信以及相关数据的获取 目录 1 PX4硬件接口 2 TELEM1 2接口线序 3 PX4与TX2通信 PX4 IO口定义 xff1a PX4硬件 xff1a 4 通信测试 5 RTPS 43 ROS Jetson TX2终端
  • PX4通过I2C方式添加自定义传感器(2)

    PX4 I2C通信方式传感器驱动分析 xff08 以ets airspeed为例 xff09 1 说明 这篇文章我们就来看看I2C传感器的驱动过程 xff0c 当然里面也有很多东西我不是很理解 xff0c 所以仅谈我领悟的一些东西 我就以e
  • 编译PX4固件

    PX4编译 文章目录 PX4编译疑难杂症bug1bug2catkin build isolated 官方脚本Step1Step2 安装常用依赖Step3 创建并运行脚本Step4 补全代码子模块Step5 验证仿真 官方offboard 例
  • PX4/Pixhawk---uORB深入理解和应用

    The Instructions of uORB PX4 Pixhawk 软件体系结构 uORB 主题发布 主题订阅 1 简介 1 1 PX4 Pixhawk的软件体系结构 PX4 Pixhawk的软件体系结构主要被分为四个层次 xff0c
  • 基于F4/F7/H7飞控硬件和px4飞控固件的廉价自主无人机系统(1)-飞控

    前言 穿越机F4 F7 H7飞控是一系列采用stm32系列F4xx和F7xx处理器的飞控的统称 xff0c 是目前穿越机爱好者非常喜欢使用的飞控硬件 xff0c 其价格也非常便宜180 xff5e 410 而px4则是一款常见的开源飞控固件
  • px4源码编译指南

    px4源码编译指南 强烈推荐大家去看官网的英文文档 xff0c 国内的博客杂七杂八 xff0c 官网的中文也很久没有更新 xff0c 这几天自己踩了很多坑 xff0c 写个教程希望能帮助到大家 xff08 本文选用平台是pixhawk1 1
  • PX4源代码下载编译

    sudo git clone https github com PX4 PX4 Autopilot git recursivegit submodule update init recursivegit submodule update r
  • PX4 ---- Mixer

    文章目录 Mixer 混合控制 作用输入输出装载混控文件MAVROS代码解析总结示例MAINAUX Mixer 混合控制 作用 经过位置控制和姿态控制后 xff0c 控制量通过 actuator controls发布 xff0c 其中 co
  • PX4模块设计之一:SITL & HITL模拟框架

    PX4模块设计之一 xff1a SITL amp HITL模拟框架 1 模拟框架1 1 SITL模拟框架1 2 HITL模拟框架 2 模拟器类型3 MAVLink API4 总结 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分
  • PX4模块设计之二十一:uORB消息管理模块

    PX4模块设计之二十一 xff1a uORB消息管理模块 1 uORB模块构建模式2 uORB消息管理函数2 1 状态查询2 2 资源利用2 3 模块启动2 4 模块停止3 uORB消息接口3 1 消息主题注册3 2 消息主题去注册3 3
  • PX4模块设计之三十六:MulticopterPositionControl模块

    PX4模块设计之三十六 xff1a MulticopterPositionControl模块 1 MulticopterPositionControl模块简介2 模块入口函数2 1 主入口mc pos control main2 2 自定义
  • PX4模块设计之三十九:Commander模块

    PX4模块设计之三十九 xff1a Commander模块 1 Commander模块简介2 模块入口函数2 1 主入口commander main2 2 自定义子命令custom command 3 Commander模块重要函数3 1
  • PX4模块设计之四十三:icm20689模块

    PX4模块设计之四十三 xff1a icm20689模块 1 icm20689模块简介2 模块入口函数2 1 主入口icm20689 main2 2 自定义子命令custom command2 3 模块状态print status 重载 3
  • PX4模块设计之四十五:param模块

    PX4模块设计之四十五 xff1a param模块 1 param模块简介2 模块入口函数param main3 重要函数列表4 总结5 参考资料 1 param模块简介 Description Command to access and
  • 关于github px4 gps 驱动的开发的总结

    源码编译上边已经写过文章了 遇到的几个问题 1 解决虚拟机不能共享文件夹的问题 一开始虚拟机的更新 vmware tools 是灰色的 xff0c 不能点 xff0c 然后通过关掉虚拟机 xff0c 然后再开启的时候 xff0c 在没有启动
  • PX4飞控之自主返航(RTL)控制逻辑

    本文基于PX4飞控1 5 5版本 xff0c 分析导航模块中自护返航模式的控制逻辑和算法 自主返航模式和导航中的其他模式一样 xff0c 在Navigator main函数中一旦触发case vehicle status s NAVIGAT
  • PX4 OffBoard Control

    终于还是走上了这一步 xff0c 对飞控下手 xff0c 可以说是一张白纸了 记录一下学习的过程方便以后的查阅 目录 一 ubuntu18 04配置px4编译环境及mavros环境 二 PX4的OffBoard控制 1 搭建功能包 2 编写
  • PX4——Range Finder 篇

    Range Finder 此处选用的是 Benewake 下的 Lidar 参数设置 General Configuration 除了官方的参数设置外 xff0c 我在 EKF2 中还找到了 EKF2 RNG AID 参数 xff0c 用来
  • PX4:Policy “CMP0097“ is not known to this version of CMake.

    make px4 fmu v3 时报的错 CMake版本的问题 由https blog csdn net zhizhengguan article details 118380965推测 xff0c 删除cmake policy也没事 ma
  • 飞行姿态解算(三)

    继之前研究了一些飞行姿态理论方面的问题后 又找到了之前很流行的一段外国大神写的代码 来分析分析 第二篇文章的最后 讲到了文章中的算法在实际使用中有重大缺陷 大家都知道 分析算法理论的时候很多情况下我们没有考虑太多外界干扰的情况 原因是很多情

随机推荐

  • 有一个文科女友是一场怎样的体验?

    1 我是一枚标准的工科男 xff0c 毕业后变成了加班狗程序猿 xff0c 我的女朋友是一枚标准的文科妹子 xff0c 这里姑且叫她miss梁吧 xff0c 我觉得以她的智商来看 xff0c 她应该是单细胞动物 xff0c 但是不知道她是怎
  • activity的startActivity和context的startActivity区别

    我们以 startActivity Intent 这个最常用的 api 来讲 1 首先 xff0c Context 类有一个 abstract 方法 Same as 64 link startActivity Intent Bundle w
  • android平台下移动DM接入流程?

    中国移动拟建设终端管理与服务系统 通过对终端产品的激活 配置使用等信息的收集 结合终端公司对产品的供应链管理 实现产品全生命周期的掌控 要求2017年3月起 所有入中国移动产品库的定制 非定制Android终端均要支持终端管理功能 必选要求
  • C++经典面试题(九)

    最近看一些面试题 xff0c 觉得如果自己被问到了 xff0c 并不能很利落的回答出来 一是从来没有这个意识 xff0c 二是没有认真的梳理下 下面对这些题做出分析 xff0c 哈 xff01 个人能力有限 xff0c 其中难免有疏漏 xf
  • 我的大学——学习生活总结

    纪念我终将逝去的青春 大一上學期 專業 1 C語言K amp R amp amp 習題 2 C語言經典習題 3 C語言趣味習題 4 C陷阱与缺陷 5 彙編語言 6 C 43 43 程序設計 7 C 程序設計
  • latex论文作图(python+matplotlib)

    20210425 0 引言 论文中进行作图 xff0c 需要对图片中的各种元素进行控制 xff0c 最近在论文写作过程中为了能够得到匹配文章的高质量图片 xff0c 也是花了很多心血 除了对图片中的风格进行控制 xff0c 另一方面比较重要
  • SAP结转方法:表结法、帐结法

    SAP 处理会计期间结帐方法主要有两种方法 xff1a 表结法和帐结法 国内在会计期末结帐大都采用 帐结 的方法 xff0c 而 SAP 一般都是采用 表 结 xff0c 通过财务报表的编制来披露当期利润 xff0c 即 xff1a 销售科
  • V4L2读取摄像头YUYV(YUV420)帧后使用C语言转存为bmp格式

    摄像头配置读取一帧YUV420 xff08 YUYV xff09 保存为RGB24图像 BRG的顺序 xff0c bmp 下面是内存中摄像头读取的数据直接转存为RGB图片的源码 输入 xff1a 图像指针地址 xff0c 图像长度 xff0
  • Linux内核系统调用原理与实现

    解决什么问题 Linux系统调用主要是操作系统实现的应用编程接口 xff0c 简单的说就是linux内核提供对外 对于应用程序 的接口函数 xff0c 进程通过调用系统调用完成自身的功能 系统调用在每个平台的实现方式都不同相同 xff0c
  • Docker容器基础

    1 介绍 Docker官网 xff1a https docs docker com Docker的github地址 xff1a https github com moby moby Dockerhub官网 https registry hu
  • 【自动驾驶】常见位姿估计算法的比较: 三角测量、PNP、ICP、

    PnP问题 3D 2D DLT 直接线性变换算法 相机标定工程用到的是DLT 直接线性变换算法 xff0c 它是一类PnP问题 3D 2D 请参考 位姿估计 视觉SLAM 笔记 常见位姿估计算法的比较 PnP xff08 Perspecti
  • CC2530 BootLoader,不带协议栈,任意跳转

    最近业余研究了下CC2530的远程固件更新 空中下载 现做个总结 一则方便大家学习共进 二则自己做个记录以防日后忘了 一 BootLoader主要技术点 nbsp nbsp 1 程序跳转到指定位置 nbsp nbsp 2 设置好相应的中断向
  • 使用 VNC 实现多用户登录

    Virtual Network Computing VNC 是一种提供计算机远程访问的流行工具 常规的 VNC 配置是针对单用户工作台而进行优化的 xff0c 可登录到 VNC 端口直接访问单一用户的桌面 然而 xff0c 这一配置在多用户
  • STLink V2烧录SWIM和SWD接口接线图

    stm8 采用SVTP软件烧录 xff0c 烧录接口为SWIM xff08 stlink v2烧录器带有该接口 xff09 xff0c 如下图 xff1a stm32可采用stlink v2 的SWD接口烧录 xff0c 接线图如下 xff
  • 车辆姿态角(Euler角)Pitch、Yaw、Roll 的设定

    首先申明 xff1a 此坐标系是针对车辆而设定的 xff0c 对于无人机来说是不同的 pitch xff1a 俯仰角 xff0c pitchAngleC2W orientation radian Y yaw xff1a 航向角 xff0c
  • Docker(四)----Docker-Compose 详解

    1 什么是Docker Compose Compose项目来源于之前的fig项目 xff0c 使用python语言编写 与docker swarm配合度很高 Compose 是 Docker 容器进行编排的工具 xff0c 定义和运行多容器
  • 转贴:ERP实施过程中的40个问题

    笔者在多年的实践中 xff0c 结合自身经验和多年的理论积累 xff0c 总结出有关ERP 实施的最关键的39 个问题 xff0c 以问答的形式 xff0c 让您在最短的时间内对ERP 实施有一个全面而客观的认识 xff0c 以免陷入日新月
  • VS Code 常用设置集合

    常用设置 xff08 setting json xff09 34 editor parameterHints enabled 34 true 开启参数预览窗口 设置字体颜色 34 editor semanticTokenColorCusto
  • Arduino--LCD1602(IIC)

    xff08 1 xff09 简介 前篇文章介绍了LCD1602的四位数据线控制方法 xff1a https blog csdn net u011816009 article details 106573622 但是该方法还是需要较多的IO口
  • Px4 ULog文件详解

    Px4 ULog文件详解 简介数据类型文件组织文件头定义段消息标记位消息格式定义消息信息消息复合信息消息参数消息 数据段订阅消息取消订阅消息日志数据消息字符串消息同步消息丢失 附录 简介 ULog 是用于记录数据的文件格式 xff0c 该格