使用ROS 1桥接在`rosbag`中记录和回放数据

本教程是“在ROS 1和ROS 2之间进行桥接通信”的后续教程,可以在此处找到:`https://github.com/ros2/ros1_bridge/blob/master/README.md`__,在下文中假设您已经完成了该教程。

对于这些示例,可以从 源代码 构建ros1_bridge。

接下来是一系列额外的示例,类似于上述 ROS 1和ROS 2之间的桥接通信 演示中的示例。

使用rosbag和ROS 1 Bridge记录主题数据

在这个示例中,我们将使用ROS 2附带的``cam2image``演示程序和一个Python脚本来模拟一个简单的类似于turtlebot的机器人的传感器数据,以便我们可以将其桥接到ROS 1并使用rosbag进行记录。

首先,在新的终端窗口中运行ROS 1的``roscore``:

# Shell A:
. /opt/ros/kinetic/setup.bash
# Or, on OSX, something like:
# . ~/ros_catkin_ws/install_isolated/setup.bash
roscore

然后,在另一个终端窗口中运行ROS 1 <=> ROS 2的``dynamic_bridge``,使用``--bridge-all-topics``选项(这样我们可以执行``rostopic list``并查看它们):

# Shell B:
. /opt/ros/kinetic/setup.bash
# Or, on OSX, something like:
# . ~/ros_catkin_ws/install_isolated/setup.bash
. /opt/ros/ardent/setup.bash
# Or, if building ROS 2 from source:
# . <workspace-with-bridge>/install/setup.bash
export ROS_MASTER_URI=http://localhost:11311
ros2 run ros1_bridge dynamic_bridge --bridge-all-topics

请记得将``<workspace-with-bridge>``替换为你提取ROS 2二进制文件的路径或者构建ROS 2源码的路径。


现在我们可以启动模拟海龟机器人的ROS 2程序。首先,我们将使用``-b``选项运行``cam2image``程序,这样它就不需要相机就能工作:

# Shell C:
. /opt/ros/ardent/setup.bash
# Or, if building ROS 2 from source:
# . <workspace-with-bridge>/install/setup.bash
ros2 run image_tools cam2image -- -b

TODO: 使用命名空间的主题名

然后,我们将运行一个简单的Python脚本来模拟Kobuki基座的``odom``和``imu_data``主题。我会使用更准确的``~sensors/imu_data``主题名来表示IMU数据,但是在ROS 2中还没有命名空间支持(即将推出!)。将这个脚本保存到一个名为``emulate_kobuki_node.py``的文件中:

#!/usr/bin/env python3

import sys
import time

import rclpy

from nav_msgs.msg import Odometry
from sensor_msgs.msg import Imu

def main():
    rclpy.init(args=sys.argv)

    node = rclpy.create_node('emulate_kobuki_node')

    imu_publisher = node.create_publisher(Imu, 'imu_data')
    odom_publisher = node.create_publisher(Odometry, 'odom')

    imu_msg = Imu()
    odom_msg = Odometry()
    counter = 0
    while True:
        counter += 1
        now = time.time()
        if (counter % 50) == 0:
            odom_msg.header.stamp.sec = int(now)
            odom_msg.header.stamp.nanosec = int(now * 1e9) % 1000000000
            odom_publisher.publish(odom_msg)
        if (counter % 100) == 0:
            imu_msg.header.stamp.sec = int(now)
            imu_msg.header.stamp.nanosec = int(now * 1e9) % 1000000000
            imu_publisher.publish(imu_msg)
            counter = 0
        time.sleep(0.001)


if __name__ == '__main__':
    sys.exit(main())

你可以在一个新的ROS 2终端中运行这个Python脚本:

# Shell D:
. /opt/ros/ardent/setup.bash
# Or, if building ROS 2 from source:
# . <workspace-with-bridge>/install/setup.bash
python3 emulate_kobuki_node.py

现在,所有的数据源和动态桥接都在运行,我们可以在一个新的ROS 1终端中查看可用的主题:

# Shell E:
. /opt/ros/kinetic/setup.bash
# Or, on OSX, something like:
# . ~/ros_catkin_ws/install_isolated/setup.bash
rostopic list

你应该看到类似这样的内容:

% rostopic list
/image
/imu_data
/odom
/rosout
/rosout_agg

我们现在可以在同一个终端中使用``rosbag record``记录这些数据:

# Shell E:
rosbag record /image /imu_data /odom

几秒钟后,您可以使用``Ctrl-c``停止``rosbag``命令,并使用``ls -lh``查看文件的大小,您可能会看到类似以下内容:

% ls -lh
total 0
-rw-rw-r-- 1 william william  12M Feb 23 16:59 2017-02-23-16-59-47.bag

尽管您的包文件名将不同(因为它是从日期和时间派生的)。

使用rosbag和ROS 1 Bridge播放主题数据

现在,我们有了一个包文件,您可以使用任何ROS 1工具来检查包文件,例如``rosbag info <包文件>``, rostopic list -b <包文件>, 或``rqt_bag <包文件>``。然而,我们也可以使用``rosbag play``和ROS 1 <=> ROS 2 ``dynamic_bridge``将包数据回放到ROS 2中。

首先关闭您为上一个教程打开的所有终端,并停止任何正在运行的程序。

然后在新的终端中启动 roscore:

# Shell P:
. /opt/ros/kinetic/setup.bash
# Or, on OSX, something like:
# . ~/ros_catkin_ws/install_isolated/setup.bash
roscore

然后在另一个终端中运行 dynamic_bridge:

# Shell Q:
. /opt/ros/kinetic/setup.bash
# Or, on OSX, something like:
# . ~/ros_catkin_ws/install_isolated/setup.bash
. /opt/ros/ardent/setup.bash
# Or, if building ROS 2 from source:
# . <workspace-with-bridge>/install/setup.bash
export ROS_MASTER_URI=http://localhost:11311
ros2 run ros1_bridge dynamic_bridge --bridge-all-topics

然后在另一个新的终端中使用 rosbag play 播放包数据,使用 --loop 选项,这样我们就不必为短包文件不断重新启动它:

# Shell R:
. /opt/ros/kinetic/setup.bash
# Or, on OSX, something like:
# . ~/ros_catkin_ws/install_isolated/setup.bash
rosbag play --loop path/to/bag_file

请确保将 path/to/bag_file 替换为您要播放的包文件的路径。


现在数据正在回放,桥接程序正在运行,我们可以在ROS 2中看到数据传输过来。

# Shell S:
. /opt/ros/ardent/setup.bash
# Or, if building ROS 2 from source:
# . <workspace-with-bridge>/install/setup.bash
ros2 topic list
ros2 topic echo /odom

您应该会看到类似以下的内容:

% ros2 topic list
/clock
/image
/imu_data
/odom
/parameter_events

您还可以使用``showimage``工具查看从包中播放的图像:

ros2 run image_tools showimage