Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd"
SHA = "ea8e919c-243c-51af-8825-aaa63cd721ce"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
StructUtils = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42"
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
Tar = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e"
TensorCast = "02d47bb6-7ce6-556a-be16-bb1710789e2b"
Expand Down Expand Up @@ -64,6 +65,7 @@ SHA = "0.7, 1"
SparseArrays = "1.11"
StaticArrays = "1"
Statistics = "1.11"
StructUtils = "2.6.0"
Tables = "1.11.1"
Tar = "1.9"
TensorCast = "0.3.3, 0.4"
Expand Down
12 changes: 11 additions & 1 deletion docs/src/GraphData.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,17 @@ Labels are the principle identifier of a variable or factor.

#### Timestamps

Each variable or factor can have a timestamp associated with it.
Each variable or factor can have a timestamp associated with it representing when the physical event/observation occurred.

**Time Standard**: Timestamps use UTC-based time (Coordinated Universal Time) via the `TimeDateZone` type, not TAI (International Atomic Time). The key difference is that UTC includes leap seconds to keep synchronized with Earth's rotation, while TAI is a continuous monotonic time scale without leap seconds.

**Timezone Support**: While timestamps default to UTC (`tz"UTC"`), `TimeDateZone` supports any timezone (e.g., `tz"America/New_York"`, `tz"Europe/London"`). The timezone offset is preserved when stored and retrieved.

**Event Time vs Database Time**: The timestamp represents the physical event time (when a sensor measurement was taken, when a robot was at a pose, etc.), not when the variable was added to the database. Database metadata timestamps may be tracked separately by specific backend implementations.

**Temporal Uncertainty**: This single timestamp value is metadata and does not represent temporal uncertainty in non-parametric beliefs. For problems where time itself is a state variable requiring inference (e.g., using `SGal3` which includes temporal components), include time as part of your state type rather than relying on this metadata field.
Comment thread
Affie marked this conversation as resolved.
Outdated

Related functions:

- [`getTimestamp`](@ref)

Expand Down
16 changes: 14 additions & 2 deletions src/Common.jl
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,19 @@ function calcDeltatime(from::TimeDateZone, to::TimeDateZone)
end
calcDeltatime(from_node, to_node) = calcDeltatime(from_node.timestamp, to_node.timestamp)

function tdz_now(zone = tz"UTC") #TODO or default to slower localzone()?
Timestamp(args...) = TimeDateZone(args...)
function Timestamp(epoch::Val{:unix}, t::Nanosecond, zone = tz"UTC")
return TimeDateZone(TimeDate(1970) + t, zone)
end
function Timestamp(epoch::Val{:unix}, t::Float64, zone = tz"UTC")
return Timestamp(epoch, Nanosecond(t * 10^9), zone)
end
Timestamp(t::Float64, zone = tz"UTC") = Timestamp(Val(:unix), t, zone)
function Timestamp(epoch::Val{:rata}, t::Float64, zone = tz"UTC")
return TimeDateZone(convert(DateTime, Millisecond(t*10^3)), zone)
end

function now_tdz(zone = tz"UTC")
t = time()
return TimeDateZone(TimeDate(1970) + Nanosecond(t * 10^9), zone)
return Timestamp(t, zone)
end
2 changes: 1 addition & 1 deletion src/DataBlobs/entities/BlobEntry.jl
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ StructUtils.@kwarg struct Blobentry
""" Storage for a couple of bytes directly in the graph. Use with caution and keep it small and simple."""
metadata::JSONText = JSONText("{}")
""" When the Blob itself was first created. Serialized as an ISO 8601 string."""
timestamp::TimeDateZone = tdz_now()
timestamp::TimeDateZone = now_tdz()
""" Type version of this Blobentry."""
version::VersionNumber = DFG.version(Blobentry)
end
Expand Down
Loading
Loading