Skip to content

Commit 7b74e56

Browse files
basler: add hardware timestamp
1 parent 18aa601 commit 7b74e56

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

photon-core/src/main/java/org/photonvision/vision/frame/provider/BaslerFrameProvider.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public class BaslerFrameProvider extends CpuImageProcessor {
1616

1717
private Runnable connectedCallback;
1818

19-
// private long lastFrameTimestamp = 0;
19+
private long timeOffsetNs = 0;
20+
private boolean timeSyncDone = false;
2021

2122
public BaslerFrameProvider(GenericBaslerCameraSettables settables, Runnable connectedCallback) {
2223
this.settables = settables;
@@ -69,8 +70,6 @@ CapturedFrame getInputMat() {
6970
if (!cameraPropertiesCached && isConnected()) {
7071
onCameraConnected();
7172
}
72-
73-
// 1. Check if the C++ backend flagged this hardware as disconnected
7473
if (BaslerJNI.isCameraRemoved(settables.ptr)) {
7574
logger.error("Camera hardware was removed! Forcing pipeline restart.");
7675
throw new RuntimeException("Basler device physically disconnected.");
@@ -81,20 +80,26 @@ CapturedFrame getInputMat() {
8180
frame.setInfo(
8281
cameraMode.width, cameraMode.height, cameraMode.width * 3, cameraMode.pixelFormat);
8382

84-
var start = MathUtils.wpiNanoTime();
8583
BaslerJNI.awaitNewFrame(settables.ptr);
86-
84+
long hwTimestampNs = BaslerJNI.getLatestTimestamp(settables.ptr);
8785
long matPtr = BaslerJNI.takeFrame(settables.ptr);
88-
89-
// 2. Defensive check: If the pointer is 0, the grab failed or timed out.
86+
9087
if (matPtr == 0) {
91-
// Return an empty/dummy frame rather than crashing OpenCV
92-
return new CapturedFrame(new CVMat(), settables.getFrameStaticProperties(), start);
88+
return new CapturedFrame(
89+
new CVMat(), settables.getFrameStaticProperties(), MathUtils.wpiNanoTime());
9390
}
9491

92+
long currentWpiTimeNs = MathUtils.wpiNanoTime();
93+
if (!timeSyncDone && hwTimestampNs > 0) {
94+
timeOffsetNs = currentWpiTimeNs - hwTimestampNs;
95+
timeSyncDone = true;
96+
}
97+
98+
long synchronizedTimestamp = hwTimestampNs + timeOffsetNs;
99+
95100
Mat mat = new Mat(matPtr);
96101
CVMat ret = new CVMat(mat, frame);
97-
return new CapturedFrame(ret, settables.getFrameStaticProperties(), start);
102+
return new CapturedFrame(ret, settables.getFrameStaticProperties(), synchronizedTimestamp);
98103
}
99104

100105
@Override

0 commit comments

Comments
 (0)