前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >cyber_recorder报文录制简介

cyber_recorder报文录制简介

作者头像
coderhuo
发布2021-03-03 15:08:24
3.1K0
发布2021-03-03 15:08:24
举报
文章被收录于专栏:coderhuocoderhuo

车载软件开发调试,不可能每次都出车路测,否则成本太高。 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负责文件切片段。
  • RecordWriter中的统计信息统计的是可执行文件cyber_recorder的一次运行,RecordFileWriter中的统计信息统计的是一个记录文件;文件切片段的时候 RecordWriter中的统计信息不reset,RecordFileWriter中的统计信息reset(对象都重新生成了)
  • 单个录制文件可能包含多个通道(Channel),这些通道的消息起点和发送频率可能都是不同的;另外,回放的时候,还有可能同时回放多个文件(一个文件对应一个RecordReader对象),这些文件可能包含若干个通道。这就涉及多通道回放时不同通道间的时间同步问题cyber/record/record_viewer.cc就是用来处理这个事情的。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档