fix frame timestamps to use a comparable epoch

steady_clock's epoch is unspecified and typically counts from process start or
boot, so the published timestamp_ns could not be compared against another
node's timestamps, wall clock or a recording — and it recorded when the node
processed the frame rather than when the camera captured it.

Publish two keys on every output instead: device_timestamp_ns from
sl::Camera::getTimestamp(TIME_REFERENCE::IMAGE), and host_timestamp_ns from
system_clock. Both are Unix-epoch nanoseconds, set as dora timestamp
parameters. The SDK clock source is pinned to SYSTEM_CLOCK at construction,
since it is process-wide and decides the epoch of the device value.

Both are kept because the wall clock can step when NTP synchronises after boot
on a Jetson, while the device timestamp is what two nodes reading the same
frame can agree on.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7g2cBJ5e3r15ZbJ9WZn8c
This commit is contained in:
cesar
2026-09-08 09:15:47 -03:00
co-authored by Claude Opus 5
parent 126dbf4f32
commit dc7f9f5501
5 changed files with 70 additions and 21 deletions
+10
View File
@@ -71,6 +71,11 @@ Config Config::from_env() {
}
Camera::Camera(const Config& config) : config_(config) {
// Process-wide, and must be set before any camera is opened. Without it the
// epoch of the timestamps published alongside every frame depends on the SDK
// default rather than on anything this node states.
sl::setTimestampClock(sl::TIMESTAMP_CLOCK::SYSTEM_CLOCK);
init_params_.camera_resolution = parse_resolution(config_.resolution);
init_params_.camera_fps = config_.fps;
init_params_.depth_mode = parse_depth_mode(config_.depth_mode);
@@ -135,6 +140,11 @@ Calibration Camera::calibration() const {
return result;
}
int64_t Camera::device_timestamp_ns() {
return static_cast<int64_t>(
zed_.getTimestamp(sl::TIME_REFERENCE::IMAGE).getNanoseconds());
}
sl::Mat& Camera::image() {
return image_mat_;
}