ROS1 rosbag的详细使用,并且使用python来合并bag包

这篇具有很好参考价值的文章主要介绍了ROS1 rosbag的详细使用,并且使用python来合并bag包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在使用ros的时候经常会用到rosbag来录制或者回放算法,是个非常有用的工具。

rosbag 命令列表

命令 作用
record 录制一个包,并且指定topic
info 总结一个包的详细信息
play 回放一个或者多个包,并且可以指定topic
check 确定一个包是否可以在当前系统中播放,或者是否可以迁移
fix 修复一个包使得它能在当前系统中播放
filter 通过python脚本转换包内容
compress 压缩包
decompress 解压缩包
reindex 重新索引一个或者多个损坏的包

record 命令使用

  • record <topic-names> # 指定一个或者多个topic来录制
$ rosbag record body_status gnss_imu
  • record -a, --all # 录制所有topic
$ rosbag record -a
  • record -e, --regex # 录制使用正则表达式匹配的topic
$ rosbag record -e "/(.*)_log/point"
  • rocord -p, -publish # (Melodic 新特性)当开始录制包时,发布一个topic=”begin_write“
$ rosbag record -p
  • record -x, --exclude # 录制时排除正则表达式匹配的topic
$ rosbag record -e "/(.*)_log/point" -x "(.*)/point"
  • record -q, --quiet # 录制时抑制指定topic的log输出
$ rosbag record -q /body_status
  • record -d, --duration # 指定topic录制最大时常
$ rosbag record -d 30 /body_status
$ rosbag record -d 3m /body_status
$ rosbag record -d 3h /body_status
  • record -o, --output-prefix # 输出包名前加上前缀
$ rosbag record -o output /topic_name /topic_name2 
  • record -O, --output-name # 指定输出包名
$ rosbag record -O output.bag /topic_name /topic_name2 
  • record --split # 每隔设定的时常或者大小分割包录制
$ rosbag record --split --size=1024 /topic_name
$ rosbag record --split --duration=30 /topic_name
$ rosbag record --split --duration=5m /topic_name
$ rosbag record --split --duration=2h /topic_name
  • record --max-splits # (Kinetic 新特性)分割包的最大个数
$ rosbag record --split --max-splits 3 --duration=30 /topic_name
  • record -b, --buffsize # 使用内部缓冲区(默认值:256MB,无限为0)
$ rosbag record -b 1024 /topic_name
  • record --chunksize # 开辟缓冲区,比buffsize更为先进(默认值: 768KB,无限为0)
$ rosbag record --chunksize=1024 /topic_name
  • record -l, --limit # 在topic中只录制指定数量的消息
$ rosbag record -l 1000 /topic_name
  • record --node # 记录指定节点订阅的所有消息
$ rosbag record --node=/node
  • record -j, --bz2 # 设置录制以bz2格式压缩
$ rosbag record -j /topic_name
  • record --lz4 # 设置录制以lz4格式压缩
$ rosbag record --lz4 /topic_name
  • record --tcpnodelay # 订阅主题时使用TCP_NODELAY传输 参考资料
  • record --udp # 订阅主题时使用UDP传输

info 指令使用

  • info <bag-files> # 查看一个或者多个包的详细信息
$ rosbag info test.bag
  • info -y, --yaml # 以yaml格式输出一个或者多个包的详细信息
$ rosbag info -y test.bag
  • info -k, --key # 查看以yaml格式输出,包内key值对应的数据
$ rosbag info -y -k topics test.bag

play 指令使用

  • play <bag_name> # 播放一个或者多个数据包
$ rosbag play test.bag
  • play -p, --prefix # 为所有输出主题添加前缀
$ rosbag play -p test test.bag
  • play -q, --quiet # 抑制控制台输出
$ rosbag play -q test.bag
  • play -i, --immediate # 播放包不等待
$ rosbag play -i test.bag
  • play --pause # 开始播放包时暂停
$ rosbag play --pause test.bag
  • play --queue # 播放包时以设置的队列大小播放 默认值为100
$ rosbag play --queue=1000 test.bag
  • play --clock # 自动发布一个clocktopic
$ rosbag play --clock test.bag
  • play --hz # 以指定赫兹发布clock topic
$ rosbag play --hz=1 --clock test.bag
  • play -d, --delay # 指定延迟播放的时间
$ rosbag -d 5 test.bag
  • play -r, --rate # 指定播放速度
$ rosbag -r 10 test.bag
  • play -s, --start # 指定开始播放时间
$ rosbag play -s 5 test.bag 
  • play -u,--duration # 设定播放时间
$ rosbag play -u 240 test.bag
  • play --skip-empty # 设置跳过没有消息的数据的时间
$ rosbag play --skip-empty=1 test.bag 
  • play -l, --loop # 循环播放
$ rosbag play -l test.bag
  • play -k, --keep-alive # 播放时保持活跃状态
$ rosbag play -k test.bag
  • play --try-future-version # 即使不知道版本号也可以打开bag
$ rosbag play --try-future-version test.bag
  • play --topics # 指定对应topics进行播放
$ rosbag play test.bag --topics /topic1 /topic2
  • play --pause-topics # 当回放数据时,暂停指定topics
$ rosbag play test.bag --topics /topic1 /topic2 --pause-topics
  • play --bags # 指定多个bags进行回放
$ rosbag play --bags=test.bag 
  • play --wait-for-subscribers # 再发布之前,等待每个主题至少有一个订阅者
  • play --rate-control-topic= # 观看给定的主题,如果上一次发布时间超过了<速率控制最大延迟>,请等待该主题再次发布后再继续播放
  • play --rate-control-max-delay= # 暂停前与<速率控制主题>的最大时间差

check 指令使用

  • check <file> # 确定一个包在当前系统中是否可以播放。
$ rosbag check test.bag
  • check -g, --genrules # 生成一个名为RULEFILE的迁移规则文件
$ rosbag check -g diagnostics.bmr test.bag
  • check -a, --append # 加载后附加到现有数据迁移规则文件的末尾。
$ rosbag check -a -g diagnostics.bmr test.bag
  • check -n, --noplugins # 不加载规则文件
$ rosbag check -n test.bag

fix 指令使用

  • fix <in-bag> <out-bag> [rules.bmr] # 使用规则文件修复数据包
$ rosbag fix old.bag repaired.bag myrules.bmr
  • fix -n, --noplugins # 修复数据包不带规则文件
$ rosbag fix -n old.bag repaired.bag

filter 指令使用

  • filter <in-bag> <out-bag> <expression> # 使用给定的Python表达式转换数据文件。
$ rosbag filter my.bag only-tf.bag "topic == '/tf'"

compress 指令使用

  • compress <bag-files> # 使用BZ2格式压缩包
$ rosbag compress *.bag
  • compress --output-dir=DIR # 指定路径输出文件
$ rosbag compress *.bag --output-dir=compressed
  • compress -f, --force # 如果已经存在包,则强制覆盖
$ rosbag compress -f *.bag
  • compress -q, --quiet # 抑制非关键信息
$ rosbag compress -q *.bag
  • compress -j, --bz2 # 使用bz2格式压缩包
$ rosbag compress -j *.bag
  • compress --lz4 # 使用lz4格式压缩包
$ rosbag compress --lz4 *.bag

decompress 指令使用

  • decompress <bag-files> # 解压缩包
$ rosbag decompress *.bag
  • decompress --output-dir=DIR # 指定解压缩的路径
$ rosbag decompress --output-dir=uncompressed *.bag
  • decompress -f, --force # 如果已经存在包,则强制覆盖
$ rosbag decompress -f *.bag
  • decompress -q, --quiet # 抑制非关键信息
$ rosbag decompress -q *.bag

reindex 指令使用

  • reindex <bag-files> # 修复坏包
$ rosbag reindex *.bag
  • reindex --output-dir=DIR # 指定路径
$ rosbag reindex --output-dir=reindexed *.bag
  • reindex -f, --force # 如果已经存在包,则强制覆盖
$ rosbag reindex -f *.bag
  • reindex -q, --quiet # 抑制非关键信息
$ rosbag reindex -q *.bag

2. 使用Python合并包代码

#! /usr/bin/env python3
import os
import time
import argparse
from rosbag import Bag, Compression

def parse_compression(compression):
    if compression == "none" or compression == "NONE":
        compression = Compression.NONE
    elif compression == "bz2":
        compression = Compression.BZ2
    elif compression == "lz4":
        compression = Compression.LZ4
    return compression

def get_files_list(arg_input, arg_select):
    files = None
    if " " in arg_input:
        files = arg_input.split(" ")
    elif "," in arg_input:
        files = arg_input.split(",")
    elif os.path.exists(args.input) or "*" in args.input:
        rfind_index = arg_input.rfind("/")
        dir_path = arg_input[:rfind_index]
        files = os.listdir(dir_path)
        files.sort() # 名称排序
        files = [dir_path + "/" + file for file in files]
    
    if arg_select:
        files = select_bags(files)
    
    print("bags list:")
    for i in range(len(files)):
        print(str(i) + "." + files[i])

    return files

def select_bags(files):
    for i in range(len(files)):
        print(str(i) + "." + files[i])
    print("Please input bag numbers to merge. split by , or space", end=":")
    s_b = input()
    s_b_list = []
    if "," in s_b:
        s_b_list = s_b.split(",")
    elif " " in s_b:
        s_b_list = s_b.split(" ")
    files = [files[int(x)] for x in s_b_list]
    return files


def show_process_bar(total, i, start):
    a = "*" * i
    b = "." * (total - i)
    c = (i / total) * 100
    dur = time.perf_counter() - start
    print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur), end="")

def merge_bags(args):
    print("start merge bags.")
    compression = parse_compression(args.compression)
    print(f"bag's compression mode is {compression}.")
    files = get_files_list(args.input, args.select)
    with Bag(args.output, "w",  compression=compression) as o:
        start = time.perf_counter()
        for i in range(len(files)):
            show_process_bar(len(files), i+1, start)
            with Bag(files[i], "r") as ib:
                for topic, msg, t in ib:
                    o.write(topic, msg, t)
            show_process_bar(len(files), i+1, start)
            

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Merge one or more bag files to one file.")
    parser.add_argument("-o", "--output", help="Output bag's file path.",
                        default="output.bag", required=True)

    parser.add_argument("-i", "--input", help="Input files bags name or path, split by , .",
                        required=True)
    
    parser.add_argument("-c", "--compression", help="Compress the bag by bz2 or lz4",
                        default="lz4", choices=["none", "lz4", "bz2"])
    
    parser.add_argument("-s", "--select", help="Select bags to merge.",
                        default=False)

    parser.add_argument("-v", "--verbose", help="Show the verbose msg.")

    args = parser.parse_args()
    merge_bags(args)        


Reference:

http://wiki.ros.org/rosbag/Commandline文章来源地址https://www.toymoban.com/news/detail-829901.html

到了这里,关于ROS1 rosbag的详细使用,并且使用python来合并bag包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 树莓派4B +Ubuntu20.04+ROS1的使用(2)

    在这次实验中,主机是一台Ubuntu20.04.03系统的台式机,我们间通过这台准备来远程遥控树莓派上的ros1系统,它的ip地址是192.168.230.181 从机是一台搭载Ubuntu20.04桌面版+ros1的树莓派4B的只智能小车,它的ip地址是192.168.230.37(搭载方式见树莓派4B+ubuntu20.04+ros1桌面配置(一)-CSDN博客

    2024年01月15日
    浏览(49)
  • 树莓派安装Ubuntu18.04+ROS1详细教程(解决start4.elf: is not compatible报错)

    树莓派三代是32位系统的,四代是64位系统的,所以我们安装镜像时要看清楚是树莓派几代的,多少位系统的。 树莓派4B是64位系统 ,我所使用的是树莓派4B,这里安装Ubuntu18.04. 好像Ubuntu16.04太早就不维护更新了,就没有64位系统了。 提一句: 虚拟机下载的是后缀为.iso的镜像

    2024年02月04日
    浏览(82)
  • ROS学习笔记(五):rosbag与读取图片与点云数据

    录制所有话题: 录制指定话题,设置 bag 包名: 以暂停的方式启动,防止跑掉数据 设置以 0.5 倍速回放,也就是以录制频率的一半回放 如果录制的 bag 很大,我们可以压缩它,默认的压缩格式是 bz2: 你也可以添加 -j 手动指定压缩格式为 bz2: 也可以使用 LZ4 来压缩数据:

    2024年02月13日
    浏览(79)
  • ROS笔记(5)——Bag包概述与解析

    目录 ROS Bag概念与使用场景 ROS Bag文件生成的两种方式 ROS Bag文件的解析 (C++实现) 1、rosbag::View 2、完整C++代码示例 ROS Bag文件的解析 (Python实现) C++与Python 解析ROS Bag文件两种方式的对比 ROS Bag是一种文件格式,用于存储ROS系统中的消息。ROS Bag可以将ROS节点发布的消息记录

    2024年02月16日
    浏览(38)
  • 【ROS2指南-9】Bag的record和play操作

    目标: 记录在某个话题上发布的数据,以便您可以随时回放和检查它。 教程级别: 初学者 时间: 10分钟 内容 背景 先决条件 任务 1 设置 2 选择一个主题 3 ros2包记录 4 ros2 包信息 5 ros2包玩 概括 下一步 相关内容 ros2 bag 是一个命令行工具,用于记录系统中主题发布的数据。它

    2024年02月08日
    浏览(39)
  • 【ROS知识】比较ROS1和ROS2在处理launch的不同

            在处理launch过程中,ROS1和ROS2还是有些差别的,因为文件结构不同,不能直接搬用。这里将两者建立过程做一个比对,以提升概念的清晰度。         在ROS2中,单独的launch文件是一个python文件,因此脱离ros2环境也能启动,问题是,如果launch文件添加到ros2的包内,如

    2024年02月09日
    浏览(45)
  • ROS2系列(03):ROS1和ROS2的区别【01/2】

    目录 1 提要 2 从架构上说  2.1 通信协议不同 2.2 架构不同 2.3 ROS2多了一个rcl

    2024年02月06日
    浏览(46)
  • 从ROS1到ROS2无人机编程实战指南

    亲爱的读者们,我今天非常荣幸地向大家推荐一本本人的全新力作——《从ROS1到ROS2无人机编程实战指南》。这本书站在初学者的角度,从入门到进阶,再到实战,循序渐进,是学习ROS1和ROS2的最佳选择。如今已在全国范围内上市,购书即可享受次日达的快捷服务! 本书的创

    2024年02月10日
    浏览(46)
  • Ubuntu20.04同时安装ROS1和ROS2

    每版的Ubuntu系统版本都有与之对应ROS版本的,每一版ROS都有其对应版本的Ubuntu版本,不可随便装,ubuntu20.04对应ROS1 noetic和ROS2 foxy版本。_ros1和ros2共存 文章目录 Ubuntu20.04同时安装ROS1和ROS2共存 一、换源 1.1 通过软件更新 1.2 通过修改源文件(建议) 二、安装ROS1(noetic) 三、安

    2024年02月09日
    浏览(66)
  • Ubuntu20.04同时安装ROS1和ROS2共存

    每版的Ubuntu系统版本都有与之对应ROS版本的,每一版ROS都有其对应版本的Ubuntu版本,不可随便装,ubuntu20.04对应ROS1 noetic和ROS2 foxy ROS2 Galactic版本。当然最方便的是使用鱼香ROS一键安装: 但我们接下来使用手动安装。 老规矩,先换源 打开软件更新 选择Download from-Other,找到C

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包