Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 24 additions & 6 deletions Vision/Tracking/RobotMerger.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Numerics;
using Tyr.Common.Config;
using Tyr.Common.Data;
using Tyr.Common.Data.Ssl;
using Tyr.Common.Math;
using Tyr.Common.Vision.Data;
Expand All @@ -13,17 +14,34 @@ public partial class RobotMerger
"Factor to weight stdDeviation during tracker merging, reasonable range: 1.0 - 2.0. High values lead to more jitter")]
private static float MergePower { get; set; } = 1.5f;

// Bolt: eliminates ~150 allocs/sec (SelectMany, GroupBy, ToDictionary, and inner lists) at 100Hz
private readonly Dictionary<RobotId, List<RobotTracker>> _trackersById = new(CommonConfigs.MaxRobots * 2);

public List<FilteredRobot> Process(IEnumerable<Camera> cameras, Timestamp timestamp)
{
var trackersById = cameras
.SelectMany(camera => camera.Robots.Values)
.GroupBy(robot => robot.Id)
.ToDictionary(grouping => grouping.Key, grouping => grouping.ToList());
foreach (var list in _trackersById.Values)
{
list.Clear();
}

foreach (var camera in cameras)
{
foreach (var tracker in camera.Robots.Values)
{
if (!_trackersById.TryGetValue(tracker.Id, out var list))
{
list = new List<RobotTracker>(4);
_trackersById[tracker.Id] = list;
}
list.Add(tracker);
}
}

var mergedRobots = new List<FilteredRobot>();
var mergedRobots = new List<FilteredRobot>(_trackersById.Count);

foreach (var (id, trackers) in trackersById)
foreach (var (id, trackers) in _trackersById)
{
if (trackers.Count == 0) continue;
mergedRobots.Add(Merge(id, trackers, timestamp));
}

Expand Down
Loading