@@ -23,6 +23,8 @@ public class ObjectVision extends VirtualSubsystem {
2323 new LoggedTunableNumber ("ObjectVision/MaxArea" , 20.0 );
2424 private static final LoggedTunableNumber confidenceThreshold =
2525 new LoggedTunableNumber ("ObjectVision/ConfidenceThreshold" , 0.3 );
26+ private static final LoggedTunableNumber maxDetectableObjects =
27+ new LoggedTunableNumber ("ObjectVision/MaxDetectableObjects" , 5 );
2628
2729 private final ObjectVisionIO [] io ;
2830 private final ObjectVisionIOInputsAutoLogged [] inputs ;
@@ -33,7 +35,7 @@ record CoralPose(
3335
3436 private final FieldObject2d coralObjects = FieldConstants .FIELD_2D .getObject ("Corals" );
3537 private final ArrayList <ObjectVisionIO .ObjectObservation > allObservations = new ArrayList <>();
36- private final Set <CoralPose > coralPoses = new HashSet <>();
38+ private final LinkedList <CoralPose > coralPoses = new LinkedList <>();
3739
3840 public ObjectVision () {
3941 this .io = VisionConstants .getObjIO ();
@@ -46,7 +48,7 @@ public ObjectVision() {
4648 private void addCoralObservationToPose (ObjectVisionIO .ObjectObservation observation ) {
4749 double now = Timer .getFPGATimestamp ();
4850 Optional <Pose2d > oldWheelOdomPose = RobotContainer .s_Swerve .getPoseAtTime (observation .timestamp ());
49- if (Constants .loggedValue ("CoralObservation /WheelOdomEmpty" , oldWheelOdomPose .isEmpty ())) {
51+ if (Constants .loggedValue ("CoralProcessing /WheelOdomEmpty" , oldWheelOdomPose .isEmpty ())) {
5052 return ;
5153 }
5254 var estimatedPose = RobotContainer .s_Swerve .getPose ();
@@ -60,8 +62,8 @@ private void addCoralObservationToPose(ObjectVisionIO.ObjectObservation observat
6062 double [] txCorners = observation .info ().tx (); // degrees
6163 double [] tyCorners = observation .info ().ty (); // degrees
6264
63- Constants .loggedValue ("CoralObservation /TxCorners_degrees" , txCorners );
64- Constants .loggedValue ("CoralObservation /TyCorners_degrees" , tyCorners );
65+ Constants .loggedValue ("CoralProcessing /TxCorners_degrees" , txCorners );
66+ Constants .loggedValue ("CoralProcessing /TyCorners_degrees" , tyCorners );
6567
6668 // bounding box center in deg
6769 double minX = Math .min (Math .min (txCorners [0 ], txCorners [1 ]),
@@ -77,18 +79,18 @@ private void addCoralObservationToPose(ObjectVisionIO.ObjectObservation observat
7779 double tx = (minX + maxX ) / 2.0 ;
7880 double ty = (minY + maxY ) / 2.0 ;
7981
80- Constants .loggedValue ("CoralObservation /tx_degrees" , tx );
81- Constants .loggedValue ("CoralObservation /ty_degrees" , ty );
82+ Constants .loggedValue ("CoralProcessing /tx_degrees" , tx );
83+ Constants .loggedValue ("CoralProcessing /ty_degrees" , ty );
8284
8385 // trig
8486 double cameraHeight = robotToCamera .getZ ();
8587 double cameraPitch = robotToCamera .getRotation ().getY (); // radians
86- Constants .loggedValue ("CoralObservation /cameraPitch_radians" , cameraPitch );
88+ Constants .loggedValue ("CoralProcessing /cameraPitch_radians" , cameraPitch );
8789 double tyRadians = Math .toRadians (ty );
8890 double verticalAngleFromHorizontal = cameraPitch + tyRadians ;
89- Constants .loggedValue ("CoralObservation /AngleFromHorizontal_radians" , verticalAngleFromHorizontal );
90- Constants .loggedValue ("CoralObservation /AngleFromHorizontal_degrees" , Math .toDegrees (verticalAngleFromHorizontal ));
91- if (Constants .loggedValue ("CoralObservation /VerticalAngleError" , verticalAngleFromHorizontal <= 0 )) {
91+ Constants .loggedValue ("CoralProcessing /AngleFromHorizontal_radians" , verticalAngleFromHorizontal );
92+ Constants .loggedValue ("CoralProcessing /AngleFromHorizontal_degrees" , Math .toDegrees (verticalAngleFromHorizontal ));
93+ if (Constants .loggedValue ("CoralProcessing /VerticalAngleError" , verticalAngleFromHorizontal <= 0 )) {
9294 return ;
9395 }
9496 double targetHeight = 0.0 ;
@@ -98,26 +100,33 @@ private void addCoralObservationToPose(ObjectVisionIO.ObjectObservation observat
98100 new Translation2d (
99101 forwardDistance * Math .cos (txRadians ),
100102 forwardDistance * Math .sin (txRadians ));
101- Constants .loggedValue ("CoralObservation /cameraToCoralInCameraFrame" ,
103+ Constants .loggedValue ("CoralProcessing /cameraToCoralInCameraFrame" ,
102104 new Pose2d (cameraToCoralInCameraFrame , new Rotation2d ()));
103105
104106 Transform2d robotToCamera2d = new Transform2d (
105107 robotToCamera .getTranslation ().toTranslation2d (),
106108 robotToCamera .getRotation ().toRotation2d ());
107109 Pose2d fieldToCamera = fieldToRobot .transformBy (robotToCamera2d );
108110
109- Constants .loggedValue ("CoralObservation /fieldToRobot" , fieldToRobot );
110- Constants .loggedValue ("CoralObservation /fieldToCamera" , fieldToCamera );
111- Constants .loggedValue ("CoralObservation /forwardDistance" , forwardDistance );
111+ Constants .loggedValue ("CoralProcessing /fieldToRobot" , fieldToRobot );
112+ Constants .loggedValue ("CoralProcessing /fieldToCamera" , fieldToCamera );
113+ Constants .loggedValue ("CoralProcessing /forwardDistance" , forwardDistance );
112114
113115 Pose2d fieldToCoral = fieldToCamera
114116 .transformBy (new Transform2d (cameraToCoralInCameraFrame , new Rotation2d ()));
115- Constants .loggedValue ("CoralObservation /fieldToCoral" , fieldToCoral );
117+ Constants .loggedValue ("CoralProcessing /fieldToCoral" , fieldToCoral );
116118 CoralPose coralPose = new CoralPose (fieldToCoral .getTranslation (), observation .timestamp ());
117119 coralPoses .removeIf (
118120 c -> c .translation .getDistance (fieldToCoral .getTranslation ()) <= coralOverlap
119121 || now - c .timestamp > coralMaxAge );
120122 coralPoses .add (coralPose );
123+
124+ // fifo
125+ while (coralPoses .size () > (int ) maxDetectableObjects .get ()) {
126+ CoralPose removed = coralPoses .removeFirst ();
127+ Logger .recordOutput ("CoralProcessing/RemovedOldest" ,
128+ new Pose2d (removed .translation , new Rotation2d ()));
129+ }
121130 }
122131
123132 @ Override
0 commit comments