如何将 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
我有 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