车载软件开发调试,不可能每次都出车路测,否则成本太高。 apollo中提供了cyber_recorder工具,可以将报文录制下来,保存为文件。这样,实际路测的时候,可以把相关报文保存下来,后续可以通过报文回放进行开发调试。 本文主要基于apollo v6.0介绍cyber_recorde的报文录制功能。
cyber_recorder录制的文件结构如下图所示,各组成部分由protocolbuffers描述,protocolbuffers文件路径为cyber/proto/record.proto
。下面介绍几个重要的组成单元:
Header:文件头部信息,用来描述整个文件的信息。
Chunk:报文存储区域,每个Chunk包含多个报文,一个录制文件可能由多个Chunk组成。record.proto中并不存在Chunk这个结构,而是用ChunkHeader和ChunkBody两部分来表示。
Index:索引信息,位于尾部(Header中的index_position字段指向Index的起始位置),平时只是维护在内存中,只有在文件关闭前才会写到文件中(报文录制过程中如果出现异常可能导致录制文件无法打开)。共有三种索引:
以上大致介绍了cyber_recorder所录制文件的逻辑结构。实际上,在上图所示的Header、Channel、ChunkHeader、ChunkBody前面,都有个Section的结构,它的定义位于cyber/record/file/section.h
中,比较简单,只包含类型和长度,类型由record.proto中的SectionType定义,长度代表本section的长度。加上这个结构,读取文件的时就可以很方便的以Header、Channel、ChunkHeader、ChunkBody或者Index为单位进行读取。
其他:
cyber/record/record_writer.cc
中的RecordWriter::SplitOutfile
负责文件切片段。cyber/record/record_viewer.cc
就是用来处理这个事情的。