【 ros wiki 】英文教程 18:Reading messages from a bag file 翻译

最近看了看ros wiki上的英文教程,惊奇的发现,英文教程比中文教程多了一节教程,所以闲来无事,就把它翻译下来,供人参考,英语水平有限,多多担待。

英文:

【 ros wiki 】英文教程 18:Reading messages from a bag file 翻译_第1张图片

中文:

在这里插入图片描述




【英文教程链接】:Reading messages from a bag file

18. 从bag文件中读取消息

学习从bag文件中读取感兴趣的消息的两种方法,包括使用ros_readbagfile脚本


从bag文件中读取消息

描述: 学习从bag文件中读取感兴趣的消息的两种方法,包括使用ros_readbagfile脚本
关键字: data, rosbag, extract, play, info, bag, messages, readbagfile, ros_readbagfile
教程水平: 初级
下一个教程: roswtf入门

目录:

  1. 也可以看看:
  2. 选项1:立即回放消息并且在多个终端中查看结果
  3. 选项2:使用ros_readbagfile脚本轻松的提取感兴趣的话题
  4. 为什么使用ros_readbagfile而不使用rostopic echo -b ?
  5. 下一个教程:

也可以看看:

  1. 其他的rosbag的教程:rosbag/Tutorials.
  2. rosbag 使用方法

注意:在进行这个教程前你应该已经完成了以前的教程:Recording and playing back data

关于教程的任何问题和疑问都可以在下面这个网址提问:answers.ros.org,同时不要忘了在提问你的问题的时候提供一个到本教程的链接,和你的OS & ROS版本,并且加上适当的标签。

从bag文件中读取消息

描述: 学习从bag文件中读取感兴趣的消息的两种方法,包括使用非常简单的ros_readbagfile脚本
关键字: data, rosbag, extract, play, info, bag, messages, readbagfile, ros_readbagfile
教程水平: 初级
下一个教程: 创建过滤的bag文件

目录:

  1. 选项1:立即回放消息并且在多个终端中查看结果
  2. 选项2:使用ros_readbagfile脚本轻松的提取感兴趣的话题
  3. 为什么使用ros_readbagfile而不使用rostopic echo -b ?

首先,你需要一个bag文件,这个文件可以是你在之前的教程(ROS/Tutorials/Recording and playing back data)创建出的,也可以是从https://open-source-webviz-ui.s3.amazonaws.com/demo.bag下载的https://webviz.io 样例文件,下载样例文件可以使用下面的wget命令:

wget https://open-source-webviz-ui.s3.amazonaws.com/demo.bag

想要学习本篇教程接下来的部分,前提是假定你已经下载了之前提到的 webviz.io bag样例文件。你将会学习两种方法来从一个bag文件中 读/提取 消息。

注意:在以下的所有命令中,需要加上简单的 time 命令,它会展示出每个命令执行所需的时间,因为有些命令会占用很长时间,因此当想要知道命令需要执行多长时间的时候,time命令就很有用处,如果你不想用time命令,只需要在接下来的命令中将之移除即可。

选项1:立即回放消息并且在多个终端中查看结果

来源:本节改编自的文章,第一次发布在这里。

  1. 你需要知道你想要从bag文件中提取出什么话题。因此,让我们看看bag文件中有什么。选择一个终端,手动查看所有发布的话题,以及每个话题发布了多少消息。可以使用下面这个命令:

    time rosbag info demo.bag  
    # OR (if you know part of the topic names of interest before-hand):
    time rosbag info mybag.bag | grep -E "(topic1|topic2|topic3)"
    

    样例输出:

    $ time rosbag info demo.bag  
    path:        demo.bag
    version:     2.0
    duration:    20.0s
    start:       Mar 21 2017 19:37:58.00 (1490150278.00)
    end:         Mar 21 2017 19:38:17.00 (1490150298.00)
    size:        696.2 MB
    messages:    5390
    compression: none [600/600 chunks]
    types:       bond/Status                      [eacc84bf5d65b6777d4c50f463dfb9c8]
                 diagnostic_msgs/DiagnosticArray  [60810da900de1dd6ddd437c3503511da]
                 diagnostic_msgs/DiagnosticStatus [d0ce08bc6e5ba34c7754f563a9cabaf1]
                 nav_msgs/Odometry                [cd5e73d190d741a2f92e81eda573aca7]
                 radar_driver/RadarTracks         [6a2de2f790cb8bb0e149d45d297462f8]
                 sensor_msgs/Image                [060021388200f6f0f447d0fcd9c64743]
                 sensor_msgs/NavSatFix            [2d3a8cd499b9b4a0249fb98fd05cfa48]
                 sensor_msgs/PointCloud2          [1158d486dd51d683ce2f1be655c3c181]
                 sensor_msgs/Range                [c005c34273dc426c67a020a87bc24148]
                 sensor_msgs/TimeReference        [fded64a0265108ba86c3d38fb11c0c16]
                 tf2_msgs/TFMessage               [94810edda583a504dfda3829e70d7eec]
                 velodyne_msgs/VelodyneScan       [50804fc9533a0e579e6322c04ae70566]
    topics:      /diagnostics                      140 msgs    : diagnostic_msgs/DiagnosticArray 
                 /diagnostics_agg                   40 msgs    : diagnostic_msgs/DiagnosticArray 
                 /diagnostics_toplevel_state        40 msgs    : diagnostic_msgs/DiagnosticStatus
                 /gps/fix                          146 msgs    : sensor_msgs/NavSatFix           
                 /gps/rtkfix                       200 msgs    : nav_msgs/Odometry               
                 /gps/time                         192 msgs    : sensor_msgs/TimeReference       
                 /image_raw                        600 msgs    : sensor_msgs/Image               
                 /obs1/gps/fix                      30 msgs    : sensor_msgs/NavSatFix           
                 /obs1/gps/rtkfix                  200 msgs    : nav_msgs/Odometry               
                 /obs1/gps/time                    136 msgs    : sensor_msgs/TimeReference       
                 /radar/points                     400 msgs    : sensor_msgs/PointCloud2         
                 /radar/range                      400 msgs    : sensor_msgs/Range               
                 /radar/tracks                     400 msgs    : radar_driver/RadarTracks        
                 /tf                              1986 msgs    : tf2_msgs/TFMessage              
                 /velodyne_nodelet_manager/bond     80 msgs    : bond/Status                     
                 /velodyne_packets                 200 msgs    : velodyne_msgs/VelodyneScan      
                 /velodyne_points                  200 msgs    : sensor_msgs/PointCloud2
    
    real    0m1.003s
    user    0m0.620s
    sys 0m0.283s
    

    注意到/obs1/gps/fix话题发布了30条消息,/diagnostics_agg发布了40条消息,就让我们提取它们吧。

  2. 在终端 1 中,启动roscore,用来启动ros master节点

    roscore
    
  3. 打开另一个终端,提示:Ubuntu系统中,在同一个终端窗口中打开另一个终端标签的快捷键是 Ctrl + Shift +T 。订阅 /obs1/gps/fix话题,打印展示所有发布在这个话题上的消息,并且同时将之写入到一个文件中,这样做为了方便之后的查看,以上的这些都是yaml格式:

    rostopic echo /obs1/gps/fix | tee topic1.yaml
    

    你将会看到:

    $ rostopic echo /obs1/gps/fix | tee topic1.yaml
    WARNING: topic [/obs1/gps/fix] does not appear to be published yet
    
  4. 打开另一个终端,订阅/diagnostics_agg话题

    rostopic echo /diagnostics_agg | tee topic2.yaml
    

    你将会看到:

    $ rostopic echo /diagnostics_agg | tee topic2.yaml
    WARNING: topic [/diagnostics_agg] does not appear to be published yet
    
  5. 如果你想要订阅其他话题,你可以重复以上步骤。每一个订阅的话题都需要独占一个终端。

  6. 打开另一个终端,用来回放bag文件。我们将要尽可能快的回放这个bag文件(使用 --immediate 选项),仅仅发布我们感兴趣的话题,格式如下:

    time rosbag play --immediate demo.bag --topics /topic1 /topic2 /topic3 /topicN
    

    所以,在如上的案例中,命令行应该是这样样子的:

    time rosbag play --immediate demo.bag --topics /obs1/gps/fix /diagnostics_agg
    

    你将会看到:

    $ time rosbag play --immediate demo.bag --topics /obs1/gps/fix /diagnostics_agg
    [ INFO] [1591916465.758724557]: Opening demo.bag
    
    Waiting 0.2 seconds after advertising topics... done.
    
    Hit space to toggle paused, or 's' to step.
     [RUNNING]  Bag Time: 1490150297.770734   Duration: 19.703405 / 19.703405               
    Done.
    
    real  0m1.570s
    user  0m0.663s
    sys 0m0.394s
    
  7. 大功告成!现在回看我们当初订阅那两个话题的终端,你会看到它所订阅的话题的所有消息,以YAML格式呈现,每条消息之间以---分隔开。使用您选择的文本编辑器,最好对YAML文件类型使用语法高亮显示(例如:Sublime Text 3)来查看文件中的消息。例如:topic1.yaml文件的最后两条消息,是下面这个样子的:

    ---
    header: 
      seq: 4027
      stamp: 
        secs: 1490150296
        nsecs:  66947432
      frame_id: "gps"
    status: 
      status: 0
      service: 1
    latitude: 37.4008017844
    longitude: -122.108119889
    altitude: -6.4380177824
    position_covariance: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
    position_covariance_type: 0
    ---
    header: 
      seq: 4028
      stamp: 
        secs: 1490150297
        nsecs: 744347249
      frame_id: "gps"
    status: 
      status: 0
      service: 1
    latitude: 37.4007565466
    longitude: -122.108159482
    altitude: -6.35130467023
    position_covariance: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
    position_covariance_type: 0
    ---
    

    如果你的rostopic进程因为某些原因缺少了一些消息,你只需要用Ctrl + C 来 kill 这个进程,然后重启这个进程,最后再一次执行rosbag play命令即可。

选项2:使用ros_readbagfile脚本轻松的提取感兴趣的话题

来源:本节改编自的文章,第一次发布在这里。,并且 ros_readbag.py这个脚本文件来自这里。

注意:你可以kill任何正在运行的进程,例如:你需要关闭roscore进程。

  1. 使用以下命令下载并且安装 ros_readbag.py

    # Download the file
    wget https://raw.githubusercontent.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/master/useful_scripts/ros_readbagfile.py
    # Make it executable
    chmod +x ros_readbagfile.py
    # Ensure you have the ~/bin directory for personal binaries
    mkdir -p ~/bin
    # Move this executable script into that directory as `ros_readbagfile`, so that it will
    # be available as that command
    mv ros_readbagfile.py ~/bin/ros_readbagfile
    # Re-source your ~/.bashrc file to ensure ~/bin is in your PATH, so you can use this
    # new `ros_readbagfile` command you just installed
    . ~/.bashrc
    
  2. 使用rosbag info 命令来查看并决定你想要从bag文件中提取的话题,就像在选项1中的第一步的操作那样。

  3. 现在就可以使用ros_readbagfile命令了,它的一般格式如下:

    ros_readbagfile .bag> [topic1] [topic2] [topic3] [...]
    

    读取选项1中所选取的消息,使用:

    time ros_readbagfile demo.bag /obs1/gps/fix /diagnostics_agg | tee topics.yaml
    

    就是这样而已!你很快会看到共70条消息。下面是终端输出结果中最后一部分显示:

            key: "Early diagnostic update count:"
            value: "0"
          - 
            key: "Zero seen diagnostic update count:"
            value: "0"
    =======================================
    topic:           /obs1/gps/fix
    msg #:           30
    timestamp (sec): 1490150297.770734310
    - - -
    header: 
      seq: 4028
      stamp: 
        secs: 1490150297
        nsecs: 744347249
      frame_id: "gps"
    status: 
      status: 0
      service: 1
    latitude: 37.4007565466
    longitude: -122.108159482
    altitude: -6.35130467023
    position_covariance: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
    position_covariance_type: 0
    =======================================
    Total messages found = 70.
    DONE.
    
    real  0m2.897s
    user  0m2.457s
    sys 0m0.355s
    

    现在,使用你喜欢的编辑器打开topics.yaml文件,就可以看到从bag文件中提取出来的所有消息了。

    请注意,即使我已经为该文件指定了“ .yaml”文件扩展名,但是该文件的内容也不是全部都符合YAML格式。文件中存储的每条消息都是符合的YAML语法,但消息之间的周围标题和行分隔符(例如:=====)并不是YAML语法。 请记住以上的说法,以防你尝试将输出解析为YAML格式。 如果你愿意,你总是可以很容易地自己手动修改ros_readbagfile 的Python脚本文件,来删除这些非YAML功能。

为什么使用ros_readbagfile而不使用rostopic echo -b ?

回答:

  1. 因为rostopic是真的慢,举个例子,在一个反应很快的电脑上(4核/8线程,奔腾i7处理器,固态硬盘),读取一个18GB的bag文件,将会耗费11.5分钟!

    time rostopic echo -b large_bag_file.bag /topic1
    

    如果使用ros_readbagfile脚本,在相同的电脑上同样读取18GB的bag文件,仅仅只需要1分钟37秒。因此,ros_readbagfile是rostopic的7倍快,11.5/(1+37/60) = ~7x

    time ros_readbagfile large_bag_file.bag /topic1
    
  2. 因为rostopic每次读取仅仅只能读取一个话题,然而,ros_readbagfile一次可以读取任意数量的话题

    ros_readbagfile .bag> [topic1] [topic2] [topic3] [...] [topic1000]
    

结束

下一个教程:

现在你已经学会了如何从一个已经提前录制好的bag文件中读取消息,下面让我们学习 roswtf入门。




初次翻译,可能有些地方准确度稍低,但是绝对保证90%以上正确率,其他的小错误也无关痛痒,以后也可能会尝试翻译其他ros wiki上的文章,我注意到即使是中文教程中,涉及到python编写消息发布器与订阅器,服务器和客户端这些教程,仍然是英文,因为很简单,所以就没有翻译,如果有需要,可以留言,我写博客进行翻译。

你可能感兴趣的:(ROS机器人学习,ros,wiki,ros,中文教程,ros,英文教程,教程翻译)