使用 rosbags 工具将 ROS 2 的数据转换为 ROS 1 的数据

1. 背景介绍

在 ROS (Robot Operating System) 生态系统中,ROS 1(.bag)和 ROS 2 (.deb3 && .yaml)使用不同的数据格式存储 bag 文件。当我们需要在 ROS 1 环境中使用 ROS 2 录制的数据时,就需要进行格式转换。rosbags 是一个强大的 Python 库,可以方便地在 ROS 1 和 ROS 2 的 bag 文件格式之间进行转换。

2. 安装 rosbags

首先需要安装 rosbags 工具:

pip3 install rosbags

如果出现下载缓慢,可以指定下载源,例如:

pip3 install rosbags -i https://pypi.tuna.tsinghua.edu.cn/simple

3. 基本转换命令

最简单的转换命令格式如下:

rosbags-convert <源文件路径> --dst <目标文件路径>

示例

# 将 ROS 2 的 bag 转换为 ROS 1 格式
rosbags-convert ros2_bag --dst ros1_bag.bag

4. 高级用法

4.1 选择特定 topic 转换

如果只需要转换部分 topic,可以使用 --include-topic 参数:
(注意1: --include-topic 只能指定 一个 topic,你需要多次使用该参数)
(注意2: ros1的文件名为 .bag,ros2则是包含了 .deb3和 .yaml的一个文件夹 )
(注意3: 在数据的路径下使用,不在则需要补全路径 )

rosbags-convert ros2_file/ \
    --dst ros1.bag \
    --include-topic /unwanted_topic1 \
    --include-topic /unwanted_topic2

4.2 排除某些 topic

使用 --exclude-topic 可以排除不需要的 topic:
(注意: --exclude-topic 只能指定 一个 topic,你需要 多次使用该参数)

rosbags-convert ros1.bag \
    --dst ros2_file \
    --exclude-topic /unwanted_topic1 \
    --exclude-topic /unwanted_topic2

5. 自动化脚本

为了方便批量转换,可以创建一个 Bash 脚本:

#!/bin/bash

# 检查输入参数
if [ -z "$1" ]; then
    echo "Usage: $0 <ros2_bag_directory>"
    exit 1
fi

# 获取输入路径和输出文件名
INPUT_DIR="$1"
OUTPUT_FILE="$(basename "$INPUT_DIR").bag"

# 检查输出文件是否已存在
if [ -f "$OUTPUT_FILE" ]; then
    echo "Warning: $OUTPUT_FILE already exists. Overwriting..."
    rm -f "$OUTPUT_FILE"
fi

# 执行转换
echo "Converting $INPUT_DIR to $OUTPUT_FILE..."
rosbags-convert "$INPUT_DIR" --dst "$OUTPUT_FILE"

# 检查转换结果
if [ -f "$OUTPUT_FILE" ]; then
    echo "Conversion successful!"
else
    echo "Conversion failed!"
    exit 1
fi

保存为 convert_ros2_to_ros1.sh 并赋予执行权限:

chmod +x convert_ros2_to_ros1.sh

使用示例:

./convert_ros2_to_ros1.sh /path/to/ros2_bag

6. 常见问题解决

6.1 目标文件已存在错误

rosbags-convert: error: argument --dst: ros1.bag should not exist.

解决方案:删除已存在的目标文件或指定新的文件名。

6.2 不支持的消息类型

如果遇到不支持的 ROS 2 消息类型,需要先安装对应的 ROS 1 消息包。

6.3 时间同步问题

转换后的时间戳可能会有微小差异,建议检查关键 topic 的时间同步情况。

7. 总结

通过 rosbags 工具,我们可以轻松实现 ROS 2 和 ROS 1 数据格式之间的转换。本文介绍了基本使用方法、高级选项、自动化脚本以及常见问题解决方案,希望能帮助你在不同 ROS 版本间顺利迁移数据。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐