@@ -51,14 +51,20 @@ def filterNormals(mesh, direction, angle):
51
51
mesh .remove_triangles_by_mask (dot_prods < np .cos (angle ))
52
52
return mesh
53
53
54
- def to_cloud_msg (frame , points , logger , colors = None , intensities = None , normals = None ):
54
+ def to_cloud_msg (frame , pointcloud : o3d .geometry .PointCloud , logger = None ):
55
+ points = np .asarray (pointcloud .points )
56
+ colors = np .asarray (pointcloud .colors )
57
+ normals = np .asarray (pointcloud .normals )
58
+
55
59
msg = PointCloud2 ()
56
60
msg .header .frame_id = frame
57
61
msg .height = 1
58
62
msg .width = points .shape [0 ]
59
63
msg .is_bigendian = False
60
64
msg .is_dense = False
61
65
data = points
66
+ msg .point_step = 0
67
+ msg .fields = []
62
68
63
69
def addField (name ):
64
70
nonlocal msg
@@ -79,11 +85,7 @@ def addField(name):
79
85
colors = np .array ([int_to_float_rbg (tuple_to_int_rgb (c )) for c in colors ], dtype = np .float32 )
80
86
data = np .hstack ([data , colors ])
81
87
82
- elif intensities is not None :
83
- addField ("intensity" )
84
- data = np .hstack ([data , intensities ])
85
-
86
- elif normals is not None :
88
+ if normals is not None :
87
89
addField ("normal_x" )
88
90
addField ("normal_y" )
89
91
addField ("normal_z" )
@@ -415,7 +417,6 @@ def cameraCallback(self, depth_image_msg, rgb_image_msg):
415
417
416
418
def reconstructCallback (self ):
417
419
if (self .frame_count <= 30 or len (self .sensor_data ) == 0 ): return # TODO: Evaluate necessity of this line
418
- self .get_logger ().info ("Starting integration" )
419
420
420
421
depth_img , rgb_img , gm_tf_stamped = self .sensor_data .popleft ()
421
422
rgb_t , rgb_r = transformStampedToVectors (gm_tf_stamped )
@@ -445,21 +446,17 @@ def reconstructCallback(self):
445
446
)
446
447
447
448
self .tsdf_volume .integrate (rgbd , self .intrinsics , np .linalg .inv (rgb_pose )) # TODO: See lookupTransform line
448
- self .get_logger ().info ("Integration complete" )
449
449
self .integration_done = True
450
450
self .processed_frame_count += 1
451
451
if self .processed_frame_count % 50 == 0 and self .record :
452
452
self .get_logger ().info ("Extracting pointcloud for visualization" )
453
453
cloud = self .tsdf_volume .extract_point_cloud ()
454
- if cloud .is_empty ():
455
- self .get_logger ().warn ("It was, indeed, empty" )
456
454
try :
457
- ros_cloud = to_cloud_msg (frame = self .relative_frame , points = np .asarray (cloud .points ), logger = self .get_logger (), colors = np .asarray (cloud .colors ))
455
+ ros_cloud = to_cloud_msg (frame = self .relative_frame , pointcloud = cloud , logger = self .get_logger ())
456
+ ros_cloud .header .stamp = self .get_clock ().now ().to_msg ()
457
+ self .cloud_pub .publish (ros_cloud )
458
458
except Exception as E :
459
459
self .get_logger ().warn (f"Error creating cloud: { E } " )
460
- self .get_logger ().info ("Made the cloud" )
461
- ros_cloud .header .stamp = self .get_clock ().now ().to_msg ()
462
- self .cloud_pub .publish (ros_cloud )
463
460
except Exception as e :
464
461
self .get_logger ().error (f"Error processing images into tsdf: { e } " )
465
462
self .integration_done = True
0 commit comments