确认图像已发布到 ROS

Confirming an Image is Published to ROS

我一直在尝试将图像 post 发送到 ROS(使用 Python/rospy),虽然我认为我的方法是正确的,但我很难确认它.使用

rosrun image_view image_view image:=(topic)

似乎没有显示任何内容。我也试过 rqtbag,但我真的不知道它是如何工作的,除了它不显示已发布的东西,无论如何。

粘贴我当前代码之前的一些注意事项:

  1. 我现在使用的代码是基于我以前使用过的代码。我使用了与 post 文本图像到 ROS 的类似设置,并且这些输出相当可靠。
  2. 此处略作修改。此代码的大部分是 on_message 函数的一部分,因为这在实现时都通过 MQTT 运行。 (逻辑是在一个系统上获取图像 -> 编码 -> 传输到其他系统 -> 解码 -> 发布到 ROS。)
  3. 我在 Ubuntu 和 ROS Indigo 上使用 Python 2.7。

事不宜迟,我目前的发布代码:

rospy.init_node('BringInAnImage', log_level = rospy.INFO)

def convert(messagepayload):
    t = open('newpic.bmp','w')
    t.write(messagepayload)
    t.close()

def on_message(client, userdata, msg):
    img = base64.b64decode(msg.payload)

    convert(img)
    time.sleep(5) 
    source = cv2.imread('newpic.bmp')  #this should be a mat file

    # talk to ROS
    bridge = CvBridge()
    pub2 = rospy.Publisher('/BringInAnImage', Image, queue_size = 10)
    pub2.publish(bridge.cv2_to_imgmsg(source, "bgr8"))
    print "uh..... done??"

我正在使用基本的监听功能来尝试查看发生了什么(这是在我在单独的终端中执行的不同脚本中):

def listener():
    rospy.init_node('listener', anonymous=True)
    rospy.Subscriber("/BringInAnImage", Image, callback)
    rospy.spin()

if __name__ == '__main__':
    listener()

回调只是打印出图像已收到。

如何检查主题 xyz 上是否发布了某些内容

要检查消息是否真的发布,可以使用rostopic命令。 运行 终端中的以下命令打印在指定主题上发布的所有内容。这是检查是否有发布内容的最简单方法。

rostopic echo <topic_name>

查看 ROS wiki 以了解 rostopic 可以做的更多有用的事情。

为什么 image_view 收不到图片?

虽然你做的基本上是正确的,但你的图像将不会被任何订阅者接收,因为你的代码中有一个不那么明显但致命的问题:你在初始化后立即使用发布者(pub2) .订阅者需要一些时间来注册到新的发布者,并且在您发布图像之前不会准备好(另请参阅 )。

➔ 不要在需要之前初始化发布者,而是在初始化节点时一开始就做。