确认图像已发布到 ROS
Confirming an Image is Published to ROS
我一直在尝试将图像 post 发送到 ROS(使用 Python/rospy),虽然我认为我的方法是正确的,但我很难确认它.使用
rosrun image_view image_view image:=(topic)
似乎没有显示任何内容。我也试过 rqtbag,但我真的不知道它是如何工作的,除了它不显示已发布的东西,无论如何。
粘贴我当前代码之前的一些注意事项:
- 我现在使用的代码是基于我以前使用过的代码。我使用了与 post 文本图像到 ROS 的类似设置,并且这些输出相当可靠。
- 此处略作修改。此代码的大部分是
on_message
函数的一部分,因为这在实现时都通过 MQTT 运行。 (逻辑是在一个系统上获取图像 -> 编码 -> 传输到其他系统 -> 解码 -> 发布到 ROS。)
- 我在 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
) .订阅者需要一些时间来注册到新的发布者,并且在您发布图像之前不会准备好(另请参阅 )。
➔ 不要在需要之前初始化发布者,而是在初始化节点时一开始就做。
我一直在尝试将图像 post 发送到 ROS(使用 Python/rospy),虽然我认为我的方法是正确的,但我很难确认它.使用
rosrun image_view image_view image:=(topic)
似乎没有显示任何内容。我也试过 rqtbag,但我真的不知道它是如何工作的,除了它不显示已发布的东西,无论如何。
粘贴我当前代码之前的一些注意事项:
- 我现在使用的代码是基于我以前使用过的代码。我使用了与 post 文本图像到 ROS 的类似设置,并且这些输出相当可靠。
- 此处略作修改。此代码的大部分是
on_message
函数的一部分,因为这在实现时都通过 MQTT 运行。 (逻辑是在一个系统上获取图像 -> 编码 -> 传输到其他系统 -> 解码 -> 发布到 ROS。) - 我在 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
) .订阅者需要一些时间来注册到新的发布者,并且在您发布图像之前不会准备好(另请参阅
➔ 不要在需要之前初始化发布者,而是在初始化节点时一开始就做。