Graphs, drag & drop and undo

Rerun is building the multimodal data stack for robotics and spatial intelligence. Many of the structures and computations in these fields can be modeled as graphs, for example ROS graphs, semantic scene graphs, belief networks, action graphs, and pose graphs. We're therefore super excited to release our first iteration of a Graph view in Rerun 0.21, powered by the new GraphNodes and GraphEdges archetypes. Check out a live demo here.

This first version of the view comes without some features we'd like to add over time like support for hierarchical and multi-entity graphs, the ability to associate data with edges, and more layout engines. But it's already quite powerful and will hopefully be super useful for the community already.

The second big push for the Rerun 0.21 release has been to address a couple highly demanded UX related features; dragging and dropping entities from the blueprint or streams panels into views, general undo in the viewer, a grid guide for 3D views, built-in view screenshots, and breadcrumbs for improved navigation in the selection panel. We really hope you like it!

Implementing undo by time traveling in the blueprint database implementing-undo-by-time-traveling-in-the-blueprint-database

One of the biggest UX problems in the Rerun viewer has been the lack of undo and redo operations. When you can't undo an edit you did, it makes you much less confident in just exploring and trying things. In a complex application like the Rerun viewer, undo and redo is one of those "sounds simple but gets complex fast" kind of features.

Luckily, we've had this in mind from the beginning when designing the core data model of the viewer with blueprints. The state of the viewer (or most of it at least) is represented in blueprints. We store all blueprints in the same kind of multimodal time-series database we use to store multimodal recordings.

Any data that can be logged or sent to Rerun can therefore also be put directly in the blueprint. This means we can leave it up to the user what data should be seen as "data" and what data should be seen as "styling". It also means we can use the same time-traveling functionality we have for recordings to implement undo and redo in the viewer. On top of that we can use the garbage collection and compaction functionality of the database to make sure the blueprint database doesn't grow too big over time. r

A new graph layout engine in Rust inspired by d3-force a-new-graph-layout-engine-in-rust-inspired-by-d3force

An important design consideration for the new graph view is how to lay out graphs visually. There are many ways to lay out graphs but the most popular approaches are force-based layouts (usually via simple physics simulation), Graphviz-like layouts, and more structured specialized layouts like trees or radial trees. Over time we'd love to support all these in Rerun but we wanted to start with the most versatile baseline layout engine.

Graphviz-style (specifically dot) layouts are popular for drawing hierarchical graph diagrams and are great for things like ROS topics, complex data structures, and software architecture. The downside is that they are very slow for large graphs and don't work well for graphs that vary over time since you need to re-layout from scratch every time the graph changes, which makes the visualization slow and jumpy.

Specialized layouts like trees can be both fast and look great but require stronger assumptions on the underlying data. We want you to be able to use Rerun for a wide variety of data so these options don't make sense as a starting point.

Force-based layout engines are flexible, fast, and can be made to work well for generic time-varying graphs. The problem here was that there were no existing layout engine libraries that met our needs. They were all either lacking important forces, hard to read out intermediate results from, or brought in huge dependency trees. We also wanted a layout engine that was as similar as possible to d3-force, which is a great library and has become the standard for interactive graph visualizations.

We therefore implemented a new force-based node layout engine, Fjädra. It's pure Rust with no dependencies, compiles to wasm easily and is designed to match d3-force as close as possible. It's been working great for us so far and can hopefully be useful others in the community as well.

Try it out and let us know what you think try-it-out-and-let-us-know-what-you-think

We're really excited to hear both how these new UX improvements and the new view works for you. There will be more coming on the UX front and we'd love input from the community on what to prioritize next in the land of graphs.

Join us on Github or Discord and show us what you've built, let us know what you think, and what you hope to see in the future.