您的当前位置:首页正文

ros提取bag包中的图像

来源:画鸵萌宠网
ros提取bag包中的图像

bag⽂件是ROS常⽤的数据存储格式,因此要从bag⽂件中提取数据就需要了解⼀点ROS的背景知识。

1. 什么是ROS及其优势

ROS全称Robot Operating System,是BSD-licensed系统⽤于从PC上控制机器⼈组件。ROS系统由⼀系列的独⽴node组成,彼此间通过publish/subscribe消息传递模式相互沟通。⽐如某个传感器驱动由某个node执⾏,将该传感器数据⽤message stream的形式publish,⽽这些message则可以在数据处理或者⽇志节点被使⽤。

因为ROS的node不需要⼀定在相同的系统或构架上,也就是说不同的node可以部署到不同平台的机器上(⽐如传感器publish数据,PC处理数据,Android智能机执⾏操作),故ROS⾮常灵活可以适应各种需求。还有⼀个原因就是ROS是开源的,可以免费使⽤和修改。

2. ROS的结构

下图举了⼀个ROS系统的结构:

ROS从ROS master开始,任何node都需要在master进⾏注册,从⽽⽅便node之间进⾏消息传递。这⾥,camera node与相机进⾏交流,publish名为/image_data的主题,其他节点都subscribe这个主题⽤于获取消息;⽽机器⼈上⾯的计算机有⼀个processing node对subscribe的图像数据进⾏处理;⽽在另⼀台PC上,有⼀个image display node对subscribe的数据进⾏展⽰。

3. ROS⼯具的

⽬前ros⼯具提供c++和python两种API,⽽正式⽀持的操作系统只有Ubuntu和Debian(linux⼤发好,退win保平安)。1). 设置sources.list

允许本机接受来⾃packages.ros.org的包,ros kenetic值⽀持Ubuntu 15.10和16.04以及Debian 8。

$ sudo sh -c 'echo \"deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main\" > /etc/apt/sources.list.d/ros-latest.list'

2). 设置key

$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

3). 安装

$ sudo apt-get update

# 由于ros有许多库和⼯具可供选择,⼀般默认选这个版本:Desktop-Full Install: ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators, navigation and 2D/3D perception$ sudo apt-get install ros-kinetic-desktop-full

4).初始化rosdep

在使⽤ros之前需要初始化rosdep,rosdep可以使安装编译源所依赖的包变得很⽅便,也是⼀些ROS运⾏⼀些核⼼组件所需的。

$ sudo rosdep init$ rosdep update

5).环境设置

将ROS环境变量添加到环境变量中

# 将命令添加到~/.bashrc⽂件中可以使每次启动新的session都加载ros变量,⾮常⽅便$ echo \"source /opt/ros/kinetic/setup.bash\" >> ~/.bashrc$ source ~/.bashrc

6).安装rosinstall

rosinstall 是在ROS中经常⽤到的命令⾏⼯具。

$ sudo apt-get install python-rosinstall

7).测试安装

在终端中输⼊rosbag/rostopic --help等命令看是否报错

4. ROS⼯具使⽤实例

1). 启动ROS master

只有在启动master之后才能开始ros的其他操作,⽽由于roscore⼀直运⾏,所以执⾏其他ros命令时需要在另⼀个终端中进⾏。

$ roscore

2). rostopic命令

a. 查看当前master下的topic

$ rostopic list # 列出topic名称,具体可⽤其他rostopic命令进⾏查看等操作。

PS:在开始的时候都会有以下两个topic:/rosout和rosout_agg。前者⽤于报道系统的debug消息后者⽤于整合debug消息。

b. 发布新的topic

$ rostopic pub /hello std_msgs/String “Hello Robot\" # /hello 是新的topic名称;后者为topic的类型;最后引号内的\"Hello Robot\"是具体的消息数据。

c. 输出topic中的数据

$ rostopic echo /hello

d. 查看topic中的数据

$ rostopic info /hello

3).查看正在发布消息的node

$ rosnode list

4).查看node的具体信息

$ rosnode info /rostopic_.... # ...为数字

5. ⽤ros⼯具从bag⽂件中提取图⽚

1). ⾸先需要安装⼀些图⽚处理依赖的包: MJPEG, ffmpeg

$ sudo apt-get install mjpegtools$ sudo apt-get install ffmpeg

2). 新建⽂件夹⽤于储存提取后的图⽚,并执⾏:

$ rosrun image_view extract_images _sec_per_frame:=0.01 image:= # 为bag⽂件中储存图⽚的topic

PS:如果输出的图⽚数量与rosbag info命令查询得到的数量不符,可以减少_sec_per_frame参数的值。3). 打开另⼀个终端,导向岗新建的⽂件夹,然后执⾏:

$ rosbag play # 为bag⽂件的路径

6. 将提取的图⽚转换成视频

PS:这部分并不涉及ros的操作,可以跳过。

这⽆⾮就是将图⽚压成视频,可以⽤FFMPEG包或者Mencoder包来执⾏。

1). ⾸先决定⽂件的fps。⽤rosscore info来确认视频的图⽚数,然后除以持续的时间即可。

# ⽤mencoder压制

$ mencoder -nosound mf://*.jpg -mf w=:h=:type=jpg:fps= \\ -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=\\ :mbd=2:keyint=132:v4mv:vqmin=3:lumi_mask=0.07:dark_mask=0.2:mpeg_quant:scplx_mask=0.1# ⽤FFMPEG压制

$ ffmpeg -r -b -i frame%04d.jpg .avi

7. 提取bag⽂件中的数据并保存为csv格式

对于⾮图⽚数据,⼤部分情况下都可⽤csv⽂件存储。从section 5中我们就可以指导⽤rostopic echo即可打印topic中的数据。

$ rostopic echo -b -p > .csv # 是bag⽂件,为数据所在的topic

参考:

1. 2. 3. 4.

因篇幅问题不能全部显示,请点此查看更多更全内容

Top