记录和回放数据 [待校准@8079]

Goal目标: Record记录发布在某个话题上的数据,以便您可以随时重播和检查它。 [待校准@8080]

教程级别: 初学者 [Alyssa@7088]

时间: 10分钟 [Alyssa@7452]

背景

[需手动修复的语法]``ros2 bag`` is是一个命令行工具,用于记录系统中发布的关于话题的数据。它累积传递给任意数量话题的数据,并将其保存在数据库中。然后,您可以重放数据以重现测试和实验的结果。记录话题也是分享你的作品并允许其他人重新创作的好方法。 [待校准@8081]

先决条件

注解

对于需要更高性能版本的rosbag2的ROS 2Foxy用户,请参阅 foxy-future branch of rosbag2 。这是一个官方支持的分支,更接近Galactic版本,增加了性能改进和特性,但与Foxy版本不兼容。用户刚刚进入这个教程Foxy,你可以忽略这继续默认安装。 [待校准@8082]

您应该安装 ros2 bag 作为常规ROS 2设置的一部分。 [待校准@8083]

如果您是从Linux上的Debians安装的,并且您的系统无法识别该命令,请像这样安装它: [待校准@8084]

sudo apt-get install ros-foxy-ros2bag \
                     ros-foxy-rosbag2-converter-default-plugins \
                     ros-foxy-rosbag2-storage-default-plugins

本教程讨论了前面教程中涵盖的概念,如 nodestopics. It also uses the turtlesim package[待校准@8085]

和往常一样,不要忘记在 every new terminal you open 中源文件ROS 2。 [待校准@7566]

任务

1设置 [待校准@7567]

您将在 turtlesim 系统中记录您的键盘输入,以便以后保存和重放,所以从启动 /turtlesim/teleop_turtle 节点开始。 [待校准@8086]

打开新终端并运行: [待校准@7339]

ros2 run turtlesim turtlesim_node

打开另一个终端并运行: [待校准@7816]

ros2 run turtlesim turtle_teleop_key

让我们也创建一个新目录来存储我们保存的录音,就像好的做法一样: [待校准@8087]

mkdir bag_files
cd bag_files

2选择一个话题 [待校准@8088]

[需手动修复的语法]``ros2 bag`` can只记录发表的话题的数据。要查看系统话题列表,请打开新终端并运行以下命令: [待校准@8089]

ros2 topic list

它将返回: [待校准@8090]

/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

在话题教程中,你了解到 /turtle_teleop 节点在 /turtle1/cmd_vel 话题上发布命令,让海龟在turtlesim中移动。 [待校准@8091]

要查看 /turtle1/cmd_vel 发布的数据,请运行以下命令: [待校准@8092]

ros2 topic echo /turtle1/cmd_vel

起初什么都不会出现,因为teleop没有发布任何数据。返回运行teleop的终端并选择它,使其处于活动状态。使用箭头键移动海龟,你会看到运行 ros2 topic echo 的终端上发布的数据。 [待校准@8093]

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

3 ros2包记录 [待校准@8094]

要记录发布到话题的数据,请使用命令语法: [待校准@8095]

ros2 bag record <topic_name>

在您选择的话题上运行此命令之前,请打开一个新终端并移动到您之前创建的 bag_files 目录中,因为rosbag文件将保存在您运行它的目录中。 [待校准@8096]

运行命令: [待校准@7596]

ros2 bag record /turtle1/cmd_vel

您将在终端中看到以下消息 (日期和时间将有所不同): [待校准@8097]

[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 正在记录公布的关于 /turtle1/cmd_vel 话题的数据。回到远程终端,再次移动海龟。这些动作并不重要,但是当你以后重放数据时,试着做一个可识别的模式来看看。 [待校准@8098]

../../_images/record.png

按 “ctrl + c” 停止录制。 [待校准@8099]

数据将被累积在一个袋子文件中,名称为 rosbag2_year_month_day-hour_minute_second [待校准@8100]

3.1记录多个话题 [待校准@8101]

您还可以记录多个话题,以及更改 ros2 bag 保存到的文件的名称。 [待校准@8102]

运行以下命令: [待校准@8103]

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

[需手动修复的语法] -o 选项允许您为您的包文件选择一个唯一的名称。以下string,在这种情况下是 subset ,是文件名。 [待校准@8104]

要一次记录多个话题,只需列出用空格分隔的每个话题。 [待校准@8105]

你将看到以下信息,确认两个话题都被记录了。 [待校准@8106]

[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...

你可以移动乌龟,完成后按 “ctrl + c”。 [待校准@8107]

注解

还有一个选项,你可以添加到命令, -a ,它记录你系统上的所有话题。 [待校准@8108]

4 ros2包信息 [待校准@8109]

您可以通过运行以下命令查看有关录制的详细信息: [待校准@8110]

ros2 bag info <bag_file_name>

subset 袋文件上运行此命令将返回该文件的信息列表: [待校准@8111]

ros2 bag info subset
Files:             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: cdr
                 Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 3004 | Serialization Format: cdr

要查看单个消息,您必须打开数据库 (在本例中为sqlite3) 来检查它,这超出了ROS 2的范围。 [待校准@8112]

5 ros2包游戏 [待校准@8113]

在重播bag文件之前,在运行teleop的终端中输入 “ctrl + c”。然后确保你的turtlesim窗口是可见的,这样你就可以在动作中看到包文件。 [待校准@8114]

输入命令: [待校准@8115]

ros2 bag play subset

终端将返回消息: [待校准@8116]

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

你的海龟将遵循你在录制时输入的相同路径 (虽然不完全是100%; 海龟对系统时间的微小变化很敏感)。 [待校准@8117]

../../_images/playback.png

因为 subset 文件记录了 /turtle1/pose 话题,所以即使你不动,只要你让turtlesim运行, ros2 bag play 命令也不会退出。 [待校准@8118]

这是因为只要 /turtlesim 节点有源,发布数据 /turtle1/pose 话题定期。你可能已经注意到在 ros2 bag info 示例结果, /turtle1/cmd_vel 话题的 Count 信息9; 这是多少次我们按下箭头键录制。 [待校准@8119]

请注意, /turtle1/poseCount 值超过3000; 当我们记录时,关于这个话题的数据被发表了3000次。 [待校准@8120]

要了解发布位置数据的频率,可以运行以下命令: [待校准@8121]

ros2 topic hz /turtle1/pose

总结

您可以使用 ros2 bag 命令记录ROS 2系统中话题传递的数据。无论你是和别人分享你的作品还是反思你自己的实验,它都是一个很好的了解工具。 [待校准@8122]

下一步

你已经完成了 "Beginner: CLI Tools" 教程!下一步是处理 "Beginner: Client Libraries" 教程,从 创建工作空间 [待校准@9276] 开始。 [待校准@8123]