Skip to main content

tf_tree

crates.io docs.rs PyPI CI Licence

A transform tree: it stores time-stamped poses between named frames and answers "where was frame A relative to frame B at time t?". Use it in a control loop, across processes on one host, or in a dataloader with no robot attached.

It is faster than ROS tf2 (below) but is not tf2: no ROS dependency and no drop-in tf2_ros::Buffer, only a one-way /tf ingest bridge (0008). Linux first: shared memory and frozen .tft files are Linux-only (shm feature); the in-process engine is portable.

0.0.x promises nothing between releases. Pin exactly (CHANGELOG.md).

Install

  • Rust: cargo add tf_tree
  • Python: pip install transform_tree, then import tf_tree
  • CLI (tf_tree, alias tft): a binary from the latest release, or cargo install --path crates/tf_tree_cli --features shm
  • C ABI, C++ header, ROS 2 bridge: just c-abi-check, just cpp-check, just ros-build

Quickstart

Python, from scratch (just quickstart runs this). Stamps are integer nanoseconds; a pose is [qw, qx, qy, qz, x, y, z].

import tf_tree

tree = tf_tree.build([("map", "base"), ("base", "cam")])
tf_tree.push(tree, "base", "map", 1_000, [1, 0, 0, 0, 1.0, 2.0, 3.0])
tf_tree.push(tree, "base", "map", 2_000, [1, 0, 0, 0, 3.0, 4.0, 5.0])

plan = tree.plan("map", "base")   # compile the route once, reuse it
print(plan.at(1_500)[:3, 3])      # -> [2. 3. 4.]

Rust:

use tf_tree::{Capacity, EdgeCfg, Iso3, Quat, Stamp, TreeBuilder, Vec3};

let tree = TreeBuilder::new()
    .static_edge("base_link", "lidar_top", &Iso3::IDENTITY)   // (parent, child)
    .dynamic_edge("odom", "base_link", EdgeCfg::new(Capacity::history(100.0, 10.0)))
    .build()
    .expect("layout");
let odom = tree.frame("odom").expect("declared");
let base_link = tree.frame("base_link").expect("declared");
let lidar_top = tree.frame("lidar_top").expect("declared");

let w = tree.claim(base_link, odom).expect("unclaimed");   // (child, parent)
let at_x = |x| Iso3::new(Quat::IDENTITY, Vec3::new(x, 0.0, 0.0));
w.push(1_000_000_000, &at_x(0.0)).expect("monotonic");
w.push(1_010_000_000, &at_x(1.0)).expect("monotonic");

let plan = tree.plan(odom, lidar_top).expect("connected");
let g = tree.guard();
let t: Stamp = Stamp::from_nanos(1_005_000_000);
let pose = plan.at(&g, t).expect("in range");
assert!((pose.t.x - 0.5).abs() < 1e-12);

From a recorded bag

MCAP only (for .db3, run ros2 bag convert first):

tft doctor --from-bag drive.mcap                 # what is wrong with this /tf traffic
tft freeze --from-bag drive.mcap -o drive.tft    # index it
tree = tf_tree.open_file("drive.tft")   # an mmap; open per worker, after fork/spawn
poses = tree.plan("base_link", "lidar_top").at(stamps_ns, layout="quat_twist")  # (N, 13)

Against tf2

In-process, one thread, same interpolation, tf2 called natively; 4-core EPYC-Milan, not core-pinned. Both agree to 7e-15 on 50,000 recorded queries.

tf_tree tf2
Lookup, depth 3 94 ns 253 ns 2.7×
Lookup, depth 15 1193 ns 7337 ns 6.2×
Publish 9.4 ns 114 ns 12.1×

Without LTO the lookup gap is 1.8×; through the C ABI, 1.5×. Method: tf2.md; sources: EVIDENCE.md.

Not for

Need Why See
Drop-in tf2_ros::Buffer gated, not scheduled PHASE7.md
Covariance, multi-parent frames, loop closure cut 0009
Transforms across hosts not started PROJECT.md §4
Shared memory or .tft off Linux not implemented SUPPORT.md
A viewer, point-cloud deskewing deliberately absent PHASE5.md §8

Status

Phase Status
1 Engine: arena, seqlock buffers, plans, SE(3) math Implemented
2 Shared memory across processes Implemented, with gaps
3 Python bindings Implemented
4 C ABI, C++ wrapper, ROS 2 ingest, derivatives Implemented, with gaps
5 Frozen .tft, bag ingestion, diagnostics, tf_tree top Mostly implemented
6–8 Continuous time, tf2 shim, multi-host Not started

The §0.0 tables in PHASE2, PHASE4 and PHASE5 win over this one.

Shared memory is not a sandbox

Processes sharing an arena trust each other: a read-write participant can corrupt it (PHASE2.md §3.10; SECURITY.md). A read-only participant (the default for readers) cannot, and a crashed or hung one cannot wedge the others.

fork() is the sharp edge: a child's inherited handles report ChildDetached. Python's multiprocessing forks by default on Linux, so open the arena inside the worker or use spawn. A frozen .tft survives a fork.

Layout

crates/: tf_tree_math, tf_tree_arena, tf_tree_core, tf_tree (facade), tf_tree_ipc, tf_tree_c, tf_tree_bridge, tf_tree_ingest, tf_tree_py, tf_tree_bench, tf_tree_tf2_sys, tf_tree_cli. ros/ holds the ROS 2 packages. tf_tree_py, tf_tree_tf2_sys and ros/ sit outside the cargo workspace and have their own just recipes. Five crates publish: tf_tree, tf_tree_core, tf_tree_math, tf_tree_arena, tf_tree_ipc. MSRV 1.87.

Docs: docs/README.md · CONTRIBUTING.md · SUPPORT.md · SECURITY.md · CODE_OF_CONDUCT.md

Licence

Dual MIT / Apache-2.0, at your option. See NOTICE.

Metadata

Release files for transform-tree 0.0.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for transform-tree 0.0.8
File Size Uploaded Provenance Actions
transform_tree-0.0.8.tar.gz 630.4 kB With provenance Details for transform_tree-0.0.8.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for transform-tree 0.0.8
File Actions
transform_tree-0.0.8-cp314-cp314t-win_amd64.whl CPython 3.14 CPython 3.14 free-threading Windows x86-64 Details for transform_tree-0.0.8-cp314-cp314t-win_amd64.whl
transform_tree-0.0.8-cp314-cp314t-manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ x86-64 Details for transform_tree-0.0.8-cp314-cp314t-manylinux_2_28_x86_64.whl
transform_tree-0.0.8-cp314-cp314t-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64 Details for transform_tree-0.0.8-cp314-cp314t-manylinux_2_28_aarch64.whl
transform_tree-0.0.8-cp314-cp314t-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 Details for transform_tree-0.0.8-cp314-cp314t-macosx_11_0_arm64.whl
transform_tree-0.0.8-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details for transform_tree-0.0.8-cp39-abi3-win_amd64.whl
transform_tree-0.0.8-cp39-abi3-musllinux_1_2_x86_64.whl CPython 3.9 abi3 Linux musl 1.2+ x86-64 Details for transform_tree-0.0.8-cp39-abi3-musllinux_1_2_x86_64.whl
transform_tree-0.0.8-cp39-abi3-musllinux_1_2_aarch64.whl CPython 3.9 abi3 Linux musl 1.2+ ARM64 Details for transform_tree-0.0.8-cp39-abi3-musllinux_1_2_aarch64.whl
transform_tree-0.0.8-cp39-abi3-manylinux_2_28_x86_64.whl CPython 3.9 abi3 Linux glibc 2.28+ x86-64 Details for transform_tree-0.0.8-cp39-abi3-manylinux_2_28_x86_64.whl
transform_tree-0.0.8-cp39-abi3-manylinux_2_28_aarch64.whl CPython 3.9 abi3 Linux glibc 2.28+ ARM64 Details for transform_tree-0.0.8-cp39-abi3-manylinux_2_28_aarch64.whl
transform_tree-0.0.8-cp39-abi3-macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 11.0+ ARM64 Details for transform_tree-0.0.8-cp39-abi3-macosx_11_0_arm64.whl
transform_tree-0.0.8-cp39-abi3-macosx_10_12_x86_64.whl CPython 3.9 abi3 macOS 10.12+ x86-64 Details for transform_tree-0.0.8-cp39-abi3-macosx_10_12_x86_64.whl

Total release size: 8.2 MB

Release files / transform_tree-0.0.8.tar.gz

Download URL transform_tree-0.0.8.tar.gz
Size 630.4 kB
Tags Source
SHA-256 checksum
How to use checksums
97bfd6674c8da083291cb0976537c2da531a0c7326c231ad1615a09d02cf0256
BLAKE2b-256 checksum
How to use checksums
9b291cf8be35000bef805947862c0ae5d25d8edb06ae02e76b5ba01a0c86666f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / transform_tree-0.0.8-cp314-cp314t-win_amd64.whl

Download URL transform_tree-0.0.8-cp314-cp314t-win_amd64.whl
Size 581.3 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
76f1f55d995af7e90ad0347750574654e921562f91ba1f985999cb6e09ce158f
BLAKE2b-256 checksum
How to use checksums
226afa92f80e4c68841b1b2e68f8546c7cf5aac9dcb4db50a107f1638036cbc9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / transform_tree-0.0.8-cp314-cp314t-manylinux_2_28_x86_64.whl

Download URL transform_tree-0.0.8-cp314-cp314t-manylinux_2_28_x86_64.whl
Size 727.0 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
54c210e1a300462ca6f144bb8003a31db477c0a30a96e71d51de6ac79956b183
BLAKE2b-256 checksum
How to use checksums
cf34bb9a5c51b65adf30a22368a09086b1588405c3c146335b15c9f768c60ecf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / transform_tree-0.0.8-cp314-cp314t-manylinux_2_28_aarch64.whl

Download URL transform_tree-0.0.8-cp314-cp314t-manylinux_2_28_aarch64.whl
Size 671.3 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
05b2f8f2df51f72ee011f4105f1e12db35a957fd17d07b4add90d4494bbc2e0d
BLAKE2b-256 checksum
How to use checksums
121cd9f8549bfefe5815ae53d1b6ca48bbdcdce74aa19464644810da9aa0c721
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / transform_tree-0.0.8-cp314-cp314t-macosx_11_0_arm64.whl

Download URL transform_tree-0.0.8-cp314-cp314t-macosx_11_0_arm64.whl
Size 580.0 kB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
878b4456d3eb1e331e0bce20168b40a178e276182169da4ff94858b9b80105ab
BLAKE2b-256 checksum
How to use checksums
5aa1cbf1a65997acbfb6dc3d3f81964277d83f993c7dc86b60d139aadcddba1b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / transform_tree-0.0.8-cp39-abi3-win_amd64.whl

Download URL transform_tree-0.0.8-cp39-abi3-win_amd64.whl
Size 595.5 kB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
d0057f5fcf76bfd933c681208ba8a3752ef82f2a287e3794caf656d4e9e9af26
BLAKE2b-256 checksum
How to use checksums
1f2f2dce602153d88c3bb6360950b0716972896909c331ab2fa9c10fe036a0b9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / transform_tree-0.0.8-cp39-abi3-musllinux_1_2_x86_64.whl

Download URL transform_tree-0.0.8-cp39-abi3-musllinux_1_2_x86_64.whl
Size 950.1 kB
Tags CPython 3.9 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
9b5603068ef486b02cffdf38cc1d777cb28996a9e4c3892151f7e97e8731c857
BLAKE2b-256 checksum
How to use checksums
a37d017f3e30588a0942573882a3a590ce6ab985c5e0d9ab00174408fc743422
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / transform_tree-0.0.8-cp39-abi3-musllinux_1_2_aarch64.whl

Download URL transform_tree-0.0.8-cp39-abi3-musllinux_1_2_aarch64.whl
Size 858.0 kB
Tags CPython 3.9 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
deb100fe2112ff2e44b57eeb9b4bf9c0c29dfd2dc41f137c051fc78f5e4d9b80
BLAKE2b-256 checksum
How to use checksums
7e7f832229f3834f3aa8b23a235e6d9f89d3f108f03bbd4a74d8238e27733fed
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / transform_tree-0.0.8-cp39-abi3-manylinux_2_28_x86_64.whl

Download URL transform_tree-0.0.8-cp39-abi3-manylinux_2_28_x86_64.whl
Size 735.9 kB
Tags CPython 3.9 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
814b19700aa5c4457f4bf46e7395c21d5e2bc274ec60314306bd336d6b3bc6a2
BLAKE2b-256 checksum
How to use checksums
15703681b6e60010cd7773b0329bd2a9147d99ee144951a2b8c846b34a5848c3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / transform_tree-0.0.8-cp39-abi3-manylinux_2_28_aarch64.whl

Download URL transform_tree-0.0.8-cp39-abi3-manylinux_2_28_aarch64.whl
Size 680.4 kB
Tags CPython 3.9 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
dea55a2e1d576ef225a17a4114cefd5522561bcdd67adc0757fd7a7116e34dbe
BLAKE2b-256 checksum
How to use checksums
e995a500671543ce29eb28efa699f6faa6d5cba46ee9291bc09b405d59ec99ec
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / transform_tree-0.0.8-cp39-abi3-macosx_11_0_arm64.whl

Download URL transform_tree-0.0.8-cp39-abi3-macosx_11_0_arm64.whl
Size 590.3 kB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
71ec0d0061d130448d07ba1308eb0a6d7996c0d264afc97bad2babcf32fc8b19
BLAKE2b-256 checksum
How to use checksums
2bc94def65da0f0808c9b4268de182e7d5f48b526f00965d9a9227ea5d2e5ef8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / transform_tree-0.0.8-cp39-abi3-macosx_10_12_x86_64.whl

Download URL transform_tree-0.0.8-cp39-abi3-macosx_10_12_x86_64.whl
Size 639.3 kB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
e4848754fd514a0227a504c0a901b29ec97e291220142a064f761ed97539e079
BLAKE2b-256 checksum
How to use checksums
dcd75e0f47d813bb36774f836001e3906d467c61b92ce2ce1c5072af859f53c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Security for transform-tree 0.0.8

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 12 files in this release have been uploaded with provenance metadata.

Select from 12 files

Attestation for transform_tree-0.0.8.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page