文章目录
解析rosbag中的.bag文件,得到.jpg图片数据和.pcd点云数据
https://blog.csdn.net/weixin_40000540/article/details/83859694
-
- 1.rosbag写入文件
- 2.rosbag读取文件
- 3.通过Launch文件修改rosbag发布的话题
- 4.将rosbag中的.bag文件转化成.jpg图片数据和.pcd点云数据(保存loam地图)
- 5.将rosbag文件某一话题存成txt文件或csv文件
- 6.播放rosbag文件话题总结
- 7.参考
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点云数据, 可视化 rviz
---详细版本,他们说的太不清楚了,自己理解了一下
4.1 查看某个.bag的数据信息(其中*为.bag文件名)
cd my_c++/VINS_test/ROS_bag // 首先进入.bag 的目录: 我把 MH_01_easy.bag 放在了 my_c++/VINS_test/ROS_bag
rosbag info MH_01_easy.bag //查看信息,具体如下
path: MH_01_easy.bag
version: 2.0
duration: 3:06s (186s)
start: Jun 25 2014 03:02:59.81 (1403636579.81)
end: Jun 25 2014 03:06:06.70 (1403636766.70)
size: 2.5 GB
messages: 47283
compression: none [2456/2456 chunks]
types: geometry_msgs/PointStamped [c63aecb41bfdfd6b7e1fac37c7cbe7bf]
sensor_msgs/Image [060021388200f6f0f447d0fcd9c64743]
sensor_msgs/Imu [6a62c6daae103f4ff57a132d6f95cec2]
topics: /cam0/image_raw 3682 msgs : sensor_msgs/Image
/cam1/image_raw 3682 msgs : sensor_msgs/Image
/imu0 36820 msgs : sensor_msgs/Imu
/leica/position 3099 msgs : geometry_msgs/PointStamped
注意:topics, 也是后面我们需要用到的内容
4.2 建立 export.launch 文件
export 只是 launch 文件的名字,你自己想起什么名字都行
建立一个launch文件
vim export.launch //我安装的是vim, 你们可能是其他的;输入 i 代表开始输入,按 Esc 键后,再 输入 :wq 便完成保存
export.launch 的内容如下:
<launch>
<node pkg="rosbag" type="play" name="rosbag" args="-d 2 /home/hltt3838/my_c++/VINS_test/ROS_bag/MH_01_easy.bag"/>
<node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
<remap from="image" to="/cam1/image_raw"/>
</node>
</launch>
注意: 其中 /home/hltt3838/my_c++/VINS_test/ROS_bag/MH_01_easy.bag 为需要解析的 MH_01_easy.bag 文件路径, "/cam1/image_raw" 想要解析的话题名称, 对应 4.1 中 rosbag info MH_01_easy.bag 后的 topics 信息。
4.3 解析该.bag文件到.jpg格式图片
roscore //打开终端,运行roscore, master是整个ROS运行的核心,roscore就是用来启动master的
roslaunch export.launch // 新建终端, cd到export.launch文件夹下, 运行代码如下
解析结果如下:
4.4 rviz可视化bag包
打开端口1
roscore // 启动 ROS,注意拉,这个是必须打开的,不能上来就 rosbag play MH_01_easy.bag
打开端口2:启动 rviz
rosrun rviz rviz // rviz是包名
打开端口3
进入文件夹:cd my_c++/VINS_test/ROS_bag , 里面包含 MH_01_easy.bag
rosbag play MH_01_easy.bag
打开后在 rviz 左侧 Add 中点击 by display type 或者 by topic 中添加 pointcloud2 和 image
疑问:rosrun rviz rviz 和 rosbag play MH_01_easy.bag 是两个独立的部分,为什么 bag里面的数据可以在 rviz 里面显示 ?
个人认为:rosbag play MH_01_easy.bag 可以当成一个节点吧,节点运行时其实 MH_01_easy.bag 里面是有topic的, 而rosrun rviz rviz 也可以看作一个独立的部分吧, rviz 通过订阅 MH_01_easy.bag发布的topic 进而建立联系,而谁来管这个事情,就是 roscore. 没有这个程序,两个节点之间建立不了通信,可以试以下。学习以下ROS的简单原理
4.5 解析.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)
roscore // 启动 ROS
//进入文件夹:cd my_c++/VINS_test/ROS_bag , 里面包含 MH_01_easy.bag
rostopic echo -b MH_01_easy.bag /imu0 > imu.txt(或者*.csv)
注意:MH_01_easy.bag 的 topic_name 包括:/cam0/image_raw /cam1/image_raw /leica/position /imu0
自己选一个就行
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)