Skip to content

Commit abd56d3

Browse files
committed
fix(controller): preserve UUID for static objects after occlusion (#1152)
1 parent fcc34e1 commit abd56d3

File tree

4 files changed

+36
-3
lines changed

4 files changed

+36
-3
lines changed

controller/src/controller/ilabs_tracking.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,12 @@ def from_tracked_object(self, tracked_object, objects):
129129
sscape_object.inferRotationFromVelocity()
130130
break
131131
if not found:
132-
sscape_object.setGID(uuid)
132+
# Check if UUID manager already has a mapping for this rv_id
133+
existing_gid = self.uuid_manager.active_ids.get(sscape_object.rv_id, [None])[0]
134+
if existing_gid is None:
135+
sscape_object.setGID(uuid)
136+
else:
137+
sscape_object.setGID(existing_gid)
133138

134139
self.uuid_manager.assignID(sscape_object)
135140

@@ -176,8 +181,12 @@ def trackCategory(self, objects, when, already_tracked_objects):
176181
"""Create reliable tracks for objects detected and tracks detected"""
177182
when = datetime.fromtimestamp(when)
178183
self.update_tracks(objects, when)
184+
# Include ALL active C++ tracks to preserve UUID mappings
185+
all_active_tracks = (self.tracker.get_reliable_tracks() +
186+
self.tracker.get_unreliable_tracks() +
187+
self.tracker.get_suspended_tracks())
179188
tracked_objects = self.tracker.get_reliable_tracks()
180-
self.uuid_manager.pruneInactiveTracks(tracked_objects)
189+
self.uuid_manager.pruneInactiveTracks(all_active_tracks)
181190
tracks_from_detections = [self.from_tracked_object(tracked_object, objects)
182191
for tracked_object in tracked_objects]
183192

@@ -190,8 +199,12 @@ def trackCategoryBatched(self, objects_per_camera, when, already_tracked_objects
190199
"""Create reliable tracks for objects from multiple cameras using batched tracking"""
191200
when = datetime.fromtimestamp(when)
192201
self.update_tracks_batched(objects_per_camera, when)
202+
# Include ALL active C++ tracks to preserve UUID mappings
203+
all_active_tracks = (self.tracker.get_reliable_tracks() +
204+
self.tracker.get_unreliable_tracks() +
205+
self.tracker.get_suspended_tracks())
193206
tracked_objects = self.tracker.get_reliable_tracks()
194-
self.uuid_manager.pruneInactiveTracks(tracked_objects)
207+
self.uuid_manager.pruneInactiveTracks(all_active_tracks)
195208

196209
# Flatten all objects for from_tracked_object lookup
197210
all_objects = [obj for camera_objects in objects_per_camera for obj in camera_objects]

controller/src/controller/uuid_manager.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,10 @@ def assignID(self, sscape_object):
285285
self.active_ids.setdefault(sscape_object.rv_id, [None, None])
286286
self.gatherQualityVisualFeatures(sscape_object)
287287
self.pickBestID(sscape_object)
288+
# Store the assigned UUID in active_ids
289+
with self.active_ids_lock:
290+
if self.active_ids.get(sscape_object.rv_id, [None])[0] is None:
291+
self.active_ids[sscape_object.rv_id] = [sscape_object.gid, None]
288292
if self.haveSufficientVisualFeatures(sscape_object) and self.reid_enabled:
289293
# Only do the query for similarity if it hasn't been run before
290294
if sscape_object.rv_id not in self.active_query:

controller/src/robot_vision/include/rv/tracking/MultipleObjectTracker.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,16 @@ class MultipleObjectTracker
8282
return mTrackManager.getReliableTracks();
8383
}
8484

85+
inline std::vector<TrackedObject> getSuspendedTracks()
86+
{
87+
return mTrackManager.getSuspendedTracks();
88+
}
89+
90+
inline std::vector<TrackedObject> getUnreliableTracks()
91+
{
92+
return mTrackManager.getUnreliableTracks();
93+
}
94+
8595
/**
8696
* @brief Returns a the list of all active tracked objects
8797
*

controller/src/robot_vision/python/src/robot_vision/extensions/tracking.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,12 @@ py::class_<rv::tracking::Classification>(tracking, "Classification", "Classifica
325325
.def("get_reliable_tracks",
326326
&rv::tracking::MultipleObjectTracker::getReliableTracks,
327327
"Returns a list of all active reliable tracks.")
328+
.def("get_suspended_tracks",
329+
&rv::tracking::MultipleObjectTracker::getSuspendedTracks,
330+
"Returns a list of all suspended tracks.")
331+
.def("get_unreliable_tracks",
332+
&rv::tracking::MultipleObjectTracker::getUnreliableTracks,
333+
"Returns a list of all active unreliable tracks.")
328334
.def("update_tracker_params",
329335
&rv::tracking::MultipleObjectTracker::updateTrackerParams,
330336
"Updates tracker frame based parameters.");

0 commit comments

Comments
 (0)