Package edu.wpi.first.vision
Classes in the
edu.wpi.first.vision
package are designed to simplify using OpenCV vision
processing code from a robot program.
An example use case for grabbing a yellow tote from 2015 in autonomous:
public class Robot extends IterativeRobot
implements VisionRunner.Listener<MyFindTotePipeline> {
// A USB camera connected to the roboRIO.
private VideoSource
usbCamera;
// A vision pipeline. This could be handwritten or generated by GRIP.
// This has to implement VisionPipeline
.
// For this example, assume that it's perfect and will always see the tote.
private MyFindTotePipeline findTotePipeline;
private VisionThread
findToteThread;
// The object to synchronize on to make sure the vision thread doesn't
// write to variables the main thread is using.
private final Object visionLock = new Object();
// The pipeline outputs we want
private boolean pipelineRan = false; // lets us know when the pipeline has actually run
private double angleToTote = 0;
private double distanceToTote = 0;
@Override
public void copyPipelineOutputs(MyFindTotePipeline pipeline)
{
synchronized (visionLock) {
// Take a snapshot of the pipeline's output because
// it may have changed the next time this method is called!
this.pipelineRan = true;
this.angleToTote = pipeline.getAngleToTote();
this.distanceToTote = pipeline.getDistanceToTote();
}
}
@Override
public void robotInit() {
usbCamera = CameraServer.startAutomaticCapture(0);
findTotePipeline = new MyFindTotePipeline();
findToteThread = new VisionThread(usbCamera, findTotePipeline, this);
}
@Override
public void autonomousInit() {
findToteThread.start();
}
@Override
public void autonomousPeriodic() {
double angle;
double distance;
synchronized (visionLock) {
if (!pipelineRan) {
// Wait until the pipeline has run
return;
}
// Copy the outputs to make sure they're all from the same run
angle = this.angleToTote;
distance = this.distanceToTote;
}
if (!aimedAtTote()) {
turnToAngle(angle);
} else if (!droveToTote()) {
driveDistance(distance);
} else if (!grabbedTote()) {
grabTote();
} else {
// Tote was grabbed and we're done!
return;
}
}
}
-
Interface Summary Interface Description VisionPipeline A vision pipeline is responsible for running a group of OpenCV algorithms to extract data from an image.VisionRunner.Listener<P extends VisionPipeline> Listener interface for a callback that should run after a pipeline has processed its input. -
Class Summary Class Description VisionRunner<P extends VisionPipeline> A vision runner is a convenient wrapper object to make it easy to run vision pipelines from robot code.VisionThread A vision thread is a special thread that runs a vision pipeline.