Note that the coordinate frame of these transforms depends on the implementing solvePnP
+ * method.
+ */
+public class Message implements ProtobufSerializable {
+ /**
+ * If this result is valid. A false value indicates there was an error in estimation, and this
+ * result should not be used.
+ */
+ public final boolean isPresent;
+
+ /**
+ * The best-fit transform. The coordinate frame of this transform depends on the method which gave
+ * this result.
+ */
+ public final Transform3d best;
+
+ /** Reprojection error of the best solution, in pixels */
+ public final double bestReprojErr;
+
+ /**
+ * Alternate, ambiguous solution from solvepnp. If no alternate solution is found, this is equal
+ * to the best solution.
+ */
+ public final Transform3d alt;
+
+ /** If no alternate solution is found, this is bestReprojErr */
+ public final double altReprojErr;
+
+ /** If no alternate solution is found, this is 0 */
+ public final double ambiguity;
+
+ /** An empty (invalid) result. */
+ public Message() {
+ this.isPresent = false;
+ this.best = new Transform3d();
+ this.alt = new Transform3d();
+ this.ambiguity = 0;
+ this.bestReprojErr = 0;
+ this.altReprojErr = 0;
+ }
+
+ public Message(Transform3d best, double bestReprojErr) {
+ this(best, best, 0, bestReprojErr, bestReprojErr);
+ }
+
+ public Message(
+ Transform3d best,
+ Transform3d alt,
+ double ambiguity,
+ double bestReprojErr,
+ double altReprojErr) {
+ this.isPresent = true;
+ this.best = best;
+ this.alt = alt;
+ this.ambiguity = ambiguity;
+ this.bestReprojErr = bestReprojErr;
+ this.altReprojErr = altReprojErr;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + (isPresent ? 1231 : 1237);
+ result = prime * result + ((best == null) ? 0 : best.hashCode());
+ long temp;
+ temp = Double.doubleToLongBits(bestReprojErr);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ result = prime * result + ((alt == null) ? 0 : alt.hashCode());
+ temp = Double.doubleToLongBits(altReprojErr);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ temp = Double.doubleToLongBits(ambiguity);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+ Message other = (Message) obj;
+ if (isPresent != other.isPresent) return false;
+ if (best == null) {
+ if (other.best != null) return false;
+ } else if (!best.equals(other.best)) return false;
+ if (Double.doubleToLongBits(bestReprojErr) != Double.doubleToLongBits(other.bestReprojErr))
+ return false;
+ if (alt == null) {
+ if (other.alt != null) return false;
+ } else if (!alt.equals(other.alt)) return false;
+ if (Double.doubleToLongBits(altReprojErr) != Double.doubleToLongBits(other.altReprojErr))
+ return false;
+ if (Double.doubleToLongBits(ambiguity) != Double.doubleToLongBits(other.ambiguity))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "PNPResult [isPresent="
+ + isPresent
+ + ", best="
+ + best
+ + ", bestReprojErr="
+ + bestReprojErr
+ + ", alt="
+ + alt
+ + ", altReprojErr="
+ + altReprojErr
+ + ", ambiguity="
+ + ambiguity
+ + "]";
+ }
+
+ public static final class APacketSerde implements PacketSerde