4
4
import edu .wpi .first .math .geometry .Pose3d ;
5
5
import frc .robot .constants .Constants ;
6
6
import frc .robot .subsystems .vision .cameras .TitanCamera ;
7
+ import frc .robot .subsystems .vision .result .NoteTrackingResult ;
7
8
import frc .robot .utils .closeables .ToClose ;
8
9
import org .littletonrobotics .junction .Logger ;
9
10
import org .photonvision .EstimatedRobotPose ;
15
16
import java .util .Map ;
16
17
17
18
public class ReplayVisionRunner implements PhotonVisionRunner {
18
- public static class VisionIOApriltagsReplay implements VisionIO {
19
+ public static class VisionIOReplay implements VisionIO {
19
20
private final TitanCamera titanCamera ;
20
21
private final PhotonCamera photonCamera ;
21
22
22
- public VisionIOApriltagsReplay (final TitanCamera titanCamera ) {
23
+ public VisionIOReplay (final TitanCamera titanCamera ) {
23
24
this .titanCamera = titanCamera ;
24
25
this .photonCamera = titanCamera .getPhotonCamera ();
25
26
}
26
27
}
27
28
28
- private final Map <ReplayVisionRunner .VisionIOApriltagsReplay , String > visionIONames ;
29
- private final Map <ReplayVisionRunner .VisionIOApriltagsReplay , VisionIO .VisionIOInputs > visionIOInputsMap ;
30
- private final Map <ReplayVisionRunner .VisionIOApriltagsReplay , PhotonPoseEstimator > photonPoseEstimatorMap ;
29
+ private final Map <ReplayVisionRunner .VisionIOReplay , String > visionIONames ;
30
+ private final Map <ReplayVisionRunner .VisionIOReplay , VisionIO .VisionIOInputs > apriltagVisionIOInputsMap ;
31
+ private final Map <ReplayVisionRunner .VisionIOReplay , VisionIO .VisionIOInputs > noteTrackingVisionIOInputsMap ;
32
+ private final Map <ReplayVisionRunner .VisionIOReplay , PhotonPoseEstimator > photonPoseEstimatorMap ;
31
33
32
34
private final Map <VisionIO , EstimatedRobotPose > estimatedRobotPoseMap ;
35
+ private final Map <VisionIO , NoteTrackingResult > noteTrackingResultMap ;
33
36
34
37
public ReplayVisionRunner (
35
38
final AprilTagFieldLayout aprilTagFieldLayout ,
36
- final Map <ReplayVisionRunner .VisionIOApriltagsReplay , VisionIO .VisionIOInputs > visionIOInputsMap
39
+ final Map <ReplayVisionRunner .VisionIOReplay , VisionIO .VisionIOInputs > apriltagVisionIOInputsMap ,
40
+ final Map <ReplayVisionRunner .VisionIOReplay , VisionIO .VisionIOInputs > noteTrackingVisionIOInputsMap
37
41
) {
38
- this .visionIOInputsMap = visionIOInputsMap ;
42
+ this .apriltagVisionIOInputsMap = apriltagVisionIOInputsMap ;
43
+ this .noteTrackingVisionIOInputsMap = noteTrackingVisionIOInputsMap ;
39
44
40
- final Map <ReplayVisionRunner .VisionIOApriltagsReplay , String > visionIONames = new HashMap <>();
41
- final Map <ReplayVisionRunner .VisionIOApriltagsReplay , PhotonPoseEstimator > poseEstimatorMap = new HashMap <>();
42
- for (final ReplayVisionRunner .VisionIOApriltagsReplay visionIOApriltagsReplay : visionIOInputsMap .keySet ()) {
45
+ final Map <ReplayVisionRunner .VisionIOReplay , String > visionIONames = new HashMap <>();
46
+ final Map <ReplayVisionRunner .VisionIOReplay , PhotonPoseEstimator > poseEstimatorMap = new HashMap <>();
47
+ for (final ReplayVisionRunner .VisionIOReplay visionIOApriltagsReplay : apriltagVisionIOInputsMap .keySet ()) {
43
48
final PhotonPoseEstimator photonPoseEstimator = new PhotonPoseEstimator (
44
49
aprilTagFieldLayout ,
45
50
Constants .Vision .MULTI_TAG_POSE_STRATEGY ,
@@ -52,9 +57,14 @@ public ReplayVisionRunner(
52
57
visionIONames .put (visionIOApriltagsReplay , visionIOApriltagsReplay .photonCamera .getName ());
53
58
}
54
59
60
+ for (final ReplayVisionRunner .VisionIOReplay visionIONoteTrackReplay : noteTrackingVisionIOInputsMap .keySet ()) {
61
+ visionIONames .put (visionIONoteTrackReplay , visionIONoteTrackReplay .photonCamera .getName ());
62
+ }
63
+
55
64
this .visionIONames = visionIONames ;
56
65
this .photonPoseEstimatorMap = poseEstimatorMap ;
57
66
this .estimatedRobotPoseMap = new HashMap <>();
67
+ this .noteTrackingResultMap = new HashMap <>();
58
68
}
59
69
60
70
@ SuppressWarnings ("DuplicatedCode" )
@@ -65,10 +75,10 @@ public void periodic() {
65
75
}
66
76
67
77
for (
68
- final Map .Entry <ReplayVisionRunner .VisionIOApriltagsReplay , VisionIO .VisionIOInputs >
69
- photonVisionIOInputsEntry : visionIOInputsMap .entrySet ()
78
+ final Map .Entry <ReplayVisionRunner .VisionIOReplay , VisionIO .VisionIOInputs >
79
+ photonVisionIOInputsEntry : apriltagVisionIOInputsMap .entrySet ()
70
80
) {
71
- final ReplayVisionRunner .VisionIOApriltagsReplay visionIO = photonVisionIOInputsEntry .getKey ();
81
+ final ReplayVisionRunner .VisionIOReplay visionIO = photonVisionIOInputsEntry .getKey ();
72
82
final VisionIO .VisionIOInputs inputs = photonVisionIOInputsEntry .getValue ();
73
83
74
84
visionIO .periodic ();
@@ -81,13 +91,41 @@ public void periodic() {
81
91
82
92
final PhotonPipelineResult result = inputs .latestResult ;
83
93
VisionUtils .correctPipelineResultTimestamp (result );
94
+
84
95
VisionUtils .updatePoseEstimator (
85
96
photonPoseEstimatorMap .get (visionIO ),
86
97
result
87
98
).ifPresent (
88
99
estimatedRobotPose -> estimatedRobotPoseMap .put (visionIO , estimatedRobotPose )
89
100
);
90
101
}
102
+
103
+ for (
104
+ final Map .Entry <ReplayVisionRunner .VisionIOReplay , VisionIO .VisionIOInputs >
105
+ photonVisionIOInputsEntry : noteTrackingVisionIOInputsMap .entrySet ()
106
+ ) {
107
+ final ReplayVisionRunner .VisionIOReplay visionIO = photonVisionIOInputsEntry .getKey ();
108
+ final VisionIO .VisionIOInputs inputs = photonVisionIOInputsEntry .getValue ();
109
+
110
+ visionIO .periodic ();
111
+ visionIO .updateInputs (inputs );
112
+
113
+ Logger .processInputs (
114
+ String .format ("%s/%s" , PhotonVision .PhotonLogKey , visionIONames .get (visionIO )),
115
+ inputs
116
+ );
117
+
118
+ final PhotonPipelineResult pipelineResult = inputs .latestResult ;
119
+ VisionUtils .correctPipelineResultTimestamp (pipelineResult );
120
+
121
+ Logger .recordOutput (
122
+ String .format ("%s/%s/HasTarget" , PhotonVision .PhotonLogKey , visionIONames .get (visionIO )),
123
+ pipelineResult .hasTargets ()
124
+ );
125
+
126
+ final NoteTrackingResult noteTrackingResult = new NoteTrackingResult (inputs .robotToCamera , pipelineResult );
127
+ noteTrackingResultMap .put (visionIO , noteTrackingResult );
128
+ }
91
129
}
92
130
93
131
/**
@@ -98,12 +136,22 @@ public void periodic() {
98
136
public void resetRobotPose (final Pose3d robotPose ) {}
99
137
100
138
@ Override
101
- public Map <ReplayVisionRunner .VisionIOApriltagsReplay , VisionIO .VisionIOInputs > getApriltagVisionIOInputsMap () {
102
- return visionIOInputsMap ;
139
+ public Map <ReplayVisionRunner .VisionIOReplay , VisionIO .VisionIOInputs > getApriltagVisionIOInputsMap () {
140
+ return apriltagVisionIOInputsMap ;
141
+ }
142
+
143
+ @ Override
144
+ public Map <ReplayVisionRunner .VisionIOReplay , VisionIO .VisionIOInputs > getNoteTrackingVisionIOInputsMap () {
145
+ return noteTrackingVisionIOInputsMap ;
103
146
}
104
147
105
148
@ Override
106
149
public EstimatedRobotPose getEstimatedRobotPose (final VisionIO visionIO ) {
107
150
return estimatedRobotPoseMap .get (visionIO );
108
151
}
152
+
153
+ @ Override
154
+ public NoteTrackingResult getNoteTrackingResult (final VisionIO visionIO ) {
155
+ return noteTrackingResultMap .get (visionIO );
156
+ }
109
157
}
0 commit comments