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通过I2C方式添加自定义传感器(3)

    添加自定义传感器并实现数据的发送和订阅 1 前期准备 1 1 建立文件夹和相关文件配置 我是在src drivers distance sensor文件夹下操作的 xff0c 当然其他文件夹下都类似 首先建立了两个文件夹angle sour
  • 【8-12】树莓派部署t265+px4飞控实现无人机视觉定位

    在之前的文章中 xff0c 我们已经成功在树莓派 xff08 ubuntu mate 18 04 xff09 上部署了T265的追踪摄像头 本文将利用MAVROS协议 xff0c 将T265测量的位姿信息发送给px4固件 xff0c 实现室
  • px4: v2的主板刷写v2的固件

    v2的主板刷写v2的固件 fengxuewei 64 fengxuewei Legion Y7000 2019 PG0 src Firmware changwei rc span class token function make span
  • 飞行机器人(七)仿真平台XTDrone + PX4编译

    0 编译PX4固件 参考仿真平台基础配置教程 xff08 中文详细教程 xff09 仿真平台基础配置 语雀 yuque com https www yuque com xtdrone manual cn basic config 按照教程
  • 关于PX4中的高度若干问题

    飞行的高度是如何测量的 xff1f 地面的高度和海平面的高度差别很大 xff0c 飞控又是如何有效判别进行降落的 xff1f 这是我脑子里的疑问 搜索的一圈发现很少有人讨论这方面的问题 xff0c 于是本次我就直接看一下源代码 xff0c
  • px4源码编译指南

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

    PX4飞控之PWM输出控制 多旋翼电调如好盈XRotor xff0c DJI通用电调等都支持PWM信号来传输控制信号 常用的400Hz电调信号对应周期2500us xff0c 一般使用高电平时间1000us 2000us为有效信号区间 xf
  • 初学PX4之环境搭建

    文章转自 xff1a http www jianshu com p 36dac548106b 前言 前段时间linux崩溃了 xff0c 桌面进去后只有背景 xff0c 折腾好久没搞定 xff0c 为了节省时间索性重装了系统 xff0c 同
  • 【ROS】launch文件详解

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

    文章目录 Mixer 混合控制 作用输入输出装载混控文件MAVROS代码解析总结示例MAINAUX Mixer 混合控制 作用 经过位置控制和姿态控制后 xff0c 控制量通过 actuator controls发布 xff0c 其中 co
  • PX4 ---- Indoor Flight

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

    PX4模块设计之三 xff1a 自定义uORB消息 1 新增自定义uORB消息步骤2 应用ext hello world消息示例3 编译执行结果4 参考资料 基于PX4开源软件框架简明简介和PX4模块设计之二 xff1a uORB消息代理
  • 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】运行mavsdk中的offboard example

    运行MAVSDK中的offboard例子时无人机不执行 想控制无人机前后左右移动 xff0c 在按照官方教程实现offboard 插件的时候 发现用action插件能正常起飞和降落 但是一旦执行到offboard的插件代码的时候就会自动降落
  • pixhawk px4 commander.cpp

    对于复杂的函数 xff0c 要做的就是看函数的输入是什么 来自哪里 xff0c 经过处理后得到什么 给谁用 xff0c 这样就可以把程序逻辑理清 中间的分析就是看函数如何处理的 span class hljs keyword extern
  • /etc/init.d/rcS文件详解

    我使用的简单rcS文件内容如下 最后的IP地址设定非常重要 xff0c 一定要跟服务器的地址再同一个网段 xff0c 不然会出现无法连接错误 nfs server 192 168 0 102 not responding still try
  • 步骤三:PX4,Mavros的下载安装及代码测试

    1 安装Mavros sudo apt install ros melodic mavros ros melodic mavros extras 2 安装Mavros相关的 geographiclib dataset 此处已经加了ghpro
  • 四、无人机知识笔记(初级:基本运动原理)

    笔记来源于 沈阳无距科技 工业级无人机的中国名片 编程外星人 目录 一 多旋翼直升机 二 基本飞行姿态 三 多旋翼飞行原理 四 反扭力与偏航运动 五 螺旋桨 六 有刷电机和无刷电机 七 电调与PWM信号 八 动力电池 九 遥控器 十 机架设

随机推荐

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

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