一、用Rosbag API来对bag文件进行解析。
1.1bag文件的基本数据类型:
1.11.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文档进行学习,这里面的东西非常的全面,并且可以搜索非常好!
网友评论