Halcyon
An open manipulation stack that ships Dalaran recordings as its bug-report format.
The primitives to log, understand and improve your data loop. Built for multi-rate, multimodal recordings — from the first frame on a laptop to a fleet's worth of drives.
A walkthrough of the DROID dataset in the viewer.
DROID is a robot-manipulation dataset recorded across a wide spread of real environments, intended for training manipulation policies. Every frame pairs joint-level sensor readings from the arm with synchronized footage from three stereo cameras — one at the wrist, one on each side — alongside the action taken: the target position and velocity issued by the teleoperator.
Because each stream carries its own rate and its own clock, it is a good stress test for the time engine: the wrist camera, the side cameras and the joint telemetry all land on one scrubber without being resampled to a common rate first.
The example ships with the SDK. It downloads a slice of the dataset on first run and opens the layout shown above.
Loading a robot description once, then animating its joints from changing angles.
A URDF describes a robot once — its links, its joints, and how they connect. The pose is not part of that description; it is whatever you log per frame. Separating the two is the whole trick, and it is why the mesh only has to be sent a single time no matter how long the run lasts.
On site, that means the phone clip on the left and the viewer on the right are the same recording: the hardware moves, the joint angles stream in, and the arm in the viewer follows without anyone re-exporting geometry.
import dalaran as dl
from dalaran.urdf import UrdfTree
# Send the robot description once. Static, because the mesh is not a
# function of time -- only the pose is.
rec.log_file_from_path(urdf_path, static=True)
# Parse the same file into a tree we can walk.
urdf_tree = UrdfTree.from_file_path(urdf_path)
# Then drive it: one transform per moving joint, per frame.
for joint in urdf_tree.joints():
if joint.joint_type == "revolute":
# compute_transform folds the joint origin together with the current
# angle and returns something ready to log, frame names already set.
transform = joint.compute_transform(angle)
rec.log("transforms", transform)
A library you import and a file you can archive — not a platform you migrate to. The core is Apache-2.0, the format is self-describing, and nothing phones home.
pip install dalaran-sdk dalaran
cargo add dalaran cargo install dalaran-cli
FetchContent_Declare(dalaran URL .../dalaran_cpp_sdk.zip) target_link_libraries(my_app PRIVATE dalaran::dalaran)
Point clouds, video, meshes, tensors, transforms and scalars in one scene, on one clock.
Pull frames as dataframes, add derived columns, and filter without copying the recording.
Write multi-rate data as column chunks in .dlr files, or convert from what you already have.
We're an active contributor to the projects we build on.
The production backend for the Dalaran data layer. Catalog, byte-range indexing, and streaming playback over recordings you already have.
Run any SQL or dataframe query across your catalog, down into the columns, time ranges and values inside your recordings — not just their metadata.
Add derived columns and evolve schemas without breaking history. You run the transforms with the SDK; Hub keeps the derived data and your raw recordings organized together.
Express a dataset mix as a query and stream it to your GPUs. The dataloader is column-aware and video-codec-aware, so you train directly on your recordings.
One viewer, the same recordings, shared across the team. Explore, annotate, and trace a failure back to the data that caused it.
Reconstruction runs on multimodal, multi-rate data, and handling that data is most of the work. This is a worked example of what the Dalaran layer removes from a real project: 5,015 indoor scans converted into recordings that the viewer, the dataframe API and the PyTorch dataloader all read directly, with no export step in between.
An open manipulation stack that ships Dalaran recordings as its bug-report format.
A splat trainer that streams every densification step straight into the viewer.
Visual-inertial SLAM with live trajectory, landmarks and covariance overlays.
Egocentric capture glasses publishing multi-sensor sessions as open recordings.
One command, no account, no config file. The viewer opens itself the first time you log something.