fix(controller): preserve UUID for static objects after occlusion (#1152)#1155
Open
COZYTRICKSTER wants to merge 1 commit intoopen-edge-platform:release-2025.2from
Open
Conversation
tdorauintc
reviewed
Mar 12, 2026
Contributor
tdorauintc
left a comment
There was a problem hiding this comment.
@saratpoluri please review this change, it may impact ReID functionality.
Contributor
There was a problem hiding this comment.
Pull request overview
This PR fixes object identity continuity in the controller by preserving UUID/GID mappings for static objects across short occlusions, leveraging suspended/unreliable tracks from the underlying C++ tracker.
Changes:
- Expose suspended and unreliable track lists from
MultipleObjectTrackerto Python bindings. - Update controller tracking flow to prune UUID mappings based on all active/suspended C++ tracks (not only reliable ones).
- Attempt to reuse an existing GID mapping for a reactivated
rv_idinstead of assigning a new UUID.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 7 comments.
| File | Description |
|---|---|
controller/src/robot_vision/python/src/robot_vision/extensions/tracking.cpp |
Adds Python bindings for MultipleObjectTracker.get_suspended_tracks() and .get_unreliable_tracks(). |
controller/src/robot_vision/include/rv/tracking/MultipleObjectTracker.hpp |
Adds corresponding C++ accessors forwarding to TrackManager. |
controller/src/controller/uuid_manager.py |
Stores an assigned UUID/GID into active_ids for new tracker IDs (intended to preserve identity). |
controller/src/controller/ilabs_tracking.py |
Uses existing UUID/GID mapping for reactivated tracks and prunes mappings using reliable+unreliable+suspended track sets. |
Comment on lines
+202
to
+207
| # Include ALL active C++ tracks to preserve UUID mappings | ||
| all_active_tracks = (self.tracker.get_reliable_tracks() + | ||
| self.tracker.get_unreliable_tracks() + | ||
| self.tracker.get_suspended_tracks()) | ||
| tracked_objects = self.tracker.get_reliable_tracks() | ||
| self.uuid_manager.pruneInactiveTracks(tracked_objects) | ||
| self.uuid_manager.pruneInactiveTracks(all_active_tracks) |
Comment on lines
+288
to
+291
| # Store the assigned UUID in active_ids | ||
| with self.active_ids_lock: | ||
| if self.active_ids.get(sscape_object.rv_id, [None])[0] is None: | ||
| self.active_ids[sscape_object.rv_id] = [sscape_object.gid, None] |
Comment on lines
+132
to
+137
| # Check if UUID manager already has a mapping for this rv_id | ||
| existing_gid = self.uuid_manager.active_ids.get(sscape_object.rv_id, [None])[0] | ||
| if existing_gid is None: | ||
| sscape_object.setGID(uuid) | ||
| else: | ||
| sscape_object.setGID(existing_gid) |
Comment on lines
+135
to
+137
| sscape_object.setGID(uuid) | ||
| else: | ||
| sscape_object.setGID(existing_gid) |
Comment on lines
+184
to
188
| # Include ALL active C++ tracks to preserve UUID mappings | ||
| all_active_tracks = (self.tracker.get_reliable_tracks() + | ||
| self.tracker.get_unreliable_tracks() + | ||
| self.tracker.get_suspended_tracks()) | ||
| tracked_objects = self.tracker.get_reliable_tracks() |
Comment on lines
+184
to
+189
| # Include ALL active C++ tracks to preserve UUID mappings | ||
| all_active_tracks = (self.tracker.get_reliable_tracks() + | ||
| self.tracker.get_unreliable_tracks() + | ||
| self.tracker.get_suspended_tracks()) | ||
| tracked_objects = self.tracker.get_reliable_tracks() | ||
| self.uuid_manager.pruneInactiveTracks(tracked_objects) | ||
| self.uuid_manager.pruneInactiveTracks(all_active_tracks) |
Comment on lines
+202
to
206
| # Include ALL active C++ tracks to preserve UUID mappings | ||
| all_active_tracks = (self.tracker.get_reliable_tracks() + | ||
| self.tracker.get_unreliable_tracks() + | ||
| self.tracker.get_suspended_tracks()) | ||
| tracked_objects = self.tracker.get_reliable_tracks() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
📝 Description
When a static object becomes temporarily occluded and later reappears in the scene, the controller assigns a new UUID instead of preserving the original one. This breaks object identity continuity for static objects across short occlusions.
This change updates the controller logic to ensure that static objects retain their original UUID when reactivated from suspended tracks.
Fixes #1152
🔍 Behavior Before / After
Before
After
✨ Type of Change
🧪 Testing Scenarios
Tested locally by simulating occlusion scenarios where static objects temporarily disappear and later reappear. Verified that the original UUID is preserved when the object is reactivated.
✅ Checklist