Source code for morse.middleware.ros.depth_camera
import logging; logger = logging.getLogger("morse." + __name__)
from sensor_msgs.msg import PointCloud2, PointField
from morse.middleware.ros import ROSPublisherTF
[docs]class DepthCameraPublisher(ROSPublisherTF):
""" Publish the depth field from the Camera perspective as XYZ point-cloud.
And send the transformation between the camera and the robot through TF.
"""
ros_class = PointCloud2
[docs] def default(self, ci='unused'):
if not self.component_instance.capturing:
return # press [Space] key to enable capturing
# This message holds a collection of N-dimensional points, which may
# contain additional information such as normals, intensity, etc. The
# point data is stored as a binary blob, its layout described by the
# contents of the "fields" array.
# The point cloud data may be organized 2d (image-like) or 1d
# (unordered). Point clouds organized as 2d images may be produced by
# camera depth sensors such as stereo or time-of-flight.
pc2 = PointCloud2()
# Time of sensor data acquisition, and the coordinate frame ID (for 3d
# points).
pc2.header = self.get_ros_header()
# 2D structure of the point cloud. If the cloud is unordered, height is
# 1 and width is the length of the point cloud.
pc2.height = 1
pc2.width = self.data['nb_points']
# Describes the channels and their layout in the binary data blob.
pc2.fields = [PointField('x', 0, PointField.FLOAT32, 1),
PointField('y', 4, PointField.FLOAT32, 1),
PointField('z', 8, PointField.FLOAT32, 1)]
pc2.is_dense = True # True if there are no invalid points
pc2.is_bigendian = False # Is this data bigendian?
pc2.point_step = 12 # Length of a point in bytes
pc2.row_step = len(self.data['points']) # Length of a row in bytes
# Actual point data, size is (row_step*height)
# memoryview from PyMemoryView_FromMemory() implements the buffer interface
pc2.data = bytes(self.data['points'])
self.publish_with_robot_transform(pc2)