C++对rosbag文件各类操作实例学习

1.rosbag写入文件

    rosbag::Bag bag;
    bag.open("test.bag", rosbag::bagmode::Write);
 
    std_msgs::String str;
    str.data = std::string("foo");
 
    std_msgs::Int32 i;
    i.data = 42;
 
    bag.write("chatter", ros::Time::now(), str);
    //从ros::Time实例中获得当前时间ros::Time::now()
    bag.write("numbers", ros::Time::now(), i);
 
    bag.close();

2.rosbag读取文件

    rosbag::Bag bag;
    bag.open("test.bag", rosbag::bagmode::Read);
 
    std::vector<std::string> topics;
    topics.push_back(std::string("chatter"));
    topics.push_back(std::string("numbers"));
 
    rosbag::View view(bag, rosbag::TopicQuery(topics));//note:TopicQuery;TypeQuery
	
	//   std::vector<std::string> types;
	//   types.push_back(std::string("geometry_msgs/TransformStamped"));
	//   rosbag::View view(bag, rosbag::TypeQuery(types));
 
    foreach(rosbag::MessageInstance const m, view)
    {
        std_msgs::String::ConstPtr s = m.instantiate<std_msgs::String>();
        if (s != NULL)
            ASSERT_EQ(s->data, std::string("foo"));
 
        std_msgs::Int32::ConstPtr i = m.instantiate<std_msgs::Int32>();
        if (i != NULL)
            ASSERT_EQ(i->data, 42);
    }
 
    bag.close();

3.通过Launch文件修改rosbag发布的话题

<launch> 
<!-- <remap from="/camera/depth_registered/camera_info" to="/camera/depth/camera_info"/> -->
 <!-- <remap from="/camera/depth_registered/image_raw" to="/camera/depth/image_raw"/> --> 
 <node pkg="rosbag" type="play" name="playe" output="screen" args="--clock /home/zuo/database/tModel-P/calib/test/2017-10-18-21-30-41.bag"/> 
 <!-- 注意这里bag文件的路径必须为绝对路径-->
  </launch>

4.将rosbag中的.bag文件转化成.jpg图片数据和.pcd点云数据(保存loam地图)

  1. 查看某个.bag的数据信息(其中*为.bag文件名)
rosbag info *.bag
  1. 解析该.bag文件到.jpg格式图片

运行launch文件
roscore
roslaunch export.launch

launch文件内容:
注意:其中"home/nawenjie/1st.bag"为需要解析的.bag文件路径, "/pandora/sensor/pandora/camera/front_color"想要解析的话题名称
<launch>
      <node pkg="rosbag" type="play" name="rosbag" args="-d 2 /home/nawenjie/1st.bag"/>
      <node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
        <remap from="image" to="/pandora/sensor/pandora/camera/front_color"/>
      </node>
 </launch>

  1. 解析.bag文件到.pcd点云数据文件
rosrun pcl_ros bag_to_pcd <*.bag> <topic> <output_directory>

保存loam的地图:

运行laom节点:roslaunch loam_velodyne loam_velodyne.launch
录制loam后生成的地图:rosbag record -o out /laser_cloud_surround//注意话题是全部拼接的点云
保存为pcd格式文件: rosrun pcl_ros bag_to_pcd input.bag /laser_cloud_surround pcd
保存为pcd格式文件:rosrun pcl_ros pointcloud_to_pcd input:=/laser_surround_cloud
此时转化为一个名为cloud的pcd集,cd进入pcd那个文件夹
查看地图:pcl_viewer last.pcd

5.将rosbag文件某一话题存成txt文件或csv文件

将file_name.bag文件中topic_name话题的消息转换到Txt_name.txt文件中:
rostopic echo -b file_name.bag -p /topic_name > Txt_name.txt(或者*.csv)

6.播放rosbag文件话题总结

如果想改变消息的发布速率,可以用下面的命令

rosbag play -r 2 <bagfile>

这时的轨迹相当于以两倍的速度通过按键发布控制命令时产生的轨迹。 -r 后面的数字对应播放速率。
如果希望 rosbag 循环播放,可以用命令

rosbag play -l  <bagfile>  # -l == --loop

如果只播放感兴趣的 topic ,则用命令

rosbag play <bagfile> --topic /topic1  /topic2

使用launch文件进行播放,简化播放步骤:

<?xml version="1.0"?>
<launch> 
<node pkg="rosbag" type="play" name="played" output="screen" args="--clock -r 0.2 /****/****.bag"> 
    <remap from="/imu/data" to="/*****/imu"/>
    <remap from="/velodyne_points" to="/*******/lidar/pointcloud3"/>
 </node>
 <!-- 注意这里bag文件的路径必须为绝对路径-->
</launch>

在上述播放命令执行期间,空格键可以暂停播放。

7.参考

1.https://answers.ros.org/question/9102/how-to-extract-data-from-bag/
2.http://wiki.ros.org/rosbag/Tutorials/Exporting image and video data
3.https://blog.csdn.net/weixin_40000540/article/details/83859694

  • 17
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值