Skip to content

Commit

Permalink
Add protobuf serde classes
Browse files Browse the repository at this point in the history
  • Loading branch information
srimanachanta committed Dec 27, 2023
1 parent 5a4bf16 commit 9a7764f
Show file tree
Hide file tree
Showing 20 changed files with 838 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.List;
import org.photonvision.common.dataflow.structures.Packet;
import org.photonvision.common.dataflow.structures.PacketSerde;
import org.photonvision.targeting.proto.MultiTargetPNPResultProto;

public class MultiTargetPNPResult {
// Seeing 32 apriltags at once seems like a sane limit
Expand Down Expand Up @@ -103,4 +104,5 @@ public MultiTargetPNPResult unpack(Packet packet) {
}

public static final APacketSerde serde = new APacketSerde();
public static final MultiTargetPNPResultProto proto = new MultiTargetPNPResultProto();
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import edu.wpi.first.math.geometry.Transform3d;
import org.photonvision.common.dataflow.structures.Packet;
import org.photonvision.common.dataflow.structures.PacketSerde;
import org.photonvision.targeting.proto.PNPResultProto;
import org.photonvision.utils.PacketUtils;

/**
Expand Down Expand Up @@ -180,4 +181,5 @@ public PNPResult unpack(Packet packet) {
}

public static final APacketSerde serde = new APacketSerde();
public static final PNPResultProto proto = new PNPResultProto();
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.List;
import org.photonvision.common.dataflow.structures.Packet;
import org.photonvision.common.dataflow.structures.PacketSerde;
import org.photonvision.targeting.proto.PhotonPipelineResultProto;

/** Represents a pipeline result from a PhotonCamera. */
public class PhotonPipelineResult {
Expand Down Expand Up @@ -225,4 +226,5 @@ public PhotonPipelineResult unpack(Packet packet) {
}

public static final APacketSerde serde = new APacketSerde();
public static final PhotonPipelineResultProto proto = new PhotonPipelineResultProto();
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.List;
import org.photonvision.common.dataflow.structures.Packet;
import org.photonvision.common.dataflow.structures.PacketSerde;
import org.photonvision.targeting.proto.PhotonTrackedTargetProto;
import org.photonvision.utils.PacketUtils;

public class PhotonTrackedTarget {
Expand Down Expand Up @@ -289,4 +290,5 @@ public PhotonTrackedTarget unpack(Packet packet) {
}

public static final APacketSerde serde = new APacketSerde();
public static final PhotonTrackedTargetProto proto = new PhotonTrackedTargetProto();
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import java.util.Objects;
import org.photonvision.common.dataflow.structures.Packet;
import org.photonvision.common.dataflow.structures.PacketSerde;
import org.photonvision.targeting.proto.TargetCornerProto;

/**
* Represents a point in an image at the corner of the minimum-area bounding rectangle, in pixels.
Expand Down Expand Up @@ -71,4 +72,5 @@ public TargetCorner unpack(Packet packet) {
}

public static final APacketSerde serde = new APacketSerde();
public static final TargetCornerProto proto = new TargetCornerProto();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* Copyright (C) Photon Vision.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package org.photonvision.targeting.proto;

import edu.wpi.first.util.protobuf.Protobuf;
import java.util.Arrays;
import java.util.stream.Collectors;
import org.photonvision.proto.Photon.ProtobufMultiTargetPNPResult;
import org.photonvision.targeting.MultiTargetPNPResult;
import org.photonvision.targeting.PNPResult;
import us.hebi.quickbuf.Descriptors.Descriptor;
import us.hebi.quickbuf.RepeatedInt;

public class MultiTargetPNPResultProto
implements Protobuf<MultiTargetPNPResult, ProtobufMultiTargetPNPResult> {
@Override
public Class<MultiTargetPNPResult> getTypeClass() {
return MultiTargetPNPResult.class;
}

@Override
public Descriptor getDescriptor() {
return ProtobufMultiTargetPNPResult.getDescriptor();
}

@Override
public Protobuf<?, ?>[] getNested() {
return new Protobuf<?, ?>[] {PNPResult.proto};
}

@Override
public ProtobufMultiTargetPNPResult createMessage() {
return ProtobufMultiTargetPNPResult.newInstance();
}

@Override
public MultiTargetPNPResult unpack(ProtobufMultiTargetPNPResult msg) {
return new MultiTargetPNPResult(
PNPResult.proto.unpack(msg.getEstimatedPose()),
// TODO better way of doing this
Arrays.stream(msg.getFiducialIdsUsed().array()).boxed().collect(Collectors.toList()));
}

@Override
public void pack(ProtobufMultiTargetPNPResult msg, MultiTargetPNPResult value) {
PNPResult.proto.pack(msg.getMutableEstimatedPose(), value.estimatedPose);

RepeatedInt idsUsed = msg.getMutableFiducialIdsUsed().reserve(value.fiducialIDsUsed.size());
for (int i = 0; i < value.fiducialIDsUsed.size(); i++) {
idsUsed.add(value.fiducialIDsUsed.get(i));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* Copyright (C) Photon Vision.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package org.photonvision.targeting.proto;

import edu.wpi.first.math.geometry.Transform3d;
import edu.wpi.first.util.protobuf.Protobuf;
import org.photonvision.proto.Photon.ProtobufPNPResult;
import org.photonvision.targeting.PNPResult;
import us.hebi.quickbuf.Descriptors.Descriptor;

public class PNPResultProto implements Protobuf<PNPResult, ProtobufPNPResult> {
@Override
public Class<PNPResult> getTypeClass() {
return PNPResult.class;
}

@Override
public Descriptor getDescriptor() {
return ProtobufPNPResult.getDescriptor();
}

@Override
public Protobuf<?, ?>[] getNested() {
return new Protobuf<?, ?>[] {Transform3d.proto};
}

@Override
public ProtobufPNPResult createMessage() {
return ProtobufPNPResult.newInstance();
}

@Override
public PNPResult unpack(ProtobufPNPResult msg) {
if (!msg.getIsPresent()) {
return new PNPResult();
}

return new PNPResult(
Transform3d.proto.unpack(msg.getBest()),
Transform3d.proto.unpack(msg.getAlt()),
msg.getAmbiguity(),
msg.getBestReprojErr(),
msg.getAltReprojErr());
}

@Override
public void pack(ProtobufPNPResult msg, PNPResult value) {
Transform3d.proto.pack(msg.getMutableBest(), value.best);
Transform3d.proto.pack(msg.getMutableAlt(), value.alt);
msg.setAmbiguity(value.ambiguity)
.setBestReprojErr(value.bestReprojErr)
.setAltReprojErr(value.altReprojErr)
.setIsPresent(value.isPresent);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* Copyright (C) Photon Vision.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package org.photonvision.targeting.proto;

import edu.wpi.first.util.protobuf.Protobuf;
import org.photonvision.proto.Photon.ProtobufPhotonPipelineResult;
import org.photonvision.targeting.MultiTargetPNPResult;
import org.photonvision.targeting.PhotonPipelineResult;
import org.photonvision.targeting.PhotonTrackedTarget;
import us.hebi.quickbuf.Descriptors.Descriptor;

public class PhotonPipelineResultProto
implements Protobuf<PhotonPipelineResult, ProtobufPhotonPipelineResult> {
@Override
public Class<PhotonPipelineResult> getTypeClass() {
return PhotonPipelineResult.class;
}

@Override
public Descriptor getDescriptor() {
return ProtobufPhotonPipelineResult.getDescriptor();
}

@Override
public Protobuf<?, ?>[] getNested() {
return new Protobuf<?, ?>[] {PhotonTrackedTarget.proto, MultiTargetPNPResult.proto};
}

@Override
public ProtobufPhotonPipelineResult createMessage() {
return ProtobufPhotonPipelineResult.newInstance();
}

@Override
public PhotonPipelineResult unpack(ProtobufPhotonPipelineResult msg) {
return new PhotonPipelineResult(
msg.getLatencyMs(),
PhotonTrackedTarget.proto.unpack(msg.getTargets()),
MultiTargetPNPResult.proto.unpack(msg.getMultiTargetResult()));
}

@Override
public void pack(ProtobufPhotonPipelineResult msg, PhotonPipelineResult value) {
PhotonTrackedTarget.proto.pack(msg.getMutableTargets(), value.getTargets());
MultiTargetPNPResult.proto.pack(msg.getMutableMultiTargetResult(), value.getMultiTagResult());

msg.setLatencyMs(value.getLatencyMillis());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
/*
* Copyright (C) Photon Vision.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package org.photonvision.targeting.proto;

import edu.wpi.first.math.geometry.Transform3d;
import edu.wpi.first.util.protobuf.Protobuf;
import java.util.ArrayList;
import java.util.List;
import org.photonvision.proto.Photon.ProtobufPhotonTrackedTarget;
import org.photonvision.targeting.PhotonTrackedTarget;
import org.photonvision.targeting.TargetCorner;
import us.hebi.quickbuf.Descriptors.Descriptor;
import us.hebi.quickbuf.RepeatedMessage;

public class PhotonTrackedTargetProto
implements Protobuf<PhotonTrackedTarget, ProtobufPhotonTrackedTarget> {
@Override
public Class<PhotonTrackedTarget> getTypeClass() {
return PhotonTrackedTarget.class;
}

@Override
public Descriptor getDescriptor() {
return ProtobufPhotonTrackedTarget.getDescriptor();
}

@Override
public Protobuf<?, ?>[] getNested() {
return new Protobuf<?, ?>[] {Transform3d.proto, TargetCorner.proto};
}

@Override
public ProtobufPhotonTrackedTarget createMessage() {
return ProtobufPhotonTrackedTarget.newInstance();
}

@Override
public PhotonTrackedTarget unpack(ProtobufPhotonTrackedTarget msg) {
return new PhotonTrackedTarget(
msg.getYaw(),
msg.getPitch(),
msg.getArea(),
msg.getSkew(),
msg.getFiducialId(),
Transform3d.proto.unpack(msg.getBestCameraToTarget()),
Transform3d.proto.unpack(msg.getAltCameraToTarget()),
msg.getPoseAmbiguity(),
TargetCorner.proto.unpack(msg.getMinAreaRectCorners()),
TargetCorner.proto.unpack(msg.getDetectedCorners()));
}

public List<PhotonTrackedTarget> unpack(RepeatedMessage<ProtobufPhotonTrackedTarget> msg) {
ArrayList<PhotonTrackedTarget> targets = new ArrayList<>(msg.length());
for (ProtobufPhotonTrackedTarget target : msg) {
targets.add(unpack(target));
}
return targets;
}

@Override
public void pack(ProtobufPhotonTrackedTarget msg, PhotonTrackedTarget value) {
msg.setYaw(value.getYaw())
.setPitch(value.getPitch())
.setSkew(value.getSkew())
.setArea(value.getArea())
.setFiducialId(value.getFiducialId())
.setPoseAmbiguity(value.getPoseAmbiguity());

Transform3d.proto.pack(msg.getMutableBestCameraToTarget(), value.getBestCameraToTarget());
Transform3d.proto.pack(msg.getMutableAltCameraToTarget(), value.getAlternateCameraToTarget());

TargetCorner.proto.pack(msg.getMutableMinAreaRectCorners(), value.getMinAreaRectCorners());
TargetCorner.proto.pack(msg.getMutableDetectedCorners(), value.getDetectedCorners());
}

public void pack(
RepeatedMessage<ProtobufPhotonTrackedTarget> msg, List<PhotonTrackedTarget> value) {
var targets = msg.reserve(value.size());
for (PhotonTrackedTarget trackedTarget : value) {
var target = targets.next();
pack(target, trackedTarget);
}
}
}
Loading

0 comments on commit 9a7764f

Please sign in to comment.