Skip to content

Commit a2b29a1

Browse files
committed
add bbox vis
1 parent 5c7460f commit a2b29a1

2 files changed

Lines changed: 87 additions & 28 deletions

File tree

GEMstack/onboard/perception/fusion.py

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from cv_bridge import CvBridge
22
from sensor_msgs.msg import Image, PointCloud2
3+
from visualization_msgs.msg import MarkerArray
34
from ultralytics import YOLO
45
from fusion_utils import *
56
import rospy
@@ -38,7 +39,7 @@ def __init__(self):
3839
# Publishers
3940
self.pub_pedestrians_pc2 = rospy.Publisher("/point_cloud/pedestrians", PointCloud2, queue_size=10)
4041
self.pub_centroids_pc2 = rospy.Publisher("/point_cloud/centroids", PointCloud2, queue_size=10)
41-
self.pub_bbox_corners_pc2 = rospy.Publisher("/point_cloud/bbox_corners", PointCloud2, queue_size=10)
42+
self.pub_bboxes_markers = rospy.Publisher("/markers/bboxes", MarkerArray, queue_size=10)
4243
if(self.visualization):
4344
self.pub_image = rospy.Publisher("/camera/image_detection", Image, queue_size=1)
4445

@@ -67,7 +68,6 @@ def fusion_callback(self, rgb_image_msg: Image, lidar_pc2_msg: PointCloud2):
6768
# Unpacking box dimentions detected into x,y,w,h
6869
pedestrians_3d_centroids = []
6970
pedestrians_3d_dims = []
70-
pedestrians_3d_bbox_corners = []
7171
flattened_pedestrians_2d_pts = []
7272
flattened_pedestrians_3d_pts = []
7373

@@ -114,39 +114,36 @@ def fusion_callback(self, rgb_image_msg: Image, lidar_pc2_msg: PointCloud2):
114114
dims = calculate_dimensions(extracted_3d_pts)
115115
if dims != None:
116116
pedestrians_3d_dims.append(dims)
117-
118-
# Calculate bbox corners for visualization
119-
corners = calculate_bbox_corners_3d(centroid, dims)
120-
if corners != None:
121-
pedestrians_3d_bbox_corners = pedestrians_3d_bbox_corners + corners
122117

123118
# Used for visualization
124119
if(self.visualization):
125120
cv_image = vis_2d_bbox(cv_image, xywh, box)
126-
127-
if len(flattened_pedestrians_3d_pts) > 0:
128-
# Draw projected 2D LiDAR points on the image.
129-
for pt in flattened_pedestrians_2d_pts:
130-
cv2.circle(cv_image, pt, 2, (0, 0, 255), -1)
131-
132-
# Create point cloud from extracted 3D points
133-
ros_extracted_pedestrian_pc2 = create_point_cloud(flattened_pedestrians_3d_pts)
134-
self.pub_pedestrians_pc2.publish(ros_extracted_pedestrian_pc2)
135-
136-
if len(pedestrians_3d_centroids) > 0:
137-
# Create point cloud from pedestrain centroid
138-
ros_pedestrians_centroids_pc2 = create_point_cloud(pedestrians_3d_centroids, color=(255, 0, 255))
139-
self.pub_centroids_pc2.publish(ros_pedestrians_centroids_pc2)
140-
141-
if len(pedestrians_3d_bbox_corners) > 0:
142-
# Create point cloud from pedestrain centroid
143-
ros_pedestrians_bbox_corners_pc2 = create_point_cloud(pedestrians_3d_bbox_corners, color=(0, 0, 255))
144-
self.pub_bbox_corners_pc2.publish(ros_pedestrians_bbox_corners_pc2)
145121

146122
# Used for visualization
147123
if(self.visualization):
124+
if len(flattened_pedestrians_3d_pts) > 0:
125+
# Draw projected 2D LiDAR points on the image.
126+
for pt in flattened_pedestrians_2d_pts:
127+
cv2.circle(cv_image, pt, 2, (0, 0, 255), -1)
128+
129+
# Create point cloud from extracted 3D points
130+
ros_extracted_pedestrian_pc2 = create_point_cloud(flattened_pedestrians_3d_pts)
131+
self.pub_pedestrians_pc2.publish(ros_extracted_pedestrian_pc2)
132+
133+
if len(pedestrians_3d_centroids) > 0 and len(pedestrians_3d_dims) > 0:
134+
# Create point cloud from pedestrain centroid
135+
ros_pedestrians_centroids_pc2 = create_point_cloud(pedestrians_3d_centroids, color=(255, 0, 255))
136+
self.pub_centroids_pc2.publish(ros_pedestrians_centroids_pc2)
137+
138+
# Create bbox marker from pedestrain dimensions
139+
ros_delete_bboxes_markers = delete_bbox_marker()
140+
self.pub_bboxes_markers.publish(ros_delete_bboxes_markers)
141+
ros_pedestrians_bboxes_markers = create_bbox_marker(pedestrians_3d_centroids, pedestrians_3d_dims)
142+
self.pub_bboxes_markers.publish(ros_pedestrians_bboxes_markers)
143+
144+
# Convert cv2 image to imgmsg
148145
ros_img = self.bridge.cv2_to_imgmsg(cv_image, 'bgr8')
149-
self.pub_image.publish(ros_img)
146+
self.pub_image.publish(ros_img)
150147

151148

152149

GEMstack/onboard/perception/fusion_utils.py

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from sensor_msgs.msg import PointCloud2, PointField
2+
from visualization_msgs.msg import Marker, MarkerArray
23
import numpy as np
34
import sensor_msgs.point_cloud2 as pc2
45
import open3d as o3d
@@ -242,4 +243,65 @@ def create_point_cloud(points, color=(255, 0, 0)):
242243

243244
point_cloud_data = [(x, y, z, packed_color) for x, y, z in points]
244245

245-
return pc2.create_cloud(header, fields, point_cloud_data)
246+
return pc2.create_cloud(header, fields, point_cloud_data)
247+
248+
249+
def create_bbox_marker(centroids, dimensions):
250+
"""
251+
Create 3D bbox markers from centroids and dimensions
252+
"""
253+
marker_array = MarkerArray()
254+
255+
for i, (centroid, dimension) in enumerate(zip(centroids, dimensions)):
256+
# Skip if no centroid or dimension
257+
if (centroid == None) or (dimension == None):
258+
continue
259+
260+
marker = Marker()
261+
marker.header.frame_id = "map" # Reference frame
262+
marker.header.stamp = rospy.Time.now()
263+
marker.ns = "bounding_boxes"
264+
marker.id = i # Unique ID for each marker
265+
marker.type = Marker.CUBE # Cube for bounding box
266+
marker.action = Marker.ADD
267+
268+
# Position (center of the bounding box)
269+
marker.pose.position.x = centroid[0]
270+
marker.pose.position.y = centroid[1]
271+
marker.pose.position.z = centroid[2]
272+
273+
# Orientation (default, no rotation)
274+
marker.pose.orientation.x = 0.0
275+
marker.pose.orientation.y = 0.0
276+
marker.pose.orientation.z = 0.0
277+
marker.pose.orientation.w = 1.0
278+
279+
# Bounding box dimensions
280+
marker.scale.x = dimension[0]
281+
marker.scale.y = dimension[1]
282+
marker.scale.z = dimension[2]
283+
284+
# Random colors for each bounding box
285+
marker.color.r = 0.0 # Varying colors
286+
marker.color.g = 1.0
287+
marker.color.b = 1.5
288+
marker.color.a = 0.2 # Transparency
289+
290+
marker.lifetime = rospy.Duration() # Persistent
291+
marker_array.markers.append(marker)
292+
return marker_array
293+
294+
295+
def delete_bbox_marker():
296+
"""
297+
Delete 3D bbox markers given ID ranges
298+
"""
299+
marker_array = MarkerArray()
300+
for i in range(6):
301+
marker = Marker()
302+
marker.ns = "bounding_boxes"
303+
marker.id = i
304+
marker.action = Marker.DELETE
305+
marker_array.markers.append(marker)
306+
return marker_array
307+

0 commit comments

Comments
 (0)