@@ -103,93 +103,112 @@ class Vision(
103103 CameraIO .DetectionPipeline .APRIL_TAG -> {
104104 val targetingTags = mutableListOf<Pair <Int , Transform3d >>()
105105 var closestTargetTag: Pair <Int , Transform3d >? = null
106-
107- val tagTargets = inputs[instance].cameraTargets.filter { it.fiducialId != - 1 }
108-
109106 val cornerData = mutableListOf<Double >()
110107
111- for (tag in tagTargets) {
112- if (tag.poseAmbiguity < VisionConstants .AMBIGUITY_THESHOLD ) {
113- if (DriverStation .getAlliance().isPresent) {
114- val robotTTag = io[instance].transform.plus(Transform3d (tag.bestCameraToTarget))
115-
116- val distanceToTarget = robotTTag.translation.norm
117- val trustRating =
118- io[instance].calculateTagTrust(
119- tag, distanceToTarget.inMeters, robotTTag, chassisSpeedsSupplier.get())
120- CustomLogger .recordDebugOutput(
121- " Vision/${io[instance].identifier} /${tag.fiducialId} /trustRating" , trustRating)
122-
123- CustomLogger .recordDebugOutput(
124- " Vision/${io[instance].identifier} /${tag.fiducialId} /robotDistanceToTarget" ,
125- distanceToTarget.inMeters)
126-
127- CustomLogger .recordDebugOutput(
128- " Vision/${io[instance].identifier} /${tag.fiducialId} /tagArea" , tag.area)
129-
130- CustomLogger .recordDebugOutput(
131- " Vision/${io[instance].identifier} /${tag.fiducialId} /numCorners" ,
132- tag.detectedCorners.size)
133-
134- CustomLogger .recordOutput(
135- " Vision/${io[instance].identifier} /${tag.fiducialId} /robotTTag" ,
136- robotTTag.transform3d)
108+ val chassisSpeeds = chassisSpeedsSupplier.get()
109+ val hasTagEstimate = inputs[instance].cameraTargets.any { it.fiducialId != - 1 }
110+ val poseForAcceptance = if (hasTagEstimate) inputs[instance].frame else poseSupplier.get()
111+ val robotPoseAccepted = io[instance].calculatePoseAcceptance(chassisSpeeds, poseForAcceptance)
112+
113+ CustomLogger .recordDebugOutput(
114+ " Vision/${io[instance].identifier} /poseAcceptedForTagTrust" , robotPoseAccepted)
115+ CustomLogger .recordDebugOutput(
116+ " Vision/${io[instance].identifier} /hasTagEstimate" , hasTagEstimate)
117+
118+ if (robotPoseAccepted && hasTagEstimate) {
119+ io[instance].poseMeasurementConsumer(
120+ inputs[instance].frame.pose3d,
121+ inputs[instance].timestamp.inSeconds,
122+ io[instance].curStdDevs)
123+ }
137124
138- for (corner in tag.detectedCorners) {
139- cornerData.add(corner.x)
140- cornerData.add(corner.y)
141- }
142- if (tag.fiducialId in tagIDFilter &&
143- trustRating >= VisionConstants .TAG_TRUST_THRESHOLD ) {
144- targetingTags.add(Pair (tag.fiducialId, robotTTag))
125+ if (! robotPoseAccepted) {
126+ closestTargetingTags[instance] = null
127+ CustomLogger .recordOutput(" Vision/${io[instance].identifier} /closestTargetTagID" , - 1 )
128+ CustomLogger .recordOutput(
129+ " Vision/${io[instance].identifier} /closestTargetTagPose" , Transform3dWPILIB ())
130+ } else {
131+ val tagTargets = inputs[instance].cameraTargets.filter { it.fiducialId != - 1 }
132+
133+ for (tag in tagTargets) {
134+ if (tag.poseAmbiguity < VisionConstants .AMBIGUITY_THESHOLD ) {
135+ if (DriverStation .getAlliance().isPresent) {
136+ val robotTTag = io[instance].transform.plus(Transform3d (tag.bestCameraToTarget))
137+
138+ val distanceToTarget = robotTTag.translation.norm
139+ val trustRating =
140+ io[instance].calculateTagTrust(
141+ tag, distanceToTarget.inMeters, robotTTag, chassisSpeeds)
142+ CustomLogger .recordDebugOutput(
143+ " Vision/${io[instance].identifier} /${tag.fiducialId} /trustRating" , trustRating)
144+
145+ CustomLogger .recordDebugOutput(
146+ " Vision/${io[instance].identifier} /${tag.fiducialId} /robotDistanceToTarget" ,
147+ distanceToTarget.inMeters)
148+
149+ CustomLogger .recordDebugOutput(
150+ " Vision/${io[instance].identifier} /${tag.fiducialId} /tagArea" , tag.area)
151+
152+ CustomLogger .recordDebugOutput(
153+ " Vision/${io[instance].identifier} /${tag.fiducialId} /numCorners" ,
154+ tag.detectedCorners.size)
155+
156+ CustomLogger .recordOutput(
157+ " Vision/${io[instance].identifier} /${tag.fiducialId} /robotTTag" ,
158+ robotTTag.transform3d)
159+
160+ for (corner in tag.detectedCorners) {
161+ cornerData.add(corner.x)
162+ cornerData.add(corner.y)
163+ }
164+ if (tag.fiducialId in tagIDFilter && trustRating) {
165+ targetingTags.add(Pair (tag.fiducialId, robotTTag))
166+ }
145167 }
146168 }
169+ }
147170
148- closestTargetTag = targetingTags.minByOrNull { it.second.translation.norm }
149-
150- closestTargetingTags[instance] = closestTargetTag
171+ closestTargetTag = targetingTags.minByOrNull { it.second.translation.norm }
172+ closestTargetingTags[instance] = closestTargetTag
151173
152- CustomLogger .recordDebugOutput(
153- " Vision/${io[instance].identifier} /cornerDetections" , cornerData.toDoubleArray())
174+ CustomLogger .recordDebugOutput(
175+ " Vision/${io[instance].identifier} /cornerDetections" , cornerData.toDoubleArray())
154176
155- CustomLogger .recordOutput(
156- " Vision/${io[instance].identifier} /closestTargetTagID" ,
157- closestTargetTag?.first ? : - 1 )
177+ CustomLogger .recordOutput(
178+ " Vision/${io[instance].identifier} /closestTargetTagID" ,
179+ closestTargetTag?.first ? : - 1 )
158180
159- CustomLogger .recordOutput(
160- " Vision/${io[instance].identifier} /closestTargetTagPose" ,
161- closestTargetTag?.second?.transform3d ? : Transform3dWPILIB ())
162- }
181+ CustomLogger .recordOutput(
182+ " Vision/${io[instance].identifier} /closestTargetTagPose" ,
183+ closestTargetTag?.second?.transform3d ? : Transform3dWPILIB ())
184+ }
163185
164- closestTargetTagAcrossCams =
165- if (closestTargetingTags[0 ]?.first != closestTargetingTags[1 ]?.first) {
166- closestTargetingTags.minByOrNull {
167- it.value?.second?.translation?.norm ? : 1000000 .meters
168- }
169- } else {
170- mapOf (cameraPreference to closestTargetingTags[cameraPreference]).minByOrNull {
171- it.value?.second?.translation?.norm ? : 1000000 .meters
172- }
186+ closestTargetTagAcrossCams =
187+ if (closestTargetingTags[0 ]?.first != closestTargetingTags[1 ]?.first) {
188+ closestTargetingTags.minByOrNull { it.value?.second?.translation?.norm ? : 1000000 .meters }
189+ } else {
190+ mapOf (cameraPreference to closestTargetingTags[cameraPreference]).minByOrNull {
191+ it.value?.second?.translation?.norm ? : 1000000 .meters
173192 }
193+ }
174194
175- CustomLogger .recordOutput(
176- " Vision/ClosestTargetTagAcrossAllCams/TagID" ,
177- closestTargetTagAcrossCams?.value?.first ? : - 1 )
178-
179- CustomLogger .recordDebugOutput(
180- " Vision/ClosestTargetTagAcrossAllCams/TargetTagPose" ,
181- closestTargetTagAcrossCams?.value?.second?.transform3d ? : Transform3dWPILIB ())
182-
183- if (closestTargetTagAcrossCams?.key != null &&
184- closestTargetTagAcrossCams?.value != null ) {
185- lastTrigVisionUpdate =
186- TimestampedTrigVisionUpdate (
187- inputs[closestTargetTagAcrossCams?.key ? : 0 ].timestamp,
188- closestTargetTagAcrossCams?.value?.first ? : - 1 ,
189- Transform3d (
190- closestTargetTagAcrossCams?.value?.second?.translation ? : Translation3d (),
191- closestTargetTagAcrossCams?.value?.second?.rotation ? : Rotation3d ()))
192- }
195+ CustomLogger .recordOutput(
196+ " Vision/ClosestTargetTagAcrossAllCams/TagID" ,
197+ closestTargetTagAcrossCams?.value?.first ? : - 1 )
198+
199+ CustomLogger .recordDebugOutput(
200+ " Vision/ClosestTargetTagAcrossAllCams/TargetTagPose" ,
201+ closestTargetTagAcrossCams?.value?.second?.transform3d ? : Transform3dWPILIB ())
202+
203+ if (closestTargetTagAcrossCams?.key != null &&
204+ closestTargetTagAcrossCams?.value != null ) {
205+ lastTrigVisionUpdate =
206+ TimestampedTrigVisionUpdate (
207+ inputs[closestTargetTagAcrossCams?.key ? : 0 ].timestamp,
208+ closestTargetTagAcrossCams?.value?.first ? : - 1 ,
209+ Transform3d (
210+ closestTargetTagAcrossCams?.value?.second?.translation ? : Translation3d (),
211+ closestTargetTagAcrossCams?.value?.second?.rotation ? : Rotation3d ()))
193212 }
194213 }
195214 CameraIO .DetectionPipeline .OBJECT_DETECTION -> {
0 commit comments