mirror of
https://github.com/PhotonVision/photonvision
synced 2026-06-20 00:51:41 +00:00
Compare commits
5 Commits
v2024.2.10
...
v2024.3.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5dc70e4d3f | ||
|
|
5597f5acd9 | ||
|
|
fae3116951 | ||
|
|
def37b92ba | ||
|
|
5b878fe3a3 |
@@ -4,7 +4,7 @@ plugins {
|
||||
id "com.diffplug.spotless" version "6.24.0"
|
||||
id "edu.wpi.first.NativeUtils" version "2024.6.1" apply false
|
||||
id "edu.wpi.first.wpilib.repositories.WPILibRepositoriesPlugin" version "2020.2"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.1"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.2"
|
||||
id 'edu.wpi.first.WpilibTools' version '1.3.0'
|
||||
id 'com.google.protobuf' version '0.9.4' apply false
|
||||
}
|
||||
@@ -24,7 +24,7 @@ allprojects {
|
||||
apply from: "versioningHelper.gradle"
|
||||
|
||||
ext {
|
||||
wpilibVersion = "2024.3.1"
|
||||
wpilibVersion = "2024.3.2"
|
||||
wpimathVersion = wpilibVersion
|
||||
openCVversion = "4.8.0-2"
|
||||
joglVersion = "2.4.0-rc-20200307"
|
||||
|
||||
@@ -13,11 +13,7 @@ defineProps<{
|
||||
|
||||
const driverMode = computed<boolean>({
|
||||
get: () => useCameraSettingsStore().isDriverMode,
|
||||
set: (v) =>
|
||||
useCameraSettingsStore().changeCurrentPipelineIndex(
|
||||
v ? -1 : useCameraSettingsStore().currentCameraSettings.lastPipelineIndex || 0,
|
||||
true
|
||||
)
|
||||
set: (v) => useCameraSettingsStore().setDriverMode(v)
|
||||
});
|
||||
|
||||
const fpsTooLow = computed<boolean>(() => {
|
||||
|
||||
@@ -130,12 +130,32 @@ const interactiveCols = computed(() =>
|
||||
tooltip="Controls blue automatic white balance gain, which affects how the camera captures colors in different conditions"
|
||||
@input="(args) => useCameraSettingsStore().changeCurrentPipelineSetting({ cameraBlueGain: args }, false)"
|
||||
/>
|
||||
<!-- Disable camera orientation as stop gap for Issue 1084 until calibration data gets rotated. https://github.com/PhotonVision/photonvision/issues/1084 -->
|
||||
<v-banner
|
||||
v-show="
|
||||
useCameraSettingsStore().isCurrentVideoFormatCalibrated &&
|
||||
useCameraSettingsStore().currentPipelineSettings.inputImageRotationMode != 0
|
||||
"
|
||||
rounded
|
||||
dark
|
||||
color="red"
|
||||
text-color="white"
|
||||
class="mt-3"
|
||||
icon="mdi-alert-circle-outline"
|
||||
>
|
||||
Warning! A known bug affects rotation of calibrated camera. Turn off rotation here and rotate using
|
||||
cameraToRobotTransform in your robot code.
|
||||
</v-banner>
|
||||
<pv-select
|
||||
v-model="useCameraSettingsStore().currentPipelineSettings.inputImageRotationMode"
|
||||
label="Orientation"
|
||||
tooltip="Rotates the camera stream"
|
||||
tooltip="Rotates the camera stream. Rotation not available when camera has been calibrated."
|
||||
:items="cameraRotations"
|
||||
:select-cols="interactiveCols"
|
||||
:disabled="
|
||||
useCameraSettingsStore().isCurrentVideoFormatCalibrated &&
|
||||
useCameraSettingsStore().currentPipelineSettings.inputImageRotationMode == 0
|
||||
"
|
||||
@input="(args) => useCameraSettingsStore().changeCurrentPipelineSetting({ inputImageRotationMode: args }, false)"
|
||||
/>
|
||||
<pv-select
|
||||
|
||||
@@ -236,6 +236,13 @@ export const useCameraSettingsStore = defineStore("cameraSettings", {
|
||||
}
|
||||
useStateStore().websocket?.send(payload, true);
|
||||
},
|
||||
setDriverMode(isDriverMode: boolean, cameraIndex: number = useStateStore().currentCameraIndex) {
|
||||
const payload = {
|
||||
driverMode: isDriverMode,
|
||||
cameraIndex: cameraIndex
|
||||
};
|
||||
useStateStore().websocket?.send(payload, true);
|
||||
},
|
||||
/**
|
||||
* Change the currently selected pipeline of the provided camera.
|
||||
*
|
||||
|
||||
@@ -22,12 +22,12 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.stream.Collectors;
|
||||
import org.opencv.core.Mat;
|
||||
import org.photonvision.common.logging.LogGroup;
|
||||
import org.photonvision.common.logging.Logger;
|
||||
import org.photonvision.common.util.TestUtils;
|
||||
import org.photonvision.rknn.RknnJNI;
|
||||
import org.photonvision.rknn.RknnJNI.RknnResult;
|
||||
import org.photonvision.vision.opencv.CVMat;
|
||||
import org.photonvision.vision.pipe.impl.NeuralNetworkPipeResult;
|
||||
|
||||
public class RknnDetectorJNI extends PhotonJNICommon {
|
||||
@@ -65,16 +65,38 @@ public class RknnDetectorJNI extends PhotonJNICommon {
|
||||
long objPointer = -1;
|
||||
private List<String> labels;
|
||||
private final Object lock = new Object();
|
||||
private static final CopyOnWriteArrayList<Long> detectors = new CopyOnWriteArrayList<>();
|
||||
private static final CopyOnWriteArrayList<RknnObjectDetector> detectors =
|
||||
new CopyOnWriteArrayList<>();
|
||||
|
||||
static volatile boolean hook = false;
|
||||
|
||||
public RknnObjectDetector(String modelPath, List<String> labels, RknnJNI.ModelVersion version) {
|
||||
synchronized (lock) {
|
||||
objPointer = RknnJNI.create(modelPath, labels.size(), version.ordinal(), -1);
|
||||
detectors.add(objPointer);
|
||||
System.out.println(
|
||||
"Created " + objPointer + "! Detectors: " + Arrays.toString(detectors.toArray()));
|
||||
detectors.add(this);
|
||||
logger.debug(
|
||||
"Created detector "
|
||||
+ objPointer
|
||||
+ " from path "
|
||||
+ modelPath
|
||||
+ "! Detectors: "
|
||||
+ Arrays.toString(detectors.toArray()));
|
||||
}
|
||||
this.labels = labels;
|
||||
|
||||
// the kernel should probably alredy deal with this for us, but I'm gunna be paranoid anyways.
|
||||
if (!hook) {
|
||||
Runtime.getRuntime()
|
||||
.addShutdownHook(
|
||||
new Thread(
|
||||
() -> {
|
||||
System.err.println("Shutdown hook rknn");
|
||||
for (var d : detectors) {
|
||||
d.release();
|
||||
}
|
||||
}));
|
||||
hook = true;
|
||||
}
|
||||
}
|
||||
|
||||
public List<String> getClasses() {
|
||||
@@ -89,14 +111,14 @@ public class RknnDetectorJNI extends PhotonJNICommon {
|
||||
* @param boxThresh Minimum confidence for a box to be added. Basically just confidence
|
||||
* threshold
|
||||
*/
|
||||
public List<NeuralNetworkPipeResult> detect(CVMat in, double nmsThresh, double boxThresh) {
|
||||
public List<NeuralNetworkPipeResult> detect(Mat in, double nmsThresh, double boxThresh) {
|
||||
RknnResult[] ret;
|
||||
synchronized (lock) {
|
||||
// We can technically be asked to detect and the lock might be acquired _after_ release has
|
||||
// been called. This would mean objPointer would be invalid which would call everything to
|
||||
// explode.
|
||||
if (objPointer > 0) {
|
||||
ret = RknnJNI.detect(objPointer, in.getMat().getNativeObjAddr(), nmsThresh, boxThresh);
|
||||
ret = RknnJNI.detect(objPointer, in.getNativeObjAddr(), nmsThresh, boxThresh);
|
||||
} else {
|
||||
logger.warn("Detect called after destroy -- giving up");
|
||||
return List.of();
|
||||
@@ -114,7 +136,7 @@ public class RknnDetectorJNI extends PhotonJNICommon {
|
||||
synchronized (lock) {
|
||||
if (objPointer > 0) {
|
||||
RknnJNI.destroy(objPointer);
|
||||
detectors.remove(objPointer);
|
||||
detectors.remove(this);
|
||||
System.out.println(
|
||||
"Killed " + objPointer + "! Detectors: " + Arrays.toString(detectors.toArray()));
|
||||
objPointer = -1;
|
||||
@@ -124,14 +146,4 @@ public class RknnDetectorJNI extends PhotonJNICommon {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// public static void createRknnDetector() {
|
||||
// objPointer =
|
||||
// RknnJNI.create(
|
||||
// NeuralNetworkModelManager.getInstance()
|
||||
// .getDefaultRknnModel()
|
||||
// .getAbsolutePath()
|
||||
// .toString(),
|
||||
// NeuralNetworkModelManager.getInstance().getLabels().size());
|
||||
// }
|
||||
}
|
||||
|
||||
@@ -270,9 +270,13 @@ public class USBCameraSource extends VisionSource {
|
||||
if (getCameraConfiguration().cameraQuirks.hasQuirk(CameraQuirk.ArduOV9281)) {
|
||||
propMin = 1;
|
||||
propMax = 75;
|
||||
} else if (getCameraConfiguration().cameraQuirks.hasQuirk(CameraQuirk.ArduOV2311)) {
|
||||
propMin = 1;
|
||||
propMax = 140;
|
||||
}
|
||||
|
||||
var exposure_manual_val = MathUtils.map(Math.round(exposure), 0, 100, propMin, propMax);
|
||||
logger.debug("Setting camera exposure to " + exposure_manual_val);
|
||||
prop.set((int) exposure_manual_val);
|
||||
} else {
|
||||
scaledExposure = (int) Math.round(exposure);
|
||||
|
||||
@@ -41,7 +41,7 @@ public class FilterObjectDetectionsPipe
|
||||
}
|
||||
|
||||
private void filterContour(NeuralNetworkPipeResult contour) {
|
||||
var boc = contour.box;
|
||||
var boc = contour.bbox;
|
||||
|
||||
// Area filtering
|
||||
double areaPercentage = boc.area() / params.getFrameStaticProperties().imageArea * 100.0;
|
||||
|
||||
@@ -20,13 +20,13 @@ package org.photonvision.vision.pipe.impl;
|
||||
import org.opencv.core.Rect2d;
|
||||
|
||||
public class NeuralNetworkPipeResult {
|
||||
public NeuralNetworkPipeResult(Rect2d box2, Integer classIdx, Float confidence) {
|
||||
box = box2;
|
||||
public NeuralNetworkPipeResult(Rect2d boundingBox, int classIdx, double confidence) {
|
||||
bbox = boundingBox;
|
||||
this.classIdx = classIdx;
|
||||
this.confidence = confidence;
|
||||
}
|
||||
|
||||
public final int classIdx;
|
||||
public final Rect2d box;
|
||||
public final Rect2d bbox;
|
||||
public final double confidence;
|
||||
}
|
||||
|
||||
@@ -17,8 +17,17 @@
|
||||
|
||||
package org.photonvision.vision.pipe.impl;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.opencv.core.Core;
|
||||
import org.opencv.core.Mat;
|
||||
import org.opencv.core.Rect2d;
|
||||
import org.opencv.core.Scalar;
|
||||
import org.opencv.core.Size;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
import org.photonvision.common.configuration.NeuralNetworkModelManager;
|
||||
import org.photonvision.common.util.ColorHelper;
|
||||
import org.photonvision.jni.RknnDetectorJNI.RknnObjectDetector;
|
||||
import org.photonvision.vision.opencv.CVMat;
|
||||
import org.photonvision.vision.opencv.Releasable;
|
||||
@@ -30,8 +39,10 @@ public class RknnDetectionPipe
|
||||
private RknnObjectDetector detector;
|
||||
|
||||
public RknnDetectionPipe() {
|
||||
// For now this is hard-coded to defaults. Should be refactored into set pipe params, though.
|
||||
// And ideally a little wrapper helper for only changing native stuff on content change created.
|
||||
// For now this is hard-coded to defaults. Should be refactored into set pipe
|
||||
// params, though.
|
||||
// And ideally a little wrapper helper for only changing native stuff on content
|
||||
// change created.
|
||||
this.detector =
|
||||
new RknnObjectDetector(
|
||||
NeuralNetworkModelManager.getInstance().getDefaultRknnModel().getAbsolutePath(),
|
||||
@@ -39,6 +50,18 @@ public class RknnDetectionPipe
|
||||
NeuralNetworkModelManager.getInstance().getModelVersion());
|
||||
}
|
||||
|
||||
private static class Letterbox {
|
||||
double dx;
|
||||
double dy;
|
||||
double scale;
|
||||
|
||||
public Letterbox(double dx, double dy, double scale) {
|
||||
this.dx = dx;
|
||||
this.dy = dy;
|
||||
this.scale = scale;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<NeuralNetworkPipeResult> process(CVMat in) {
|
||||
var frame = in.getMat();
|
||||
@@ -48,7 +71,66 @@ public class RknnDetectionPipe
|
||||
return List.of();
|
||||
}
|
||||
|
||||
return detector.detect(in, params.nms, params.confidence);
|
||||
// letterbox
|
||||
var letterboxed = new Mat();
|
||||
var scale =
|
||||
letterbox(frame, letterboxed, new Size(640, 640), ColorHelper.colorToScalar(Color.GRAY));
|
||||
|
||||
if (letterboxed.width() != 640 || letterboxed.height() != 640) {
|
||||
// huh whack give up lol
|
||||
throw new RuntimeException("RGA bugged but still wrong size");
|
||||
}
|
||||
var ret = detector.detect(letterboxed, params.nms, params.confidence);
|
||||
|
||||
return resizeDetections(ret, scale);
|
||||
}
|
||||
|
||||
private List<NeuralNetworkPipeResult> resizeDetections(
|
||||
List<NeuralNetworkPipeResult> unscaled, Letterbox letterbox) {
|
||||
var ret = new ArrayList<NeuralNetworkPipeResult>();
|
||||
|
||||
for (var t : unscaled) {
|
||||
var scale = 1.0 / letterbox.scale;
|
||||
var boundingBox = t.bbox;
|
||||
double x = (boundingBox.x - letterbox.dx) * scale;
|
||||
double y = (boundingBox.y - letterbox.dy) * scale;
|
||||
double width = boundingBox.width * scale;
|
||||
double height = boundingBox.height * scale;
|
||||
|
||||
ret.add(
|
||||
new NeuralNetworkPipeResult(new Rect2d(x, y, width, height), t.classIdx, t.confidence));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
private static Letterbox letterbox(Mat frame, Mat letterboxed, Size newShape, Scalar color) {
|
||||
// from https://github.com/ultralytics/yolov5/issues/8427#issuecomment-1172469631
|
||||
var frameSize = frame.size();
|
||||
var r = Math.min(newShape.height / frameSize.height, newShape.width / frameSize.width);
|
||||
|
||||
var newUnpad = new Size(Math.round(frameSize.width * r), Math.round(frameSize.height * r));
|
||||
|
||||
if (!(frameSize.equals(newUnpad))) {
|
||||
Imgproc.resize(frame, letterboxed, newUnpad, Imgproc.INTER_LINEAR);
|
||||
} else {
|
||||
frame.copyTo(letterboxed);
|
||||
}
|
||||
|
||||
var dw = newShape.width - newUnpad.width;
|
||||
var dh = newShape.height - newUnpad.height;
|
||||
|
||||
dw /= 2;
|
||||
dh /= 2;
|
||||
|
||||
int top = (int) (Math.round(dh - 0.1f));
|
||||
int bottom = (int) (Math.round(dh + 0.1f));
|
||||
int left = (int) (Math.round(dw - 0.1f));
|
||||
int right = (int) (Math.round(dw + 0.1f));
|
||||
Core.copyMakeBorder(
|
||||
letterboxed, letterboxed, top, bottom, left, right, Core.BORDER_CONSTANT, color);
|
||||
|
||||
return new Letterbox(dw, dh, r);
|
||||
}
|
||||
|
||||
public static class RknnDetectionPipeParams {
|
||||
|
||||
@@ -61,7 +61,8 @@ public class PipelineManager {
|
||||
PipelineManager(
|
||||
DriverModePipelineSettings driverSettings,
|
||||
List<CVPipelineSettings> userPipelines,
|
||||
String uniqueName) {
|
||||
String uniqueName,
|
||||
int defaultIndex) {
|
||||
this.userPipelineSettings = new ArrayList<>(userPipelines);
|
||||
// This is to respect the default res idx for vendor cameras
|
||||
|
||||
@@ -70,10 +71,19 @@ public class PipelineManager {
|
||||
if (userPipelines.isEmpty()) addPipeline(PipelineType.Reflective);
|
||||
|
||||
calibration3dPipeline = new Calibrate3dPipeline(uniqueName);
|
||||
|
||||
// We know that at this stage, VisionRunner hasn't yet started so we're good to do this from
|
||||
// this thread
|
||||
this.setIndex(defaultIndex);
|
||||
updatePipelineFromRequested();
|
||||
}
|
||||
|
||||
public PipelineManager(CameraConfiguration config) {
|
||||
this(config.driveModeSettings, config.pipelineSettings, config.uniqueName);
|
||||
this(
|
||||
config.driveModeSettings,
|
||||
config.pipelineSettings,
|
||||
config.uniqueName,
|
||||
config.currentPipelineIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -173,6 +183,14 @@ public class PipelineManager {
|
||||
|
||||
private volatile int requestedIndex = 0;
|
||||
|
||||
/**
|
||||
* Grab the currently requested pipeline index. The VisionRunner may not have changed over to this
|
||||
* pipeline yet.
|
||||
*/
|
||||
public int getRequestedIndex() {
|
||||
return requestedIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method for setting the active pipeline. <br>
|
||||
* <br>
|
||||
|
||||
@@ -143,7 +143,7 @@ public class VisionModule {
|
||||
ntConsumer =
|
||||
new NTDataPublisher(
|
||||
visionSource.getSettables().getConfiguration().nickname,
|
||||
pipelineManager::getCurrentPipelineIndex,
|
||||
pipelineManager::getRequestedIndex,
|
||||
this::setPipeline,
|
||||
pipelineManager::getDriverMode,
|
||||
this::setDriverMode);
|
||||
@@ -156,6 +156,7 @@ public class VisionModule {
|
||||
(result) ->
|
||||
lastPipelineResultBestTarget = result.hasTargets() ? result.targets.get(0) : null);
|
||||
|
||||
// Sync VisionModule state with the first pipeline index
|
||||
setPipeline(visionSource.getSettables().getConfiguration().currentPipelineIndex);
|
||||
|
||||
// Set vendor FOV
|
||||
@@ -321,7 +322,7 @@ public class VisionModule {
|
||||
|
||||
void changePipelineType(int newType) {
|
||||
pipelineManager.changePipelineType(newType);
|
||||
setPipeline(pipelineManager.getCurrentPipelineIndex());
|
||||
setPipeline(pipelineManager.getRequestedIndex());
|
||||
saveAndBroadcastAll();
|
||||
}
|
||||
|
||||
@@ -329,9 +330,7 @@ public class VisionModule {
|
||||
pipelineManager.setDriverMode(isDriverMode);
|
||||
setVisionLEDs(!isDriverMode);
|
||||
setPipeline(
|
||||
isDriverMode
|
||||
? PipelineManager.DRIVERMODE_INDEX
|
||||
: pipelineManager.getCurrentPipelineIndex());
|
||||
isDriverMode ? PipelineManager.DRIVERMODE_INDEX : pipelineManager.getRequestedIndex());
|
||||
saveAndBroadcastAll();
|
||||
}
|
||||
|
||||
@@ -385,7 +384,7 @@ public class VisionModule {
|
||||
var ret = pipelineManager.calibration3dPipeline.tryCalibration();
|
||||
pipelineManager.setCalibrationMode(false);
|
||||
|
||||
setPipeline(pipelineManager.getCurrentPipelineIndex());
|
||||
setPipeline(pipelineManager.getRequestedIndex());
|
||||
|
||||
if (ret != null) {
|
||||
logger.debug("Saving calibration...");
|
||||
@@ -447,7 +446,7 @@ public class VisionModule {
|
||||
setVisionLEDs(pipelineSettings.ledMode);
|
||||
|
||||
visionSource.getSettables().getConfiguration().currentPipelineIndex =
|
||||
pipelineManager.getCurrentPipelineIndex();
|
||||
pipelineManager.getRequestedIndex();
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -511,7 +510,7 @@ public class VisionModule {
|
||||
ret.uniqueName = visionSource.getSettables().getConfiguration().uniqueName;
|
||||
ret.currentPipelineSettings =
|
||||
SerializationUtils.objectToHashMap(pipelineManager.getCurrentPipelineSettings());
|
||||
ret.currentPipelineIndex = pipelineManager.getCurrentPipelineIndex();
|
||||
ret.currentPipelineIndex = pipelineManager.getRequestedIndex();
|
||||
ret.pipelineNicknames = pipelineManager.getPipelineNicknames();
|
||||
ret.cameraQuirks = visionSource.getSettables().getConfiguration().cameraQuirks;
|
||||
|
||||
@@ -553,7 +552,7 @@ public class VisionModule {
|
||||
var config = visionSource.getSettables().getConfiguration();
|
||||
config.setPipelineSettings(pipelineManager.userPipelineSettings);
|
||||
config.driveModeSettings = pipelineManager.driverModePipeline.getSettings();
|
||||
config.currentPipelineIndex = Math.max(pipelineManager.getCurrentPipelineIndex(), -1);
|
||||
config.currentPipelineIndex = Math.max(pipelineManager.getRequestedIndex(), -1);
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ public class VisionModuleChangeSubscriber extends DataChangeSubscriber {
|
||||
parentModule.saveAndBroadcastAll();
|
||||
return;
|
||||
case "deleteCurrPipeline":
|
||||
var indexToDelete = parentModule.pipelineManager.getCurrentPipelineIndex();
|
||||
var indexToDelete = parentModule.pipelineManager.getRequestedIndex();
|
||||
logger.info("Deleting current pipe at index " + indexToDelete);
|
||||
int newIndex = parentModule.pipelineManager.removePipeline(indexToDelete);
|
||||
parentModule.setPipeline(newIndex);
|
||||
@@ -96,7 +96,7 @@ public class VisionModuleChangeSubscriber extends DataChangeSubscriber {
|
||||
return;
|
||||
case "changePipeline": // change active pipeline
|
||||
var index = (Integer) newPropValue;
|
||||
if (index == parentModule.pipelineManager.getCurrentPipelineIndex()) {
|
||||
if (index == parentModule.pipelineManager.getRequestedIndex()) {
|
||||
logger.debug("Skipping pipeline change, index " + index + " already active");
|
||||
return;
|
||||
}
|
||||
@@ -181,6 +181,9 @@ public class VisionModuleChangeSubscriber extends DataChangeSubscriber {
|
||||
parentModule.changePipelineType((Integer) newPropValue);
|
||||
parentModule.saveAndBroadcastAll();
|
||||
return;
|
||||
case "isDriverMode":
|
||||
parentModule.setDriverMode((Boolean) newPropValue);
|
||||
return;
|
||||
}
|
||||
|
||||
// special case for camera settables
|
||||
|
||||
@@ -56,7 +56,7 @@ public class PotentialTarget implements Releasable {
|
||||
}
|
||||
|
||||
public PotentialTarget(NeuralNetworkPipeResult det) {
|
||||
this.shape = new CVShape(new Contour(det.box), ContourShape.Quadrilateral);
|
||||
this.shape = new CVShape(new Contour(det.bbox), ContourShape.Quadrilateral);
|
||||
this.m_mainContour = this.shape.getContour();
|
||||
m_subContours = List.of();
|
||||
this.clsId = det.classIdx;
|
||||
|
||||
@@ -30,7 +30,7 @@ public class PipelineManagerTest {
|
||||
public void testUniqueName() {
|
||||
TestUtils.loadLibraries();
|
||||
PipelineManager manager =
|
||||
new PipelineManager(new DriverModePipelineSettings(), List.of(), "meme_name");
|
||||
new PipelineManager(new DriverModePipelineSettings(), List.of(), "meme_name", -1);
|
||||
manager.addPipeline(PipelineType.Reflective, "Another");
|
||||
|
||||
// We now have ["New Pipeline", "Another"]
|
||||
|
||||
@@ -131,18 +131,16 @@ public class DataSocketHandler {
|
||||
case SMT_DRIVERMODE:
|
||||
{
|
||||
// TODO: what is this event?
|
||||
var data = (HashMap<String, Object>) entryValue;
|
||||
var dmExpEvent =
|
||||
new IncomingWebSocketEvent<Integer>(
|
||||
DataChangeDestination.DCD_ACTIVEMODULE, "driverExposure", data);
|
||||
var dmBrightEvent =
|
||||
new IncomingWebSocketEvent<Integer>(
|
||||
DataChangeDestination.DCD_ACTIVEMODULE, "driverBrightness", data);
|
||||
var data = (Boolean) entryValue;
|
||||
var dmIsDriverEvent =
|
||||
new IncomingWebSocketEvent<Boolean>(
|
||||
DataChangeDestination.DCD_ACTIVEMODULE, "isDriver", data);
|
||||
DataChangeDestination.DCD_ACTIVEMODULE,
|
||||
"isDriverMode",
|
||||
data,
|
||||
cameraIndex,
|
||||
context);
|
||||
|
||||
dcService.publishEvents(dmExpEvent, dmBrightEvent, dmIsDriverEvent);
|
||||
dcService.publishEvents(dmIsDriverEvent);
|
||||
break;
|
||||
}
|
||||
case SMT_CHANGECAMERANAME:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
plugins {
|
||||
id "cpp"
|
||||
id "google-test-test-suite"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.1"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.2"
|
||||
|
||||
id "com.dorongold.task-tree" version "2.1.0"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
plugins {
|
||||
id "cpp"
|
||||
id "google-test-test-suite"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.1"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.2"
|
||||
|
||||
id "com.dorongold.task-tree" version "2.1.0"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
plugins {
|
||||
id "cpp"
|
||||
id "google-test-test-suite"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.1"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.2"
|
||||
|
||||
id "com.dorongold.task-tree" version "2.1.0"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
plugins {
|
||||
id "cpp"
|
||||
id "google-test-test-suite"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.1"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.2"
|
||||
|
||||
id "com.dorongold.task-tree" version "2.1.0"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
plugins {
|
||||
id "cpp"
|
||||
id "google-test-test-suite"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.1"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.2"
|
||||
|
||||
id "com.dorongold.task-tree" version "2.1.0"
|
||||
}
|
||||
@@ -12,8 +12,8 @@ repositories {
|
||||
}
|
||||
|
||||
wpi.maven.useDevelopment = true
|
||||
wpi.versions.wpilibVersion = "2024.3.1"
|
||||
wpi.versions.wpimathVersion = "2024.3.1"
|
||||
wpi.versions.wpilibVersion = "2024.3.2"
|
||||
wpi.versions.wpimathVersion = "2024.3.2"
|
||||
|
||||
apply from: "${rootDir}/../shared/examples_common.gradle"
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
plugins {
|
||||
id "java"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.1"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.2"
|
||||
}
|
||||
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
plugins {
|
||||
id "java"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.1"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.2"
|
||||
}
|
||||
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
plugins {
|
||||
id "java"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.1"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.2"
|
||||
}
|
||||
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
plugins {
|
||||
id "java"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.1"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.2"
|
||||
}
|
||||
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
plugins {
|
||||
id "java"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.1"
|
||||
id "edu.wpi.first.GradleRIO" version "2024.3.2"
|
||||
}
|
||||
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
@@ -11,8 +11,8 @@ apply from: "${rootDir}/../shared/examples_common.gradle"
|
||||
def ROBOT_MAIN_CLASS = "frc.robot.Main"
|
||||
|
||||
wpi.maven.useDevelopment = true
|
||||
wpi.versions.wpilibVersion = "2024.3.1"
|
||||
wpi.versions.wpimathVersion = "2024.3.1"
|
||||
wpi.versions.wpilibVersion = "2024.3.2"
|
||||
wpi.versions.wpimathVersion = "2024.3.2"
|
||||
|
||||
|
||||
// Define my targets (RoboRIO) and artifacts (deployable files)
|
||||
|
||||
Reference in New Issue
Block a user