您正在阅读的是开发版本的文档。有关最新发布的版本,请访问 Jazzy.

记录和播放数据 挎包 使用 ROS 1 桥接器

本教程是 ROS 1 和 ROS 2 之间的通信桥梁 可以找到的演示 这里在下文中,假设您已经完成了该教程。

ros1_bridge可以从 消息来源 这些例子。

接下来是一系列额外的例子,就像前文提到的《"......"》结尾的例子一样 ROS 1 和 ROS 2 之间的通信桥梁 演示。

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

在本例中,我们将使用 cam2image ROS 2 自带的演示程序和 Python 脚本可以模拟一个简单的海龟机器人的传感器数据,这样我们就可以将其与 ROS 1 连接起来,并使用 rosbag 记录这些数据。

首先,我们将运行 ROS 1 玫瑰核 在一个新的外壳中:

# Shell A:
. /opt/ros/kinetic/setup.bash
# 或者,在 OSX 操作系统上,类似这样:
# . ~/ros_catkin_ws/install_isolated/setup.bash
玫瑰核

然后运行 ROS 1 <=> ROS 2 动态桥-桥-所有主题 选项(这样我们就可以 游标 清单 并在另一个外壳中看到它们):

# Shell B:
. /opt/ros/kinetic/setup.bash
# 或者,在 OSX 操作系统上,类似这样:
# . ~/ros_catkin_ws/install_isolated/setup.bash
. /opt/ros/ardent/setup.bash
# 或者,如果从源代码构建 ROS 2:
# . <workspace-with-bridge>/install/setup.bash
出口 ROS_MASTER_URI=http://localhost:11311 ros2 运行 ros1_桥 动态桥 -桥-所有主题

记得更换 <带桥工作区>; 的路径,或者是提取 ROS 2 二进制文件的路径,或者是从源代码构建 ROS 2 的路径。


现在,我们可以启动 ROS 2 程序来模拟我们的海龟机器人。首先,我们将运行 cam2image 程序与 -b 选项,因此它不需要摄像头就能工作:

# Shell C:
. /opt/ros/ardent/setup.bash
# 或者,如果从源代码构建 ROS 2:
# . <workspace-with-bridge>/install/setup.bash
玫瑰2 运行 图像工具 cam2image -- -b

TODO: 使用命名的主题名称

然后,我们将运行一个简单的 Python 脚本来模拟 敖德imu_data 小吹底座的主题。我会使用更准确的 ~sensors/imu_data 但 ROS 2 还不支持命名空间(即将推出!)。将此脚本放入一个名为 emulate_kobuki_node.py:

#!/usr/bin/env python3

舶来品 系统
舶来品 时间

舶来品 rclpy

 nav_msgs.msg 舶来品 测距
 传感器_msgs.msg 舶来品 伊姆

捍卫 主要():
    rclpy.启动(参数=系统.参数)

    网站 = rclpy.创建节点('emulate_kobuki_node';)

    imu_publisher = 网站.创建出版商(伊姆, 'imu_data';)
    odom_publisher = 网站.创建出版商(测距, '奥多姆';)

    imu_msg = 伊姆()
    odom_msg = 测距()
    计数器 = 0
    虽然 正确:
        计数器 += 1
        现在 = 时间.时间()
        如果 (计数器 % 50) == 0:
            odom_msg.页眉.盖章.秒钟 = int(现在)
            odom_msg.页眉.盖章.纳米 = int(现在 * 1e9) % 1000000000
            odom_publisher.发布(odom_msg)
        如果 (计数器 % 100) == 0:
            imu_msg.页眉.盖章.秒钟 = int(现在)
            imu_msg.页眉.盖章.纳米 = int(现在 * 1e9) % 1000000000
            imu_publisher.发布(imu_msg)
            计数器 = 0
        时间.睡眠(0.001)


如果 姓名____ == '__main__';:
    系统.出口(主要())

您可以在新的 ROS 2 shell 中运行这个 python 脚本:

# Shell D:
. /opt/ros/ardent/setup.bash
# 或者,如果从源代码构建 ROS 2:
# . <workspace-with-bridge>/install/setup.bash
python3 emulate_kobuki_node.py

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

# Shell E:
. /opt/ros/kinetic/setup.bash
# 或者,在 OSX 操作系统上,类似这样:
# . ~/ros_catkin_ws/install_isolated/setup.bash
游标 清单

你应该看到这样的内容:

% 游标 清单
/图像
/imu_data
/敖德
/莲雾
/啮合

我们现在可以用 挎包 记录 在同一个外壳中:

# Shell E:
挎包 记录 /图片 /imu_data /odom

几秒钟后,您可以 Ctrl-c挎包 命令,并执行 ls -lh 来查看文件的大小,您可能会看到类似下面的内容:

% ls -总计 0
-rw-rw-r-- 1 威廉 威廉  12M 二月 23 16:59 2017-02-23-16-59-47.bag

不过,您的文件袋的文件名会有所不同(因为文件名来自日期和时间)。

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

现在,我们有了一个数据包文件,你可以使用任何 ROS 1 工具来反省数据包文件,例如 挎包 信息 <bag 文件>;, 游标 清单 -b <bag 文件>;rqt_bag <bag 文件>;.不过,我们也可以通过以下方法将袋子数据回放至 ROS 2 挎包 游戏 和 ROS 1 <=> ROS 2 动态桥.

首先关闭为上一教程打开的所有 shell,停止所有正在运行的程序。

然后在新的 shell 中启动 玫瑰核:

# Shell P:
. /opt/ros/kinetic/setup.bash
# 或者,在 OSX 操作系统上,类似这样:
# . ~/ros_catkin_ws/install_isolated/setup.bash
玫瑰核

然后运行 动态桥 在另一个外壳中:

# Shell Q:
. /opt/ros/kinetic/setup.bash
# 或者,在 OSX 操作系统上,类似这样:
# . ~/ros_catkin_ws/install_isolated/setup.bash
. /opt/ros/ardent/setup.bash
# 或者,如果从源代码构建 ROS 2:
# . <workspace-with-bridge>/install/setup.bash
出口 ROS_MASTER_URI=http://localhost:11311 ros2 运行 ros1_桥 动态桥 -桥-所有主题

然后用 挎包 游戏 在另一个新的 shell 中,使用 --循环 选项,这样我们就不必一直为短包重新启动它:

# Shell R:
. /opt/ros/kinetic/setup.bash
# 或者,在 OSX 操作系统上,类似这样:
# . ~/ros_catkin_ws/install_isolated/setup.bash
挎包 游戏 --循环 path/to/bag_file

确保更换 path/to/bag_file 的路径。


现在,数据正在回放,网桥也在运行,我们可以在 ROS 2 中看到数据传输。

# Shell S:
. /opt/ros/ardent/setup.bash
# 或者,如果从源代码构建 ROS 2:
# . <workspace-with-bridge>/install/setup.bash
玫瑰2 主题 list ros2 主题 回响 /odom

你应该看到类似的内容:

% 玫瑰2 主题 清单
/
/图像
/imu_data
/敖德
/参数事件

您还可以通过使用 显示图像 工具

玫瑰2 运行 图像工具 显示图像