• 15-bag的录制,回放与解析


    本教程教你如何使用rosbag record工具来录制ros通信数据。之后在通过rosbag play形式回放录制的数据包
    此教程不详细解读,仅将rosbag record对应的help文档列出,并给出具体录制例子

    rosbag

    bag包是存储ROS消息数据的文件格式,rosbag命令可以录制,回放,操作bag包。
    rosbag用法是
    rosbag [子命令] [选项] [参数]

    • check:判断一个bag包在当前系统中是否可用,或者是否可迁移
    • compress:压缩一个或多个bag文件
    • decompress:解压bag包
    • decrypt:解密bag包
    • encrypt:解密bag包
    • filter:过滤bag包中的内容
    • fix:修复bagz中的消息,让此bag包在当前系统可用
    • info:显示bag的内容的总结性信息
    • play:以时间同步的方式回放一个或多个bag中的内容
    • record:将指定的topic录制为一个bag进行存储
    • reindex:对一个bag包重建索引。

    rosbag更信息的文档可参考

    rosbag record

    rosbga record用于录制指定topic的数据为一个bag包进行存储。
    用法是:rosbag record TOPIC1 [TOPIC2 TOPIC3 …]
    可用选项有:

    • -a,–all:录制此系统中的所有topic的数据
    • -e,–regex:录制与对应正则表达式相匹配的topic的数据
    • -p,–publish:在开始录制的时候publish一个消息
    • -x EXCLUDE_REGEX,–exclude=EXCLUDE_REGEX:与对应正则表达式相匹配的topic的数据不录制
    • -q,–quiet:隐藏控制台输出
    • -o PREFIX,–output-prefix=PREFIX:设置录制数据包的包名前缀,注意包名始终带有时间戳
    • -O Name,–output-name=name:录制一个名为Name.bag的包
    • –split:当包的大小达到maximum或者录制时间到达duration时进行分包
    • –max-splits=MAX_SPLITS:保持最多N包数据,当达到MAX_SPLITS时会删除最老的数据以保持数据包的个数稳定
    • –size=SIZE:录制数据包的最大大小是SIZE MB,默认是无限大小
    • -d,–duration=DURATION:确定录制数据包的最长时长duration.默认单位是s,除非DURATION以m或者h结尾表示分钟和小时
    • -b SIZE,–buffersize=SIZE:使用SIZE MB的内部缓存,默认是256MB,设置0表示无限使用内部缓存
    • –chunksize=SIZE:高级选项:记录大小为SIZE KB的块,默认是768
    • -l NUM,–limit=NUM:在每个topic上只录制NUM个数据包
    • –node=NODE:录制特定节点订阅的所有topic数据
    • -j,–bz2:使用BZ2压缩算法进行数据压缩
    • –lz4:使用LZ4压缩算法进行数据压缩
    • –tcpnodelay:订阅topic时使用TCP_NODELAY传输提示
    • –udp:订阅topic时使用UDP传输提示
    • –repeat-latched:在每个数据包的开始重复所存的msg

    示例

    rosbag record -a -d=120s --split --max-splits=100
    以每个bag录制120s的数据,录制系统内所有topic的数据,最多保存100个bag 包

    rosbag play

    以时间同步的方式回放数据包的内容。
    用法:rosbag play BAGFILE1 [BAGFILE2 BAGFILE3 …]
    可用选项

    • -p,PREFIX,–prefix=PREFIX:为所有输出的topic增加前缀PREFIX
    • -q,–quiet:抑制终端输出打印
    • -i,–immediate:无延时的回放所有数据
    • –pause:在暂停模式开始回放
    • –queue=SIZE:使用大小为SIZE的输出队列,默认是100
    • –clock:publish时钟时间
    • –hz=HZ:当发布时钟时间时以HZ的频率进行发布,默认是100
    • -d SEC,–delay=SEC:休眠SEC秒后,再进行广播
    • -r FACTOR --rate=FACTOR:将数据包的发布频率乘以FACTOR系数
    • -s SEC,–start=SEC:启动后SEC s后开始读取文件包
    • -u SEC,–duration=SEC:仅仅回放bag文件的SEC秒数据
    • –skip-empty=SEC:跳过包中没有消息超过SEC秒的区域
    • -l,–loop:循环回放
    • -k,–keep-alive:keep alive past end of bag (useful for publishing latched topics)
    • –try-future-version:即使bag的版本无法获取,也尝试打开bag包
    • –topics:仅回放对应topic的数据
    • –pause-topics:在播放过程中需要暂停的topic
    • –bags=BAGS:待回放的bag列表
    • –wait-for-subscribers:在回放数据发布前,每个主题至少有一个订阅者
    • –rate-control-topic=RATE_CONTROL_TOPIC:观察给定的topic,如果上次发布的数据内容大于,则等到topic下次发布时才继续播放
    • –rate-control-max-delay=RATE_CONTROL_MAX_DELAY:暂停前的最大时间差

    示例:rosbag play xx.bag

    rosbag decompress

    用法:rosbag decompress [选项] BAGFILE1 [BAGFILE2 BAGFILE3 …]

    • –output-dir=DIR:将解压后的数据输出到DIR目录
    • -f,–force:如果解压文件已经存在,直接覆盖写入
      本教程主要介绍如何解析一个录制好的bag包

    下面这部分主要是bag包的解析。

    bag包生成

    运行小乌龟例程,自行录制一个bag包。

    rosbag record -a --duration=60s -o turtele
    
    # 可以看到生成一个前缀是turtele的bag包
    ls
    turtele_2022-09-09-16-36-49.bag
    

    需要注意的是,在进行下面的示例时,可以使用time命令来简单监控下各个命令的运行时间。如果你不希望获取各个命令的运行时间
    ,下面的示例命令中你把开头的time去掉即可。

    回放数据,并在多个终端中查看输出

    你需要知道要从bag包中读取的消息的具体的topic。可以使用rosbag info 获取bag中的所录制的topic,以及各个topic上录制了多少条数据。

    time rosbag info turtele_2022-09-09-16-36-49.bag 
    path:        turtele_2022-09-09-16-36-49.bag
    version:     2.0
    duration:    23.5s
    start:       Sep 09 2022 16:36:49.84 (1662712609.84)
    end:         Sep 09 2022 16:37:13.35 (1662712633.35)
    size:        234.2 KB
    messages:    3139
    compression: none [1/1 chunks]
    types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
                 rosgraph_msgs/Log   [acffd30cd6b6de30f120938c17c593fb]
                 turtlesim/Color     [353891e354491c51aabe32df673fb446]
                 turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
    topics:      /rosout                    4 msgs    : rosgraph_msgs/Log   (2 connections)
                 /turtle1/cmd_vel         225 msgs    : geometry_msgs/Twist
                 /turtle1/color_sensor   1455 msgs    : turtlesim/Color    
                 /turtle1/pose           1455 msgs    : turtlesim/Pose
    
    real	0m0.507s
    user	0m0.283s
    sys	0m0.126s
    

    从上面的rosbag info的结果可以看出,在/turtle1/cmd_vel 上有225条消息。
    下面我们开始提取这部分数据。

    • 在终端1我们启动ros master节点
    # 终端1
    reocore
    
    • 打开另外一个终端。在此终端订阅/turtle1/cmd_vel 消息,并打印此topic上的所有输出。同时将这些数据存储到yaml文件中
    # 终端2
    rostopic  echo /turtle1/cmd_vel | tee cmd_vel.yaml
    
    • 打开另外一个终端回放刚才录制的数据包。可以使用–immediate选项尽快的开始数据回放。此处我们仅仅回放./turtle1/cmd_vel的数据
    # 终端3 
    time rosbag play --immediate turtele_2022-09-09-16-36-49.bag  --topics /turtle1/cmd_vel
    [ INFO] [1662714541.935355856]: Opening turtele_2022-09-09-16-36-49.bag
    
    Waiting 0.2 seconds after advertising topics... done.
    
    Hit space to toggle paused, or 's' to step.
     [RUNNING]  Bag Time: 1662712628.852830   Duration: 16.519400 / 16.519400               
    Done.
    
    real	0m1.021s
    user	0m0.319s
    sys	0m0.165s
    
    • 现在我们可以在终端2看到/turtle1/cmd_vel主题消息的打印。同时也可以从cmd_vel.yaml中找到此topic的具体数据。部分数据如下
     head  cmd_vel.yaml 
    linear: 
      x: 0.0
      y: 0.0
      z: 0.0
    angular: 
      x: 0.0
      y: 0.0
      z: -2.0
    ---
    linear: 
    
  • 相关阅读:
    过去式-ed的发音规则
    强化学习 | Python强化学习
    分享一下怎么做一个房间预定链接
    @Transactional 注解使用详解
    CSS border边框(理解网页边框制作)
    Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系
    YOLO目标检测——烟叶病害检测数据集下载分享【含对应voc、coco和yolo三种格式标签】
    深度学习——循环神经网络
    PDF转换工具哪个好?值得推荐的3款PDF转换软件
    Openresty人机验证流程
  • 原文地址:https://blog.csdn.net/no_pao_spite/article/details/127098506