ros2 bag 详解

一.命令行详解

ros2 bag 是一个命令行工具,用于记录系统中发布的主题数据。它积累传递给任意数量主题的数据,并将其保存在数据库中。然后可以重放数据以再现测试和实验的结果。记录主题也是分享你的工作并让别人重新创造它的好方法。

1.ros2 bag record

ros2 bag record <topic_name>

在对选定的主题运行此命令之前,打开一个新的终端并移动到前面创建的 bag_files 目录中,因为 rosbag 文件将保存在运行它的目录中。

ros2 bag record /turtle1/cmd_vel

您将在终端中看到以下消息(日期和时间将会不同):

[INFO] [rosbag2_storage]: Opened database 'rosbag2_2019_10_11-05_18_45'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...

记录多个主题

ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose

-o 选项允许您为您的包文件选择一个唯一的名称。下面的字符串(在本例中是 subset)是文件名。

要一次记录多个主题,只需用空格分开列出每个主题。

您将看到以下消息,确认正在记录这两个主题。

[INFO] [rosbag2_storage]: Opened database 'subset'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/pose'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...

您可以向命令添加另一个选项 -a,它记录系统上的所有主题。

ros2 bag info <bag_file_name>

ros2 bag info subsetFiles:             subset.db3
Bag size:          228.5 KiB
Storage id:        sqlite3
Duration:          48.47s
Start:             Oct 11 2019 06:09:09.12 (1570799349.12)
End                Oct 11 2019 06:09:57.60 (1570799397.60)
Messages:          3013
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 9 | Serialization Format: cdrTopic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 3004 | Serialization Format: cdr

2. ros2 bag play

ros2 bag play subset

终端将返回消息:

[INFO] [rosbag2_storage]: Opened database 'subset'.

 播放选项

1 倍速播放 -r

-r选项可以修改播放速率,比如 -r 值,比如 -r 10,就是10倍速,十倍速播放话题

ros2 bag play rosbag2_2021_10_03-15_31_41_0.db3 -r 10

2 -l 循环播放

单曲循环就是它了

3 播放单个话题

ros2 bag play rosbag2_2021_10_03-15_31_41_0.db3 --topics /sexy_girl

二.源码分析

rosbag2_transport

recorder.cpp

Recorder::Recorder()

Recorder::record()

Writer::open()

get_requested_or_available_topics()

subscribe_topics()

create_topic()

create_subscription() -->创建订阅者订阅消息

  1. 创建订阅者:auto subscription = this->create_generic_subscription(topic_name, topic_type, qos, [capture list](callback function)) 这一行代码通过调用Recorder对象的create_generic_subscription方法创建了一个订阅者实例。这个方法需要传递话题名称、类型、QoS策略以及一个回调函数。

  2. 回调函数:当话题有新消息到达时,这个匿名lambda表达式就会被调用。在这个函数体内,首先创建了一个rosbag2_storage::SerializedBagMessage类型的共享指针bag_message,用于存储即将被写入到rosbag文件中的数据。

  3. 消息处理:接下来,代码将接收到的消息(message)转换成rosbag2_storage::SerializedBagMessage格式,并设置了消息的时间戳和主题名。这里需要注意的是,*bag_message->serialized_data = message->release_rcl_serialized_message();这行代码实际上把message的所有权转移到了bag_message中,并且使用自定义的删除器来确保资源被正确释放。

  4. 写入rosbag:如果bag_message->time_stamp大于0(通常表示消息具有有效的时间戳),那么它会被写入到由writer_成员变量指定的rosbag文件中。

起两个异步线程:

Recorder::topics_discovery() 不断服务发现然后去订阅topic

Recorder::write_metadata() 这个函数会在rosbag记录开始之前或结束之后被调用,以确保元数据准确地反映了rosbag文件的状态。这个函数可能涉及到创建一个包含上述信息的结构体或字典,并将其序列化后写入rosbag文件的一个特定部分。这样做使得rosbag文件不仅包含了实际的消息数据,还有足够的上下文信息供其他工具或程序理解和使用这些数据。

古月居 - ROS机器人知识分享社区

序列化和反序列化是编程领域中常见的概念,它们主要用于处理数据的存储和传输。下面是对这两个概念的基本解释及其主要区别的概述。

**序列化**(Serialization)是指将数据结构或对象状态转换为可以存储或传输的一系列字节流的过程。序列化的主要用途有:
- 存储对象的状态,以便以后恢复。
- 通过网络传输对象,实现远程过程调用(RPC)。
- 将对象的状态保存到数据库中。

**反序列化**(Deserialization)则是序列化的逆过程,即将序列化后的字节流还原成原来的数据结构或对象状态。反序列化通常用于:
- 从磁盘读取序列化的对象状态,并恢复为内存中的对象。
- 接收通过网络传来的序列化对象,并将其转换回对象形式。
- 从数据库读取序列化的对象状态,并重建对象。

两者之间的主要区别在于操作的方向性和目的:
- 序列化是从复杂的数据结构转换为简单的字节流。
- 反序列化是从简单的字节流恢复为复杂的数据结构。

在实际应用中,序列化和反序列化经常一起使用,以确保数据能够在不同的系统之间正确地传递并且能够准确地恢复其原始状态。不同的编程语言和框架提供了多种序列化协议,例如JSON、XML、Protocol Buffers等,每种协议都有其特点和适用场景。

player.cpp

初始化play node

在循环中读取每条消息并反序列化

void Player::play_messages_from_queue()

{

playing_messages_from_queue_ = true;

// Note: We need to use message_queue_.peek() instead of message_queue_.try_dequeue(message)

// to support play_next() API logic.

rosbag2_storage::SerializedBagMessageSharedPtr * message_ptr = peek_next_message_from_queue();

while (message_ptr != nullptr && rclcpp::ok()) {

{

rosbag2_storage::SerializedBagMessageSharedPtr message = *message_ptr;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter中对于有中文内容的csv文件怎么保存

jmeter的功能很强大&#xff0c;但是细节处没把握好就得不到预期的结果。今天来讲讲有中文内容的csv文件的参数化使用中需要注意的事项。 对于有中文内容&#xff0c;涉及到编码格式&#xff0c;为了让jmeter能正确地读取csv文件中的中文&#xff0c;需要把文件转码为UTF-8BOM…

OPENSSL-2023/11/10学习记录-C/C++对称分组加密DES

对称分组加密常用算法&#xff1a; DES 3DES AES 国密SM4 对称分组加密应用场景&#xff1a; 文件或者视频加密 加密比特币私钥 消息或者配置项加密 SSL通信加密 对称分组加密 使用异或实现一个简易的对称加密算法 A明文 B秘钥 AB密文AB (AB)B A 密码补全和初始化 数…

数据操作学习

1.导入torch。虽然被称为PyTorch&#xff0c;但应导入torch而不是pytorch import torch 2.张量表示一个数值组成的数组&#xff0c;这个数组可能有多个维度 xtorch.arange(12)x 3.通过张量的shape属性来访问张量的形状和张量中元素的总数 x.shape x.numel() 4.要改变张量的形…

LangGraph - Hierarchical Agent Teams

本文翻译整理自 Hierarchical Agent Teams https://langchain-ai.github.io/langgraph/tutorials/multi_agent/hierarchical_agent_teams/ 文章目录 一、前言二、设置三、创建工具四、Helper Utilities五、定义代理 Team研究 Team文档写作Team 六、添加图层 一、前言 在前面的…

【高阶数据结构】揭开红黑树‘恶魔’的面具:深度解析底层逻辑

高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01;二叉搜索树AVL树 大家好&#xff0c;我是店小二&#xff0c;欢迎来到本篇内容&#xff01;今天我们将一起探索红黑树的工作原理及部分功能实现。红黑树的概念相对抽象&#xff0c;但只要我们一步步深入…

Java使用HttpClient5实现发送HTTP请求

1、HttpClient5 的介绍 HttpClient5 是 Apache HttpComponents 项目中的一个重要组件&#xff0c;它是一个功能齐全且高度可定制的 HTTP 客户端库&#xff0c;专门用于发送 HTTP 请求、处理 HTTP 响应并支持各种 HTTP 协议特性。 以下是对 HttpClient5 的详细介绍&#xff1a…

部署Qwen2.5-7b大模型详解

部署Qwen2.5-7b大模型详解 本文参考教程&#xff1a;https://qwen.readthedocs.io/en/latest/getting_started/quickstart.html 下载模型 https://modelscope.cn/organization/qwen 搜索 qwen2.5-7b 可以看到它提供了六个模型&#xff0c;以满足不同的需求&#xff0c;从下…

【RoadRunner】自动驾驶模拟3D场景构建 | 软件简介与视角控制

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…

【MATLAB代码,带TDOA数据导入】TDOA三维空间的位置(1主锚点、3副锚点),多个时间点、输出位置的坐标

TDOA介绍 TDOA&#xff08;到达时间差&#xff09;是一种用于定位和跟踪信号源的技术&#xff0c;常用于无线通信、导航和雷达系统。它通过测量信号到达不同接收器的时间差&#xff0c;来计算信号源的位置。 基本原理 TDOA的基本原理是利用多个接收器&#xff08;或锚点&…

Power BI - 设置Waterfall Chart第一个Pillar的颜色

1.简单介绍 有的用户可能会单独设置Column Chart&#xff08;条形图&#xff09;的第一个柱子的颜色&#xff0c;如下图所示&#xff0c; 这种其实可以通过Column Chart的Conditional formating进行设置&#xff0c; - SWICH SELECTEDVALUE 或者也可以直接对单独的Column进行…

用户界面设计:视觉美学与交互逻辑的融合

1、什么是用户界面 用户界面&#xff08;UI&#xff09;是人与机器之间沟通的桥梁&#xff0c;同时也是用户体验&#xff08;UX&#xff09;的重要组成部分。用户界面设计包括两个核心要素&#xff1a;视觉设计&#xff08;即产品的外观和感觉&#xff09;和交互设计&#xff…

CSS 入门

1. CSS 1.1 概念 CSS&#xff08;Cascading Style Sheet&#xff09;&#xff0c;层叠样式表&#xff0c;用于控制页面的样式 CSS 能够对网页中元素位置的排版进行像素级精确控制&#xff0c;实现美化页面的效果&#xff0c;能够做到页面的样式和结构分离&#xff08;类似于…

【数字图像处理】第5章 图像空域增强方法

上理考研周导师的哔哩哔哩频道 我在频道里讲课哦 目录 5.1 图像噪声 相关概念 ①图像噪声的产生 ② 图像噪声分类 ③ 图像噪声特点 5.2 图像增强方法分类 ①图像增强概念 ②图像增强目的 ③图像增强技术方法: 5.3 基于灰度变换的图像增强 1. 概述: 2. 灰度变换…

十大云手机排行榜:哪个云手机更好用?

近些年&#xff0c;市场上涌现出许多云手机产品&#xff0c;不同产品适合的应用场景也各不相同。在选用云手机之前&#xff0c;企业和个人用户需要了解它们的功能、特点以及适用的场景。本文将对当前主流的云手机进行对比&#xff0c;帮助大家挑选出最适合的云手机产品。 1. 红…

【数据结构与算法】之链表详解

链表是一种常用的数据结构&#xff0c;它是一种线性数据结构&#xff0c;但与数组不同&#xff0c;它并非连续存储数据&#xff0c;而是通过指针将数据节点连接起来。每个节点都包含数据域和指向下一个节点的指针域。这种结构赋予链表独特的优势和局限性&#xff0c;使其在某些…

九种排序,一次满足

我们在算法题进行练习提升时&#xff0c;经常会看到题目要求数据从大到小输出&#xff0c;从小到大输出&#xff0c;前一半从小到大输出&#xff0c;后一半从大到小输出等&#xff0c;那么这时候就需要用到排序算法&#xff0c;通过排序算法将数据按照一定的顺序进行排序。本文…

解决PyCharm 2023 Python Packages列表为空

原因是因为没有设置镜像源 展开 > 之后&#xff0c;这里 点击齿轮 添加一个阿里云的源 最后还需要点击刷新 可以选择下面的任意一个国内镜像源&#xff1a; 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&#xff1a;http://mirrors.aliyun.com/…

设计模式之-策略模式配合枚举

1、定义枚举接收不同的参数使用不同的handler, 2、定义个handerl接口&#xff0c;统一方法处理&#xff0c;每个handler实现该接口 public interface IMethodHandler<T, R> {/*** 处理统一入口** param req*/R process(T req); } java3、定义一个简单工厂统一处理 Comp…

送给正在入行的小白:最全最有用的网络安全学习路线已经安排上了,零基础入门到精通,收藏这一篇就够了

在这个圈子技术门类中&#xff0c;工作岗位主要有以下三个方向&#xff1a; 安全研发安全研究&#xff1a;二进制方向安全研究&#xff1a;网络渗透方向 下面逐一说明一下。 第一个方向&#xff1a;安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#xf…

k8s 1.28.2 集群部署 harbor v2.11.1 接入 MinIO 对象存储

文章目录 [toc]提前准备什么是 HarborHarbor 架构描述Harbor 安装的先决条件硬件资源软件依赖端口依赖 Harbor 在 k8s 的高可用Harbor 部署Helm 编排YAML 编排创建 namespace导入镜像部署 Redis部署 PostgreSQL部署 Harbor core部署 Harbor trivy部署 Harbor jobservice部署 Ha…