文章目录
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地图)
- 查看某个.bag的数据信息(其中*为.bag文件名)
rosbag info *.bag
- 解析该.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>
- 解析.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