logo

开发者说|Rosbag转Apollo数据包

作者:技术小柏2022.04.14 16:03浏览量:499

简介:开发者说|Rosbag转Apollo数据包

下面是由社区开发者——王方浩提供的文章,本文主要介绍 Rosbag转Apollo数据包。

关于作者

王方浩,社区布道师,武汉大学电子信息专业,先后在华为和阿里从事固件、驱动、操作系统和后台相关的开发工作,目前主要从事L4级别自动驾驶的开发,喜欢研究技术,分析源码和解答问题,目前活跃于Apollo自动驾驶开源社区,平时喜欢做一些户外运动,对自动驾驶的前景担心的同时又充满激情,“莫愁前路无知己,天下谁人不识君”,希望更多的人一起!

概览

关于Rosbag转Apollo Record的工具,大概的思路是先读取Rosbag,然后根据不同的消息类型,把Rosmsg转换为Proto格式的消息,最后保存为Apollo Record格式的数据包。
接下来看具体如何实现。

解析Rosbag

第一步是分析如何解析Rosbag,这一步实际上可以参考Ros的实现,关于Rosbag格式的分析,以及如何解析可以参考《开发者说|Rosbag格式分析》。

转换消息

接下来最关键的一步,如何把Ros Msg转到Proto,有以下两种方法:

Python对象转Proto对象
这种方法先利用现有的Ros序列化和反序列化,把Rosbag消息读取到内存,保存为一个对象,接下来只需要把Python对象转换为Proto对象就可以了。

转换过程中,首先需要遍历对象的数据结构,其次还需要能够根据属性名称为Proto对象赋值,遍历对象的属性在C++中并不支持,Python通过Dir方法可以,通过Setattr方法,同时根据名称给对象赋值在Python中也是可行的。唯一麻烦的地方在于对于一个对象,要遍历它所有的子对象,所有的子对象都要完成转换。

Ros反序列化修改
另一种是直接修改Ros的反序列化代码,在反序列化的时候直接转换为Proto的对象,缺点是实现起来改动比较大,需要改变Ros Genmsg部分的代码。

最后决定还是先用第一种方式来实现。

APOLLO Record 保存

接下来把转换好的消息按照Record格式保存就可以了。实际上只要前面的转换搞定了,直接调用Protobuf的接口就可以保存了,唯一需要注意的是Record的格式。

这里简单对比下Rosbag和Apollo Record的实现,两者都实现了消息的持久化,这实际上包括两个功能。

  • 序列化和反序列化
  • 消息索引

Rosbag的序列化和反序列化是自己实现的,而Apollo Record则采用了Protobuf来进行序列化和反序列化,因此省去了很多工作,也更加高效。

消息索引方面,Apollo Record反而做的没有Rosbag好,主要体现在块内部索引中,Rosbag通过保存块中每种不同格式消息的时间戳和偏移,查找的时候可以快速进行随机读取,而不用读取整个块,可以提高效率,而Apollo目前没有这样做。

其它的一些功能两者都实现了,例如头信息放在文件首部,块的索引和消息元信息的索引都是放在文件的末尾,这也非常好理解,因为收到消息后,就会实时写入文件,否则会出现大量缓存,而消息的统计信息在实时累加,只有当保存Bag的时候,才能确认好统计信息,因此这两个统计Record都会保存在文件末尾。

当要追加写文件,也就是要合并两个Bag包的时候,需要把末尾的统计信息删除改写之后再写入。

总结

接下来可以继续思考的一个问题是如何更好的进行数据的管理,传统的文件块对随机读写和查找的性能应该没有数据库快,那么是否可以通过数据库的方式来访问和检索数据,这样可以极大的提高效率,这块应该大有可为,可以做一个自动驾驶数据处理平台。

本文部分内容参考链接

相关文章推荐

发表评论