目标:从您自己的 Python 节点记录数据到一个包。
教程级别:高级
时间:20 分钟
目录
背景
先决条件
任务
1. 创建一个包
2. 编写 Python 节点
3. 建立并运行
4. 从节点记录合成数据
5. 从可执行文件记录合成数据
摘要
背景
rosbag2
不仅提供 ros2 bag
命令行工具。它还提供了一个 Python API,用于从您自己的源代码中读取和写入 bag。这使您可以订阅一个主题,并在对该数据执行任何其他处理的同时,将接收到的数据保存到 bag 中。例如,您可以这样做,以保存来自一个主题的数据和处理该数据的结果,而无需通过一个主题发送处理后的数据来记录它。由于任何数据都可以记录在 bag 中,因此也可以保存由其他来源生成的数据,而不是主题,例如用于训练集的合成数据。这很有用,例如,可以快速生成一个包含大量样本的 bag,这些样本分布在较长的回放时间内。
先决条件
您应该在常规的 ROS 2 设置中安装 rosbag2
软件包。
如果您已经从 Linux 上的 Debian 软件包安装,它可能会默认安装。如果没有,您可以使用此命令安装它。
sudo apt install ros-jazzy-rosbag2
本教程讨论了如何使用 ROS 2 包,包括从终端使用。您应该已经完成了基本的 ROS 2 包教程。
任务
1. 创建一个包
打开一个新的终端并且初始化您的 ROS 2 安装,这样 ros2
命令就会生效。
按照这些指示创建一个名为 ros2_ws
的新工作区。
导航到 ros2_ws/src
目录并创建一个新包:
ros2 pkg create --build-type ament_python --license Apache-2.0 bag_recorder_nodes_py --dependencies rclpy rosbag2_py example_interfaces std_msgs
您的终端将返回一条消息,验证您的包 bag_recorder_nodes_py
及其所有必要的文件和文件夹的创建。 --dependencies
参数将自动添加必要的依赖行到 package.xml
。在这种情况下,该包将使用 rosbag2_py
包以及 rclpy
包。消息定义还需要依赖 example_interfaces
包。
1.1 更新 package.xml
和 setup.py
因为您在创建包时使用了 --dependencies
选项,您无需手动将依赖项添加到 package.xml
中。但是,一如既往,请确保将描述、维护者电子邮件和姓名以及许可信息添加到 package.xml
中。
<description>Python bag writing tutorial</description>
<maintainer email="cxy@126.com">cxy</maintainer>
<license>Apache-2.0</license>
还请确保将此信息添加到 setup.py
文件中。
maintainer='cxy',
maintainer_email='cxy@126.com',
description='Python bag writing tutorial',
license='Apache-2.0',
2. 编写 Python 节点
在 ros2_ws/src/bag_recorder_nodes_py/bag_recorder_nodes_py
目录中,创建一个名为 simple_bag_recorder.py
的新文件,并将以下代码粘贴到其中。
import rclpy # 导入 rclpy 库
from rclpy.node import Node # 从 rclpy.node 模块中导入 Node 类
from rclpy.serialization import serialize_message # 从 rclpy.serialization 模块中导入 serialize_message 函数
from std_msgs.msg import String # 从 std_msgs.msg 模块中导入 String 消息类型
import rosbag2_py # 导入 rosbag2_py 库
class SimpleBagRecorder(Node): # 定义 SimpleBagRecorder 类,继承自 Node
def __init__(self): # 初始化方法
super().__init__('simple_bag_recorder') # 调用父类的初始化方法,节点名称为 'simple_bag_recorder'
self.writer = rosbag2_py.SequentialWriter() # 创建一个 SequentialWriter 对象
storage_options = rosbag2_py._storage.StorageOptions(
uri='my_bag', # 设置存储选项的 URI 为 'my_bag'
storage_id='mcap') # 设置存储 ID 为 'mcap'
converter_options = rosbag2_py._storage.ConverterOptions('', '') # 创建转换选项对象
self.writer.open(storage_options, converter_options) # 打开 writer
topic_info = rosbag2_py._storage.TopicMetadata(
id=0, # 主题 ID