ROS+SLAM学习日志(3)获取图像与视频

在ROS中,一般会有一个节点用于展示摄像头采集到的图像。这是一个包含复杂数据的topic,一般最好用特殊的工具来显示与分析。因为这里根据摄像头设备的不同需要不同的launch文件来启动摄像头,我这里用的是自己机器人的文件,或者也可以用网上的例程用自己笔记本摄像头实验,用 rostopic hz XXX 可以看到视屏的帧率,其中XXX是topic的名称。

图片的获取不能直接使用 rostopic echo XXX指令来获取,这样得到的图片信息是text格式的,显示出来十分庞大而且我们也无法识别。我们可以用一下指令来获取单张图片

$ rosrun image_view image_view image:=XXX

这个image_view结点是ROS自带用于展示主题中图片。用这种方法我们可以看到发布的主题中的每一张图片,甚至还可以通过网络访问的方式来查看。在打开的窗口上还可以右键来保存当前帧,一般会存储在 ./ros文件夹下。

topic与帧之间有什么关系呢,所有的topic必须有一个帧。一个激光固定的位置代表机器人的base link(一般位于方向轮的中间)。如果我们用激光与扫描与检测障碍物,那必须传递激光与base link的信息。在ROS中信息都会表上一个frame_id的标签,不同于时间戳,它基于每一帧专属的名字。这种类型的帧本身没有什么意义,我们需要对帧做转化,才能被可视化。

那么要怎么才能保存这些数据呢,这里有个强有力的工具可以解决这个问题。ROS可以存储任何发布在topic上的message。它可以建立一个bag文件,这个文件包含于其他节点通讯的message以及相应的时间戳。另外,这bag可以离线重现实验,重现之前真实环境下的信息传递(包括延迟)。
所有的message都有时间戳,不仅包括头文件的,还有数据包内部的。不同之处在于,头部的时间戳在消息被记录时才创建的,而内部的是有发布者设置的。

数据是以二进制格式存储在bag文件中的,这种方式可以是记录更加高效。先用rosrun指令启动一个节点,然后用以下指令来记录bag,其中XXX为之间启动的node通讯用的topic名称。

$ rosbag record XXX

之后便开始记录message,按ctrl+c可以停止记录。如果想在节点开始时就记录,那么可以在launch文件上添加如下

"rosbag" type="record" name="bag_record"
            args="/temp /accel"/>

在记录之后可以使用 rosbag info 指令来显示bag文件的基本信息
ROS+SLAM学习日志(3)获取图像与视频_第1张图片

可以看出我保存的就是摄像头的图片信息,以及文件大小,时间等信息。还有一种办法可以更好的看到文件的内容,那就是使用rqt_bag这个GUI,是在命令输入 rqt_bag即可启动该程序,然后打开想要查看的bag文件。这里右键可以选择查看不同文件类型。如图

ROS+SLAM学习日志(3)获取图像与视频_第2张图片

除了使用GUI工具之外,我们还可以自己从bag文件中提取图片,这里需要创建launch文件

 <launch>
      <node pkg="rosbag" type="play" name="rosbag" args="-d 2 $(find image_view)/test.bag"/>
      <node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
        <remap from="image" to="/camera/image_raw"/>
      node>
 launch>

其中/camera/image_raw可以改成自己需要获取的topic。第一个node是将bag的内容进行回放到topic,第二个node才是从topic中提出原始数据。
当然如果存储足够的话可以直接从topic中提取,也就是说,第一个node就不用了。这样在你的./ros下就可以看到图片了,如果想自定义文件夹,那么在执行launch文件之间,先export ROS_HOME=XXX,XXX就是你想要的路径。

想要直接获取视频可以用image_view中的video_record,直接用命令行如下

rosrun image_view video_recorder image:=/camera_node/image_raw

你可能感兴趣的:(ROS)