Cyber_数据解析—Apollo_Record&rosbag保存格式

数据驱动

数据流程: 数据采集-数据处理-数据传输-数据存储 
数据管理
    建立数据的meta信息
     1.假如传感器的配置--配置的元数据
     2.标定的元数据-版本管理-gitlab或者github
     3.数据存储的格式以及版本
     4.数据可视化以及数据检索-数据可视化主要是为了方便调试和解决问题

数据处理流程

cyber的数据流程可以分为6个过程。
    Node节点中的Writer往通道里面写数据。
    通道中的Transmitter发布消息,通道中的Receiver订阅消息。
    Receiver接收到消息之后,触发回调,触发DataDispather进行消息分发。
    DataDispather接收到消息后,把消息放入CacheBuffer,并且触发Notifier,通知对应的DataVisitor处理消息。
    DataVisitor把数据从CacheBuffer中读出,并且进行融合,然后通过notifier_唤醒对应的协程。
    协程执行对应的注册回调函数,进行数据处理,处理完成之后接着进入睡眠状态

数据解析

1.消息的持久化
	01.序列化和反序列化
	02.消息索引
	
2.	序列化和反序列化	
    Rosbag的序列化和反序列化是自己实现的,ros是单个消息序列化,apollo是整个chunk序列化
	apollo record则采用了protobuf来进行序列化和反序列化
	
3.消息索引	
	
4.功能
    Bag header 头信息放在文件首部,
	Chunk info 块的索引和消息元信息的索引都是放在文件的末尾-2个统计record都会保存在文件末尾。	
	
	Index data

Rosbag

rosbag storage format 
 Rosbag 文件由许多的record组成
   每个record由header和data组成, header和data,还需要保存header_len和data_len
        信息头(Headers)。每个记录头包含一系列 name=value 字段 Op 码所有的信息头必须包含Op码字段
   record0  Bag header 主要存放bag包整体的信息,必须是第一个 record	 
   record1:
            Message data 块的结构之一,消息序列化之后以二进制存储,
			                          通过Connection获取消息格式后进行反序列化
            Connection 块的结构之一,存放信息的格式信息,有了消息的格式,才能解析消息
            Chunk 主要的数据结构,可以被压缩,可以理解为把N个消息打包为一个块(Chunk) 一个块中可能有多种不同的消息
            Chunk info 块的结构之一,主要描述块的信息,例如消息的起始和结束时间等
            Index data 索引数据,因为一个块比较大,索引消息在块中的位置				
	
	    index_pos  index data 一个消息对应一个index
		reflection:bag包中的Connection包含了数据类型和格式,而每个Message data中可以找到Connection,从而找到消息类型,进行解析 
		
 a time-based index of all the messages at the end of the file.	
 the message definitions 
 
  introduced an internal partitioning called a "Chunk." 
    Chunks are blocks of messages, usually grouped by time or message-type and optionally compressed
	includes a sub-index describing the messages it contains
the end of the bag now had a collection of Chunk Info records with each chunk's location

图例

Record

Record文件由许多的 Section 组成
  Header 
  Section Type:	ChunkHeader ChunkBoady RecordInfo Index Channel

 Section 0:第一个Section 0为HEADER类型。Header中指明了索引区Index的位置
 Section 1:
            Index Data 包含一个SingleIndex类型数组,作为Section的索引,保存了Channel、ChunkHeader、ChunkBody三种Section的位置和简要数据。
            record.proto中并不存在Chunk这个结构,而是用ChunkHeader和ChunkBody两部分来表示。
			
序列化:
   每个Section的数据部分通过protobuf提供的函数进行序列化。
          apollo/cyber/record/file/record_file_writer.h 文件中
反序列化:读取record文件时,需要将每个Section的数据部分通过protobuf提供的函数进行反序列化。
          apollo/cyber/record/file/record_file_reader.h 文件中			  
 
   protobuf的原理实际上是根据用户定义好的proto文件,来对消息进行解析,实际使用的时候,
   protobuf采用了descriptor来描述proto文件,
              而descriptor_pb则是proto文件的proto,descriptor_pb只能描述它自己,但并没有包含它引用的消息的格式
			    我们就可以知道消息的结构,有哪些字段,也就能够解析消息了
思路:
   自身的消息描述descriptor和它依赖的所有消息的descriptor,都放入descriptor_pool,之后就可以根据消息类型来创建消息了   
    apollo/cyber/proto/record.proto
    apollo/cyber/record/file/section.h
 录制文件可以按时间分段也可以按大小分段,
     文件cyber/record/record_writer.cc中的RecordWriter::SplitOutfile负责文件切片段。		

思路:

通过 时序数据库InfluxDB 来对传感器数据进行管理	 


Willow Garage由传奇程序员Scott Hassan(他是Google最初代码的编写者)创立,是一家机器人研发与孵化公司。
2006年,Hassan创立了Willow Garage
 它开发了机器人开源操作系统软件ROS、标准机器人PR2和TurtleBot,为机器人行业做出了巨大的贡献,
直到2014年它关闭了所有业务。	
SDK 需要能够轻松地将所有数据转换为 Rerun 基于 Arrow 的格式

参考

https://wiki.ros.org/Bags/Format/2.0	
apollo介绍之Cyber框架(十一) https://zhuanlan.zhihu.com/p/115046708
Rosbag格式分析  https://zhuanlan.zhihu.com/p/494474804 
Apollo record文件格式 https://blog.csdn.net/weixin_43739110/article/details/121852346 
ROS Bags/Format/2.0 中文图解 https://zhuanlan.zhihu.com/p/87213444 
From the Evolution of Rosbag to the Future of AI Tooling https://www.rerun.io/blog/rosbag
https://theorg.com/org/rerun/org-chart
cyber_recorder报文录制简介 https://cloud.tencent.com/developer/article/1796672
一张图对比Rosbag和cyber record https://zhuanlan.zhihu.com/p/496684194 
posted @ 2024-04-10 16:56  辰令  阅读(287)  评论(0编辑  收藏  举报