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文件详解 的相关文章

  • ardupilot & px4 书写自己的app & drivers (二)

    新建任务列表任务 打印时间 任务列表 const AP Scheduler span class hljs tag Task span Copter span class hljs tag scheduler tasks span span
  • 下载并构建PX4

    根据官方的文档 xff0c PX4下载和构建的方式有两种 xff1a Linux系列的Console模式 xff08 当然也支持Windows下的MINGW32 xff09 和Windows模式 在Windows平台下 xff0c 我们习惯
  • PX4使用I2C方式添加自定义传感器(1)

    PX4使用I2C方式添加自定义传感器 xff08 1 xff09 前言 毕业设计就是要在PX4上添加一个传感器 xff08 角度传感器 xff09 xff0c 由于板子上的接口数量很少 xff0c 很是宝贵 最后只能选择通过I2C通信方式
  • PX4通过I2C方式添加自定义传感器(3)

    添加自定义传感器并实现数据的发送和订阅 1 前期准备 1 1 建立文件夹和相关文件配置 我是在src drivers distance sensor文件夹下操作的 xff0c 当然其他文件夹下都类似 首先建立了两个文件夹angle sour
  • PX4 Offboard Control with MAVROS--Takeoff(一键起飞)

    警告 xff1a 请先在仿真环境下进行测试 xff0c 能达到预期效果后在进行实际飞行测试 xff0c 以免发生意外 本篇文章只是用作学习交流 xff0c 实际飞行时如出现意外情况作者不予以负责 所需材料 1 PIXhawk或者Pixrac
  • px4: v2的主板刷写v2的固件

    v2的主板刷写v2的固件 fengxuewei 64 fengxuewei Legion Y7000 2019 PG0 src Firmware changwei rc span class token function make span
  • PX4+Offboard模式+代码控制无人机起飞(Gazebo)

    参考PX4自动驾驶用户指南 https docs px4 io main zh ros mavros offboard cpp html 我的另一篇博客写了 键盘控制PX4无人机飞行 PX4无人机 键盘控制飞行代码 可以先借鉴本篇博客 xf
  • PX4无人机 - 键盘控制飞行代码

    PX4无人机 键盘控制飞行代码 仿真效果 实机效果 由于图片限制5M以内 xff0c 只能上传一小段了 xff0c 整段视频请点击链接 Pixhawk 6c 无人机 键盘控制无人机 Offboard模式 核心 xff1a 发布 mavros
  • Ubuntu下构建PX4软件

    本搭建过程基于http dev px4 io starting building html xff0c 希望大家互相交流学习 原文 xff1a Building PX4 Software xff08 构建PX4软件 xff09 PX4 ca
  • 【ROS】launch文件详解

    参考 xff1a https www cnblogs com fuzhuoxin p 12588402 html 在节点少 xff0c 程序小的情况下可以一个一个节点来启动 xff0c 测试运行效果 xff1b 但是当工程规模大 xff0c
  • PX4 ---- Indoor Flight

    文章目录 室内飞行ROS amp PX4Pose Data 飞机配置MAVROS 基于工训赛 VIO 飞行总结 室内飞行 ROS amp PX4 Pose Data 飞机配置 VIO 参考此处 xff0c 采用 T265 配置 相机与飞控机
  • PX4模块设计之四:MAVLink简介

    PX4模块设计之四 xff1a MAVLink简介 1 MAVLink PX4 应用简介2 MAVLink v2 0新特性3 MAVLink协议版本4 MAVLink通信协议帧4 1 MAVLink v1 0 帧格式4 2 MAVLink
  • PX4模块设计之九:PX4飞行模式简介

    PX4模块设计之九 xff1a PX4飞行模式简介 关于模式的探讨1 需求角度1 1 多旋翼 MC multi copter 1 1 1 RC控制模式1 1 1 1 Position Mode1 1 1 2 Altitude Mode1 1
  • 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模块设计之二十六:BatteryStatus模块

    PX4模块设计之二十六 xff1a BatteryStatus模块 1 BatteryStatus模块简介2 模块入口函数2 1 主入口battery status main2 2 自定义子命令custom command 3 Batter
  • PX4模块设计之四十七:mavlink模块

    PX4模块设计之四十七 xff1a mavlink模块 1 mavlink模块简介2 模块入口函数mavlink main3 mavlink模块重要函数3 1 Mavlink start3 2 Mavlink task main3 3 Ma
  • mavros连接px4失败的usb-ttl原因

    问题描述 xff1a 最近在搞mavros xff0c 以方便协处理器和pixhawk通讯 xff0c 在按照官网教程安装mavros xff0c 设置px4 xff0c 连接硬件之后发现mavros卡在中间下不去 xff1a MAVROS
  • Px4源码框架结构图

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • PX4中自定义MAVLink消息(记录)

    简单记录一下这个过程 一 自定义uORB消息 这一步比较简单 xff0c 首先在msg 中新建ca trajectory msg文件 uint64 timestamp time since system start span class t
  • PX4 OffBoard Control

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

随机推荐

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

    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 该格