【ROS2】高级:从节点记录一个包(Python)

目标:从您自己的 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值