使用ROS 1bridge用rosbag记录和回放话题数据 [待校准@8125]

本教程是 * 在ROS 1和ROS 2 * 例程之间的桥接通讯的后续,可以在其他 demos, 中找到,在下面假设您已经完成了该教程。 [待校准@8126]

ros1 _ bridge可以从 binary packages or built from source 安装; 两者都适用于这些例子。 [待校准@8127]

接下来是一系列附加示例,例如上述 * ROS 1与ROS 2 * 例程之间的桥接通讯末尾的示例。 [待校准@8128]

用罗斯包和ROS 1桥记录话题数据 [待校准@8129]

在此示例中,我们将使用 cam2image 例程程序带有ROS 2和Python脚本模拟简易turtlebot机器人的传感器数据,bridge它ROS 1使用rosbag转记录下来。 [待校准@8130]

首先,我们将在一个新的外壳中运行ROS 1 roscore : [待校准@8131]

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

然后,我们将在另一个外壳中运行带有 --bridge-all-topics 乙选项的ROS 1ROS => ROS 2 dynamic_bridge (这样我们就可以做 rostopic list 并看到它们): [待校准@8132]

# 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的路径。 [待校准@8133]


现在,我们可以启动ROS 2程序,该程序将模拟我们的turtlebot式机器人。首先,我们将使用 -b 选项运行 cam2image 程序,这样它就不需要相机来工作: [待校准@8134]

# 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: 使用命名空间话题名称 [待校准@8135]

然后,我们将运行一个简单的Python脚本,从Kobuki库中模拟 odomimu_data 话题。我会为imu数据使用更准确的 “~ 传感器/imu_data” 话题名称,但是我们在ROS 2中还没有命名空间支持 (它来了!)。将此脚本放在调用ed emulate_kobuki_node.py 的文件中: [待校准@8136]

#!/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 shell中运行此python脚本: [待校准@8137]

# 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

既然所有的数据源文件和动态bridge都在运行,我们可以在一个新的ROS 1外壳中看到可用的话题: [待校准@8138]

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

你应该看到这样的东西: [待校准@7529]

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

我们现在可以用 rosbag record 在同一个外壳中记录这些数据: [待校准@8139]

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

几秒钟后你可以 Ctrl-crosbag 命令和做一个 ls -lh 看到大文件,你可能会看到这样: [待校准@8140]

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

尽管您的包的文件名会有所不同 (因为它是从日期和时间派生而来的)。 [待校准@8141]

用罗斯包和ROS 1桥回放话题数据 [待校准@8142]

现在我们有了一个袋子文件,你可以使用任何ROS 1工具来反思袋子文件,比如 rosbag info <bag file>rostopic list -b <bag file>rqt_bag <bag file> 。然而,我们也可以使用 rosbag play 和ROS 1ROS => ROS 2 dynamic_bridge 将包数据回放到ROS 2中。 [待校准@8143]

首先关闭为上一教程打开的所有shell,停止任何正在运行的程序。 [待校准@8144]

然后在一个新的外壳中开始 roscore : [待校准@8145]

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

然后在另一个外壳中运行 dynamic_bridge : [待校准@8146]

# 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 选项,这样我们就不必为短袋子重新启动它: [待校准@8147]

# 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

确保用要播放的bag文件的路径替换 path/to/bag_file[待校准@8148]


现在数据正在回放,bridge正在运行,我们可以看到ROS 2中出现的数据。 [待校准@8149]

# 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

你应该看到如下内容: [待校准@8150]

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

您还可以使用 showimage 工具从包里看到正在播放的图像: [待校准@8151]

ros2 run image_tools showimage