Skip to content

Commit a8e268e

Browse files
author
Aadarsh
committed
adding better perception
1 parent cb4e597 commit a8e268e

6 files changed

Lines changed: 230 additions & 57 deletions

File tree

GEMstack/onboard/perception/cone_detection.py

Lines changed: 65 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -472,9 +472,12 @@ def save_sensor_data(self, vehicle: VehicleState, latest_image) -> None:
472472

473473
class FakConeDetector(Component):
474474
def __init__(self, vehicle_interface: GEMInterface):
475+
"""
476+
Initializes the FakeConeDetector with two parking spots:
477+
- One standard 2x2 rectangular spot
478+
- One wider mouth for easier entry
479+
"""
475480
self.vehicle_interface = vehicle_interface
476-
self.times = [(5.0, 20.0), (30.0, 35.0)]
477-
self.t_start = None
478481

479482
def rate(self):
480483
return 4.0
@@ -486,24 +489,70 @@ def state_outputs(self):
486489
return ['obstacles']
487490

488491
def update(self, vehicle: VehicleState) -> Dict[str, Obstacle]:
489-
if self.t_start is None:
490-
self.t_start = self.vehicle_interface.time()
491-
t = self.vehicle_interface.time() - self.t_start
492+
"""
493+
Called every simulation step, updates the timestamp and publishes the obstacle states.
494+
"""
495+
496+
current_time = self.vehicle_interface.time()
497+
498+
# === Standard Parking Spot ===
499+
# cones_standard = {
500+
# 'cone0': (5.0, 5.0, 0.5, 0.5), # Front Left
501+
# 'cone1': (5.0, 7.0, 0.5, 0.5), # Back Left
502+
# 'cone2': (7.0, 5.0, 0.5, 0.5), # Front Right
503+
# 'cone3': (7.0, 7.0, 0.5, 0.5) # Back Right
504+
# }
505+
506+
# === Wider Mouth Parking Spot ===
507+
cones_wide = {
508+
'cone4': (6.0, 9.0, 0.5, 0.5), # Front Left (wide)
509+
'cone5': (10.0, 9.0, 0.5, 0.5), # Back Left
510+
'cone6': (3.0, 4.0, 0.5, 0.5), # Front Right (wide)
511+
'cone7': (7.0, 4.0, 0.5, 0.5) # Back Right
512+
}
513+
514+
# Populate the obstacle states
492515
res = {}
493-
for time_range in self.times:
494-
if t >= time_range[0] and t <= time_range[1]:
495-
res['cone0'] = box_to_fake_obstacle((0, 0, 0, 0))
496-
rospy.loginfo("Detected a Cone (simulated)")
497-
return res
516+
for name, box in {**cones_wide}.items():
517+
res[name] = box_to_fake_obstacle(box, current_time)
498518

519+
# Update timestamp
520+
for obstacle in res.values():
521+
obstacle.pose.t = current_time
499522

500-
def box_to_fake_obstacle(box):
523+
rospy.loginfo(f"[FakeConeDetector] Simulated Two Parking Spots Detected")
524+
return res
525+
526+
def box_to_fake_obstacle(box, current_time):
527+
"""
528+
Helper function to create a fake obstacle (cone) from bounding box coordinates.
529+
"""
501530
x, y, w, h = box
502-
pose = ObjectPose(t=0, x=x + w / 2, y=y + h / 2, z=0, yaw=0, pitch=0, roll=0, frame=ObjectFrameEnum.CURRENT)
503-
dims = (w, h, 0)
504-
return Obstacle(pose=pose, dimensions=dims, outline=None,
505-
material=ObstacleMaterialEnum.TRAFFIC_CONE, state=ObstacleStateEnum.STANDING, collidable=True)
531+
pose = ObjectPose(
532+
t=current_time,
533+
x=x,
534+
y=y,
535+
z=0.0,
536+
yaw=0.0,
537+
pitch=0.0,
538+
roll=0.0,
539+
frame=ObjectFrameEnum.START
540+
)
541+
542+
dims = (w, h, 1.0)
543+
544+
new_obstacle = Obstacle(
545+
pose=pose,
546+
dimensions=dims,
547+
outline=None,
548+
material=ObstacleMaterialEnum.TRAFFIC_CONE,
549+
collidable=True,
550+
state=ObstacleStateEnum.STANDING
551+
)
552+
print("Obstacles made")
553+
return new_obstacle
554+
506555

507556

508557
if __name__ == '__main__':
509-
pass
558+
pass

GEMstack/onboard/perception/parking_detection.py

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def __init__(
2525
self.cone_pts_3D = []
2626
self.ordered_cone_ground_centers_2D = []
2727
self.goal_parking_spot = None
28+
self.best_parking_spot = None
2829
self.parking_obstacles_pose = []
2930
self.parking_obstacles_dim = []
3031
self.ground_threshold = GROUND_THRESHOLD
@@ -48,6 +49,7 @@ def __init__(
4849
self.pub_vehicle_marker = rospy.Publisher("vehicle/marker", MarkerArray, queue_size=10)
4950
self.pub_cones_centers_pc2 = rospy.Publisher("cones_detection/centers/point_cloud", PointCloud2, queue_size=10)
5051
self.pub_parking_spot_marker = rospy.Publisher("parking_spot_detection/marker", MarkerArray, queue_size=10)
52+
self.pub_parking_goal_marker = rospy.Publisher("parking_spot_detection/goal/marker", MarkerArray, queue_size=10)
5153
self.pub_polygon_marker = rospy.Publisher("polygon_detection/marker", MarkerArray, queue_size=10)
5254
self.pub_obstacles_marker = rospy.Publisher("obstacle_detection/marker", MarkerArray, queue_size=10)
5355

@@ -61,6 +63,7 @@ def callback(self, top_lidar_msg):
6163
self.cone_pts_3D,
6264
self.ordered_cone_ground_centers_2D,
6365
self.goal_parking_spot,
66+
self.best_parking_spot,
6467
self.parking_obstacles_pose,
6568
self.parking_obstacles_dim,
6669
lidar_ouster_frame
@@ -82,14 +85,15 @@ def state_outputs(self) -> list:
8285
def visualize(self,
8386
cone_pts_3D,
8487
ordered_cone_ground_centers_2D,
85-
goal_parking_spot,
88+
parking_goal,
89+
best_parking_spot,
8690
parking_obstacles_pose,
8791
parking_obstacles_dim,
8892
lidar_ouster_frame):
8993
# Transform top lidar pointclouds to vehicle frame for visualization
9094
latest_lidar_vehicle = transform_points(lidar_ouster_frame, self.T_l2v)
9195
latest_lidar_vehicle = filter_ground_points(latest_lidar_vehicle, self.ground_threshold)
92-
ros_lidar_top_vehicle_pc2 = create_point_cloud(latest_lidar_vehicle, LIDAR_PC_COLOR, VEHICLE_FRAME)
96+
ros_lidar_top_vehicle_pc2 = create_point_cloud(latest_lidar_vehicle, (255, 0, 0), "vehicle")
9397
self.pub_lidar_top_vehicle_pc2.publish(ros_lidar_top_vehicle_pc2)
9498

9599
# Create vehicle marker
@@ -100,66 +104,76 @@ def visualize(self,
100104
self.pub_vehicle_marker.publish(ros_vehicle_marker)
101105

102106
# Delete previous markers
103-
ros_delete_polygon_marker = delete_markers("polygon", MAX_POLYGON_MARKERS)
107+
ros_delete_polygon_marker = delete_markers("polygon", 1)
104108
self.pub_polygon_marker.publish(ros_delete_polygon_marker)
105-
ros_delete_parking_spot_markers = delete_markers("parking_spot", MAX_PARKING_SPOT_MARKERS)
109+
ros_delete_parking_spot_markers = delete_markers("parking_spot", 1)
106110
self.pub_parking_spot_marker.publish(ros_delete_parking_spot_markers)
107-
ros_delete_obstacles_markers = delete_markers("obstacles", MAX_OBSTACLE_MARKERS)
111+
ros_delete_parking_goal_markers = delete_markers("parking_goal", 1)
112+
self.pub_parking_goal_marker.publish(ros_delete_parking_goal_markers)
113+
ros_delete_obstacles_markers = delete_markers("obstacles", 5)
108114
self.pub_obstacles_marker.publish(ros_delete_obstacles_markers)
109115

110116
# Draw polygon first
111117
if len(ordered_cone_ground_centers_2D) > 0:
112-
ros_polygon_marker = create_polygon_marker(ordered_cone_ground_centers_2D, ref_frame=VEHICLE_FRAME)
118+
ros_polygon_marker = create_polygon_marker(ordered_cone_ground_centers_2D, ref_frame="vehicle")
113119
self.pub_polygon_marker.publish(ros_polygon_marker)
114120

115121
# Create parking spot marker
116-
if goal_parking_spot:
117-
ros_parking_spot_marker = create_parking_spot_marker(goal_parking_spot, ref_frame=VEHICLE_FRAME)
122+
if best_parking_spot:
123+
ros_parking_spot_marker = create_parking_spot_marker(best_parking_spot, ref_frame="vehicle")
118124
self.pub_parking_spot_marker.publish(ros_parking_spot_marker)
119125

126+
# Create parking goal marker
127+
if parking_goal:
128+
ros_parking_goal_marker = create_parking_goal_marker(x = parking_goal[0],
129+
y = parking_goal[1],
130+
ref_frame="vehicle")
131+
self.pub_parking_goal_marker.publish(ros_parking_goal_marker)
132+
120133
# Create parking obstacles marker
121134
if parking_obstacles_pose and parking_obstacles_dim:
122135
ros_obstacles_marker = create_markers(parking_obstacles_pose,
123136
parking_obstacles_dim,
124-
OBSTACLE_MARKER_COLOR,
125-
"obstacles", VEHICLE_FRAME)
137+
(1.0, 0.0, 0.0, 0.4),
138+
"obstacles", "vehicle")
126139
self.pub_obstacles_marker.publish(ros_obstacles_marker)
127140

128141
# Draw 3D cone centers
129142
if len(cone_pts_3D) > 0:
130143
cone_ground_centers = np.array(cone_pts_3D)
131144
cone_ground_centers[:, 2] = 0.0
132145
cone_ground_centers = [tuple(point) for point in cone_ground_centers]
133-
ros_cones_centers_pc2 = create_point_cloud(cone_ground_centers, color=CONE_CENTER_PC_COLOR)
146+
ros_cones_centers_pc2 = create_point_cloud(cone_ground_centers, color=(255, 0, 255))
134147
self.pub_cones_centers_pc2.publish(ros_cones_centers_pc2)
135148

136149

137-
def update(self, cone_obstacles: Dict[str, Obstacle]):
150+
def update(self, agents: Dict[str, Obstacle]):
138151
# Initial variables
139-
goal_parking_spot = None
152+
parking_goal = None
153+
best_parking_spot = None
140154
parking_obstacles_pose = []
141155
parking_obstacles_dim = []
142156
ordered_cone_ground_centers_2D = []
143157

144158
# Populate cone points
145159
cone_pts_3D = []
146-
for cone in cone_obstacles.values():
160+
for cone in agents.values():
147161
cone_pt_3D = (cone.pose.x, cone.pose.y, 0.0)
148162
cone_pts_3D.append(cone_pt_3D)
149163

150164
# Detect parking spot
151-
if len(cone_pts_3D) == NUM_CONES_PER_PARKING_SPOT:
152-
goal_parking_spot, parking_obstacles_pose, parking_obstacles_dim, ordered_cone_ground_centers_2D = detect_parking_spot(cone_pts_3D)
153-
165+
if len(cone_pts_3D) >= 4:
166+
parking_goal, best_parking_spot, parking_obstacles_pose, parking_obstacles_dim, ordered_cone_ground_centers_2D = detect_parking_spot(cone_pts_3D)
154167
# Update local variables for visualization
155168
self.cone_pts_3D = cone_pts_3D
156169
self.ordered_cone_ground_centers_2D = ordered_cone_ground_centers_2D
157-
self.goal_parking_spot = goal_parking_spot
170+
self.parking_goal = parking_goal
171+
self.best_parking_spot = best_parking_spot
158172
self.parking_obstacles_pose = parking_obstacles_pose
159173
self.parking_obstacles_dim = parking_obstacles_dim
160174

161175
# Return if no goal parking spot is found
162-
if not goal_parking_spot:
176+
if not parking_goal:
163177
return None
164178

165179
# Constructing parking obstacles
@@ -183,13 +197,15 @@ def update(self, cone_obstacles: Dict[str, Obstacle]):
183197
dimensions=o_dim,
184198
outline=None,
185199
material=ObstacleMaterialEnum.BARRIER,
186-
collidable=True, state=ObstacleStateEnum.STANDING
200+
collidable=True,
201+
state=ObstacleStateEnum.STANDING,
187202
)
188203
parking_obstacles[f"parking_obstacle_{obstacle_id}"] = new_obstacle
189204
obstacle_id += 1
190205

191206
# Constructing goal pose
192-
x, y, yaw = goal_parking_spot
207+
print(f"-----GOAL: {parking_goal}")
208+
x, y, yaw = parking_goal
193209
goal_pose = ObjectPose(
194210
t=current_time,
195211
x=x,

0 commit comments

Comments
 (0)