rosbag--ROS中数据的记录与重放

本文介绍如何在ROS环境中记录和回放数据。通过创建.bag文件保存运行系统的topic数据,并详细展示了如何重放该文件以重现相同效果。此外,还介绍了如何选择性地记录特定topic的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将运行的ROS软件上的数据记录到一个.bag文件,然后重放数据再产生相同的效果。
 
1. 记录数据(创建一个bag文件)
从一个运行的ROS系统中记录topic的数据,这个topic数据会在一个bag文件中积累。
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key

 
(1) 记录所有发布的topics
$ rostopic list -v

Published topics:
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
* /rosout [rosgraph_msgs/Log] 2 publishers
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1 publisher
 
Subscribed topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber

* /rosout [rosgraph_msgs/Log] 1 subscriber

这些发布的topic只是可能被记录在数据记录文件上的message文件类型。


mkdir ~/bagfiles

cd ~/bagfiles

rosbag record -a

 
2. 检验和回放bag文件

(1) 用info命令检查bag的内容而不用回放它:

$ rosbag info <your bagfile>

path:        your bagfile
version:     2.0
duration:    1:38s (98s)
start:       
end:         
size:        865.0 KB
messages:    12471
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
rosgraph_msgs/Log   [acffd30cd6b6de30f120938c17c593fb]
turtlesim/Color     [353891e354491c51aabe32df673fb446]
turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /rosout                    4 msgs    : rosgraph_msgs/Log   (2 connections)
/turtle1/cmd_vel         169 msgs    : geometry_msgs/Twist
/turtle1/color_sensor   6149 msgs    : turtlesim/Color

/turtle1/pose           6149 msgs    : turtlesim/Pose

显示了topic的名字和类型还有每个topic在bag文件中包含的messages数量。
 

(2) 重放bag文件,以在运行系统上产生相同的效果。

在运行turtle_teleop_key的终端用Ctrl+c杀死上个部分还在运行的teleop程序。让turtle继续运行。

在产生原始bag文件的目录中运行以下命令:

$ rosbag play <your bagfile>

[ INFO] [1418271315.162885976]: Opening  your bagfile.bag
 
Waiting 0.2 seconds after advertising topics... done.
 

Hit space to toggle paused, or 's' to step.

等待可以用-d来特别指定。而是使用-s参数在不是bag文件开始的其他部分开始回放。
rosbag play -r 2 <your bagfile>   通过一个特定的因子改变发布数据的速度
 
3. 记录数据子集
允许用户值记录它们感兴趣的topics。在bag文件目录中运行:
$ rosbag record -O filename /turtle1/cmd_vel /turtle1/pose
 
检查bag文件的内容rosbag info subset.bag):
path:        filename.bag
version:     2.0
duration:    12.6s
start:       
end:         
size:        68.3 KB
messages:    813
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /turtle1/cmd_vel    23 msgs    : geometry_msgs/Twist

/turtle1/pose      790 msgs    : turtlesim/Pose

4. rosbag record/play的局限
注意到小乌龟的路径跟你用键盘控制的路径不是非常准确的吻合,即使大概的形状是一样的,但是小乌龟没有非常完全跟踪那个路径。原因是小乌龟跟踪的路径对系统中时间变化非常敏感。在系统中,在messages被roscore记录和处理时以及使用rosplay 产生和处理messages时,rosbag复制运行系统的行为的能力是有限的。

### 使用ROS2进行雷达SLAM建图教程 #### 1. 准备工作 为了在ROS2环境中使用雷达数据进行同步定位建图(SLAM),需先安装必要的软件包并配置开发环境。对于基于激光雷达(LiDAR)的SLAM,在ROS中有多种成熟的算法可供选择,如Gmapping, Karto, Hector 和 Cartographer等[^1]。 #### 2. 安装Cartographer_ROS2 鉴于Cartographer支持LiDAR传感器,并且官方已推出针对ROS2版本的支持,推荐采用此工具来进行雷达SLAM操作。可以通过以下命令获取最新版cartographer_ros2仓库: ```bash git clone https://github.com/cartographer-project/cartographer_ros.git -b ros2 YOUR_CATKIN_WS/src/ ``` 接着按照README.md中的指示完成依赖项安装和编译过程。 #### 3. 配置启动文件 编辑`.launch.py`文件以适应具体的硬件设置,特别是要指定所使用的雷达型号及其对应的参数配置。确保正确设置了帧ID(frame_id), 扫描话题名(scan_topic)以及其他可能影响性能的关键选项。 #### 4. 运行节点 当一切准备就绪之后,可以尝试执行如下指令来启动整个系统: ```bash ros2 launch cartographer_ros demo_backpack_2d.launch.py use_sim_time:=False ``` 上述命令会加载预设好的参数集,并初始化所有必需的服务端口和服务程序。 #### 5. 数据记录回放 通过`rosbag record`命令录制实际行驶过程中产生的原始传感数据;稍后可通过播放这些日志文件(`ros2 bag play`)的方式重现实验条件,便于调试优化。 #### 6. 地图保存 一旦完成了满意的探索路径规划,则应当及时调用服务接口将当前构建的地图存储下来供后续分析或者部署到其他相似环境下重复利用。这通常涉及到向`/map_saver/save_map`发送请求消息。 ```python import rclpy from nav_msgs.srv import SaveMap def save_current_map(): node = rclpy.create_node('save_map_client') client = node.create_client(SaveMap, '/map_saver/save_map') while not client.wait_for_service(timeout_sec=1.0): print('service not available, waiting again...') request = SaveMap.Request() future = client.call_async(request) rclpy.spin_until_future_complete(node, future) if future.result() is not None: response = future.result() print(f'Map saved successfully at {response.map_path}') else: print('Failed to call service /map_saver/save_map.') if __name__ == '__main__': rclpy.init() save_current_map() rclpy.shutdown() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值