ROS1 rosbag の詳細な使用法、および Python を使用して Bag パッケージをマージする

ros を使用する場合、アルゴリズムの記録または再生に rosbag がよく使用されますが、これは非常に便利なツールです。

rosbagコマンドのリスト

注文 効果
記録 パッケージを記録してトピックを指定する
情報 パッケージの詳細を要約する
遊ぶ 1 つ以上のパッケージを再生し、トピックを指定できます
チェック パックが現在のシステムで再生可能かどうか、または移行できるかどうかを確認する
修理 現在のシステムで再生できるようにパッケージを修正します。
フィルター Python スクリプト経由でパッケージのコンテンツを変換する
圧縮する アーカイブ
解凍する パッケージを解凍します
インデックスを再作成する 1 つ以上の壊れたパッケージのインデックスを再作成する

記録コマンドは使用します

  • record <topic-names># 記録する 1 つ以上のトピックを指定します
$ rosbag record body_status gnss_imu
  • record -a, --all# すべてのトピックを記録する
$ rosbag record -a
  • record -e, --regex# 正規表現に一致するトピックを記録する
$ rosbag record -e "/(.*)_log/point"
  • rocord -p, -publish# (メロディック新機能) パッケージの録音を開始するときに、topic="begin_write" を発行します
$ rosbag record -p
  • record -x, --exclude# 記録時に正規表現に一致するトピックを除外する
$ rosbag record -e "/(.*)_log/point" -x "(.*)/point"
  • record -q, --quiet# 記録時に指定したトピックのログ出力を抑制します
$ rosbag record -q /body_status
  • record -d, --duration# トピックの記録の最大時間を指定します
$ 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# 指定された数のメッセージのみをトピックに記録します
$ 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># 1 つ以上のパッケージの詳細を表示する
$ rosbag info test.bag
  • info -y, --yaml# 1 つ以上のパッケージの詳細を yaml 形式で出力します
$ rosbag info -y test.bag
  • info -k, --key# 出力を yaml 形式で表示します。データはパッケージ内のキー値に対応します。
$ rosbag info -y -k topics test.bag

再生コマンドでは、

  • play <bag_name># 1 つ以上のパケットを再生する
$ rosbag play test.bag
  • play -p, --prefix# すべての出力トピックにプレフィックスを付けます
$ rosbag play -p test test.bag
  • play -q, --quiet# コンソール出力を抑制します
$ rosbag play -q test.bag
  • play -i, --immediate# Play パッケージは待機しません
$ rosbag play -i test.bag
  • play --pause# パッケージの再生を開始するときに一時停止します
$ rosbag play --pause test.bag
  • play --queue# パッケージを再生するときに設定されたキュー サイズで再生します。デフォルト値は 100 です
$ rosbag play --queue=1000 test.bag
  • play --clock# クロックトピックを自動的に公開する
$ rosbag play --clock test.bag
  • play --hz# 指定された Hz でクロック トピックをパブリッシュします
$ 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# バージョン番号が分からなくてもバッグを開けます
$ rosbag play --try-future-version test.bag
  • play --topics # 再生する対応するトピックを指定します
$ rosbag play test.bag --topics /topic1 /topic2
  • play --pause-topics# データ再生時、指定したトピックを一時停止します
$ rosbag play test.bag --topics /topic1 /topic2 --pause-topics
  • play --bags # 複数のバッグを指定して再生する
$ rosbag play --bags=test.bag 
  • play --wait-for-subscribers# 公開する前に、各トピックに少なくとも 1 人のサブスクライバーができるまで待ちます
  • play --rate-control-topic=# 指定されたトピックを視聴します。最後の投稿時間が <Rate Control Max Delay> を超えた場合は、再生を続行する前にそのトピックが再度投稿されるのを待ちます。
  • play --rate-control-max-delay=# 一時停止するまでの <レート制御トピック> との最大時間差

チェックコマンドは使用します

  • 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 <in-bag> <out-bag> <expression># 指定された Python 式を使用してデータ ファイルを変換します。
$ rosbag filter my.bag only-tf.bag "topic == '/tf'"

圧縮コマンドは次を使用します。

  • 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 <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)        


参照:

http://wiki.ros.org/rosbag/コマンドライン

おすすめ

転載: blog.csdn.net/xiaokai1999/article/details/130504577