Rosbag API的学习

2019-06-20  本文已影响0人  阮明晨

一、用Rosbag API来对bag文件进行解析。

1.1bag文件的基本数据类型:

1.1

1.2用API对上图的信息进行提取显示

所用的编译器为Qt5.9.3,环境为ubuntu16.04。

1、boost::shared_ptr<rosbag::Bag> m_file;创建文件指针             

     m_file = boost::shared_ptr<rosbag::Bag>(new rosbag::Bag()); 指针指向类对象

     m_file->open(m_filePath, rosbag::bagmode::Read); 利用open函数打开bag文件,bagmode是枚举类型可以改变

    这个时候你就可以用m_file来做一些事情了。

2、rosbag::View viewer(*m_file);创建类对象

     viewer.size();得到了1.1图中messages的值

     viewer.getConnections().size();获取Topic话题的总数,1.1图上是4个

     viewer.getConnections().at(num)->topic; string类型。可以获取指定索引的话题

     viewer.getConnections().at(num)->datatype;string类型。可以获取指定索引话题的类型

特殊的:

      当你想获取指定索引话题的1.1图上msgs前面的数据时候你需要单独写一个类继承rosbag::View

3、解析点云数据

   当解析的时候还需要这个创建 rosbag::View* m_view;

    m_view = new rosbag::View(*m_file, rosbag::TopicQuery("/kitti/velo/pointcloud"));

    rosbag::View::iterator iter;创建一个迭代器来显示不同数据帧的信息(一个话题有msgs这么多帧的信息)当用迭代器的时候需要初始化

    iter = m_view->begin();//迭代器初始化

    当你想读取下一帧的时候:  if(iter != m_view->end())  {      iter++;     }  

    但是在我这编译环境下迭代器是不能iter--的,所以我只能用一个计数器记录当前的帧数,往前查询的时候计数器--:iNum为计数器

3.1

利用图3.2代码进行解析

3.2

解析过后可以得到图3.3数据:

3.3

这个?id是我自己计算的。

4、解析图像数据

1、与解析点云数据不一样的地方有2

第一点:迭代器的指向是不一样的:

m_view = new rosbag::View(*m_file,rosbag::TopicQuery("/kitti/camera_color_left/image_raw"));

iter = m_view->begin();

第二点:具体解析的时候:

5、写点云数据

首先你需要创建一个bag文件:

m_writebag = boost::shared_ptr<rosbag::Bag>(new rosbag::Bag()); 

 m_writebag->open(m_savePath, rosbag::bagmode::Write);

m_writebag->write((*iter).getTopic(),(*iter).getTime(), (*iter));也是通过迭代器来写当前帧的数据

这个操作和打开bag文件和相似,只是参数做了变更。

6、我做的Demo的样子

学完这些,如果你更想深入了解的话建议你去http://wiki.ros.org/rosbag/Code%20API 也就是Ros的官方网去进行学习。你也可以下载Zeal从里面下载Ros的API文档进行学习,这里面的东西非常的全面,并且可以搜索非常好!

上一篇 下一篇

猜你喜欢

热点阅读