使用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库中模拟 odom
和 imu_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-c
的 rosbag
命令和做一个 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