在 ROS 中获取 RealSense 深度框架
Getting RealSense depth frame in ROS
我在 Gazebo 环境中有一架无人机,上面装有 RealSense d435 摄像头。我的计划是使用YOLO找到一个感兴趣的物体的中心,然后从深度图像中找到那个点的深度。我听说深度相机输出的图像中的深度值是用 RGB 值编码的。在网上进一步查找时,我发现有一个 pyrealsense2 库具有满足我需要的一切功能。
我在网上看到的实现需要您创建一个 pyrealsense.pipeline()
并从中获取您的框架。问题是这似乎只有在您将 RealSense 摄像头连接到您的计算机时才有效。由于我的存在于 Gazebo 环境中,我需要一种在 ROS 回调中获取和使用深度帧的方法。我该怎么做?任何指针将不胜感激
是的,您可以在 ROS 订阅者的帮助下执行此操作,如下所示(大部分代码取自 here):
import rospy
from sensor_msgs.msg import Image as msg_Image
from cv_bridge import CvBridge, CvBridgeError
import sys
import os
class ImageListener:
def __init__(self, topic):
self.topic = topic
self.bridge = CvBridge()
self.sub = rospy.Subscriber(topic, msg_Image, self.imageDepthCallback)
def imageDepthCallback(self, data):
try:
cv_image = self.bridge.imgmsg_to_cv2(data, data.encoding)
pix = (data.width/2, data.height/2)
sys.stdout.write('%s: Depth at center(%d, %d): %f(mm)\r' % (self.topic, pix[0], pix[1], cv_image[pix[1], pix[0]]))
sys.stdout.flush()
except CvBridgeError as e:
print(e)
return
if __name__ == '__main__':
rospy.init_node("depth_image_processor")
topic = '/camera/depth/image_rect_raw' # check the depth image topic in your Gazebo environmemt and replace this with your
listener = ImageListener(topic)
rospy.spin()
注意:要安装 CvBridge,您可以按照以下说明进行操作:
sudo apt-get install ros-(ROS version name)-cv-bridge
sudo apt-get install ros-(ROS version name)-vision-opencv
补充上面的回答,注意depth/image_rect_raw这个话题。很可能你真的想要原始图像,你可以从 /camera/aligned_depth_to_color/image_raw.
获得
默认情况下该主题可能未激活,例如在 d435i 上您应该切换 align_depth:=true 选项:
roslaunch realsense2_camera rs_camera.launch align_depth:=true
有关详细信息,请参阅 https://github.com/IntelRealSense/realsense-ros#usage-instructions。
我在 Gazebo 环境中有一架无人机,上面装有 RealSense d435 摄像头。我的计划是使用YOLO找到一个感兴趣的物体的中心,然后从深度图像中找到那个点的深度。我听说深度相机输出的图像中的深度值是用 RGB 值编码的。在网上进一步查找时,我发现有一个 pyrealsense2 库具有满足我需要的一切功能。
我在网上看到的实现需要您创建一个 pyrealsense.pipeline()
并从中获取您的框架。问题是这似乎只有在您将 RealSense 摄像头连接到您的计算机时才有效。由于我的存在于 Gazebo 环境中,我需要一种在 ROS 回调中获取和使用深度帧的方法。我该怎么做?任何指针将不胜感激
是的,您可以在 ROS 订阅者的帮助下执行此操作,如下所示(大部分代码取自 here):
import rospy
from sensor_msgs.msg import Image as msg_Image
from cv_bridge import CvBridge, CvBridgeError
import sys
import os
class ImageListener:
def __init__(self, topic):
self.topic = topic
self.bridge = CvBridge()
self.sub = rospy.Subscriber(topic, msg_Image, self.imageDepthCallback)
def imageDepthCallback(self, data):
try:
cv_image = self.bridge.imgmsg_to_cv2(data, data.encoding)
pix = (data.width/2, data.height/2)
sys.stdout.write('%s: Depth at center(%d, %d): %f(mm)\r' % (self.topic, pix[0], pix[1], cv_image[pix[1], pix[0]]))
sys.stdout.flush()
except CvBridgeError as e:
print(e)
return
if __name__ == '__main__':
rospy.init_node("depth_image_processor")
topic = '/camera/depth/image_rect_raw' # check the depth image topic in your Gazebo environmemt and replace this with your
listener = ImageListener(topic)
rospy.spin()
注意:要安装 CvBridge,您可以按照以下说明进行操作:
sudo apt-get install ros-(ROS version name)-cv-bridge
sudo apt-get install ros-(ROS version name)-vision-opencv
补充上面的回答,注意depth/image_rect_raw这个话题。很可能你真的想要原始图像,你可以从 /camera/aligned_depth_to_color/image_raw.
获得默认情况下该主题可能未激活,例如在 d435i 上您应该切换 align_depth:=true 选项:
roslaunch realsense2_camera rs_camera.launch align_depth:=true
有关详细信息,请参阅 https://github.com/IntelRealSense/realsense-ros#usage-instructions。