如何将 2 个 ROS 主题合并为 1 个?

How to merge 2 ROS topics into 1?

我有 2 个主题正在由英特尔实感相机发布。一个主题是贴深度图,另一个是贴彩色图。在 header 中,每个彩色图像都有一个对应的具有相同时间戳的深度图像。我想将颜色和深度主题合并到一个主题中,该主题将发布一对深度和彩色图像。是否有基于时间戳执行此操作的 ROS 函数?

这是我创建的订阅者:

self.image_sub = rospy.Subscriber("image", Image, mask_detect, queue_size=1, buff_size=2**24)
depth_image_sub = rospy.Subscriber("depth_image", Image,
aquire_depth_image, queue_size=1000)

我希望能够做这样的事情(伪代码):

color_depth = rospy.Subscriber(["image", "depth_image"], callback_function, mergePolicy="EXACTTIME")

是否有在 ROS 中执行此操作的标准方法或简单的方法?

每个主题都有一个与之关联的唯一类型或 ROS 消息。要将两个主题合并为一个,您必须获取这两条消息并从中创建一条新消息。 这将有一个回调,它像您已经做的那样订阅两者,然后将它们发布到您想要的合并主题和消息类型。

我不能在评论中提出这个问题,但你为什么要合并两者?

最常见的原因,尤其是对于相机数据,是您要确保回调是在同一时间拍摄的一组数据上触发的。标准方法是使用 ROS message_filters:

image_sub = message_filters.Subscriber("image", Image)
depth_sub = message_filters.Subscriber("depth_image", Image)
sync = message_filters.TimeSynchronizer([image_sub, depth_sub], 1)
sync.registerCallback(mask_detect_callback)

如果你想按时间融合图像,你将不得不编写自己的nodelet。但我相信实感相机已经以 RGB 点云的形式为你做到了。

该消息默认关闭。您可以通过设置在启动文件中打开它:

  <arg name="enable_pointcloud"   default="true"/>
  <arg name="pointcloud_texture_stream" default="RS2_STREAM_COLOR"/>
  <arg name="pointcloud_texture_index"  default="0"/>

然后您的相关深度和 RGB 应作为一条名为的消息发布:

depth/points

仅供参考,这是 depth/points 主题的数据类型: http://docs.ros.org/api/sensor_msgs/html/msg/PointCloud2.html