Skip to main content

ros2_tui

Crates.io PyPI License: MIT Test Release

A powerful Terminal User Interface (TUI) for monitoring and managing ROS2 topics and parameters in real-time.

Screenshots

Topic overview Topic search Topic details
Namespace-aware topic tree with live publisher/subscriber counts, Hz, and delay. Fuzzy search to instantly filter topics across the graph. Per-topic detail view with Hz/delay history charts and live message echo.

Prerequisites

  • ROS2 installed and sourced
  • ros2 topic and ros2 param commands available in your shell

Installation

From pypi

pip install ros2-tui

From crates.io

cargo install ros2_tui

From Source

git clone https://github.com/TillBeemelmanns/ros2_tui.git
cd ros2_tui
cargo build --release

The binaries topics and params will be available at target/release/.

Try it in Docker (no local ROS2 needed)

A self-contained ROS2 Humble environment with dummy publishers and parameters is provided for quickly trying the TUIs:

./docker/run.sh topics   # build the image and launch the topics TUI
./docker/run.sh params   # launch the params TUI
./docker/run.sh shell    # drop into a ROS2 shell with the binaries on PATH

The container starts the ros2_tui_test dummy publishers automatically, so both TUIs come up populated with topics and parameters.

Topics TUI (topics)

Highlights

  • 📊 Real-time Hz/Delay monitoring backed by streaming ros2 topic hz / delay
  • 🌳 Namespace-aware topic tree with collapsible groups and instant search
  • 🎯 Watch-only metrics so large graphs stay responsive and low overhead
  • 🎨 Status indicators, Bollinger-band charts, and debug logging for on-call triage

Usage

# Start monitoring with default settings
topics

# Custom refresh rate (topics list updates every 5 seconds by default)
topics --refresh 10

Toggling a row with Enter starts Hz/Delay measurement. Unwatched topics stay lightweight, ensuring responsive navigation even with hundreds of topics.

Navigation & Controls

  • / or j/k move between topics; / or h/l collapse and expand namespaces
  • Enter toggles watching on the focused topic or expands/collapses a group
  • Tab toggles the current group; c collapses/expands all groups at once
  • s toggles simulation time when measuring delay metrics
  • F4 opens live search with auto-expansion; Space, r, or F5 refresh immediately
  • q, Esc, or Ctrl+C quit; --verbose writes detailed logs to topics_debug.log

Command-Line Options

  • --refresh <SECONDS> – Topic list refresh cadence (default: 5)
  • --detail-refresh <SECONDS> – Legacy detail polling interval (still accepted)
  • --no-initial-fetch – Skip the initial ros2 topic list call
  • --help, --version – Standard metadata flags

Architecture Highlights

  • Background workers keep ros2 topic list -v, ros2 topic hz, and ros2 topic delay streaming without blocking the UI
  • Crossbeam channels drive a non-blocking event loop that renders at ~5 FPS and processes input instantly
  • Watched topics maintain FIFO histories (including std dev) to power Bollinger-band charts and statistical readouts
  • Selective monitoring conserves system resources by spawning measurement processes only when needed

Params TUI (params)

Highlights

  • 🧭 Node/namespace browser that mirrors ros2 param list hierarchies
  • 🔄 Live value polling keeps displayed values fresh without manual refreshes
  • ✏️ In-terminal editing with type validation plus YAML dump/load workflows
  • 🧰 Built-in search, success/error banners, and contextual help overlays

Usage

# Parameter dashboard with 5 second refresh
params

# Faster poll rate for parameters
params --refresh 2

The app groups dotted parameter names into expandable namespaces so large graphs stay navigable. Value edits, dumps, and loads run through the ROS2 CLI and report their outcome inline.

Navigation & Controls

  • / or j/k move through nodes and parameters; / or h/l collapse/expand namespaces
  • ? opens the help overlay; F4 enters search mode with persistent filtering
  • Space, r, or F5 refresh on demand; Esc exits dialogs, cancels search, or quits

Parameter Actions

  • s edits the selected parameter (array values are normalised for ROS2 compatibility)
  • d dumps the current node to YAML via ros2 param dump
  • Ctrl+l loads YAML into the active node using ros2 param load
  • Inline success/error banners acknowledge operations and fade automatically

Command-Line Options

  • --refresh <SECONDS> – Parameter polling cadence (default: 5)
  • --no-initial-fetch – Skip the initial ros2 param list scan
  • --verbose / -v – Emit detailed logs to params_debug.log
  • --help, --version – Standard metadata flags

Architecture Highlights

  • A primary watcher repeatedly shells out to ros2 param list, building a ParamTree that mirrors node hierarchies
  • A secondary watcher streams value lookups to populate the table without blocking the UI thread
  • Dump/load/edit workflows wrap the ROS2 CLI while scheduling delayed refreshes to reflect state changes
  • All ROS2 interaction happens on background threads, keeping the Crossterm-driven interface responsive under load

Development

Building

cargo build --release

Testing

cargo test
cargo check

Before Pushing

Check formatting

cargo fmt --all -- --check

Lint code

cargo clippy --all-targets --all-features -- -D warnings

Release Safety Check

Configure Git once so the bundled pre-push hook runs before release pushes:

git config core.hooksPath .githooks

When you push a tag such as v0.3.0, the hook calls scripts/check-release-version.sh and verifies the tag matches the Cargo.toml version. The push is rejected if they diverge, keeping release tags in sync with the crate metadata.

Comparison with Other Tools

Tool Language Dependencies Features Performance
topics (ours) Rust ros2 CLI only TUI, Real-time metrics ⚡ Fast & Easy
params (ours) Rust ros2 CLI only TUI, Parameter management ⚡ Fast & Easy
rqt_topic Python Full ROS2 + Qt GUI, Rich features 🐌 Heavy
ros2 topic Python Full ROS2 CLI only 🚀 Fast but cumbersome

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

  • Inspired by turm - A TUI for the Slurm Workload Manager
  • Built with ratatui - A Rust library for building rich terminal interfaces

Roadmap

Planned features, improvements, and fixes are tracked in ROADMAP.md.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

ros2_tui-0.1.7-py3-none-musllinux_1_2_x86_64.whl (3.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ros2_tui-0.1.7-py3-none-musllinux_1_2_i686.whl (3.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ros2_tui-0.1.7-py3-none-musllinux_1_2_armv7l.whl (2.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ros2_tui-0.1.7-py3-none-musllinux_1_2_aarch64.whl (3.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ros2_tui-0.1.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ros2_tui-0.1.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (3.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ros2_tui-0.1.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (4.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ros2_tui-0.1.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (3.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ros2_tui-0.1.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (2.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ros2_tui-0.1.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

File details

Details for the file ros2_tui-0.1.7-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ros2_tui-0.1.7-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0b86a2f84e1ce57888c10ed8d2dac859a4b5719fd04ab3e37d908a7a5bb0a6d8
MD5 c663326b57089eb3e64326c764f3fd7c
BLAKE2b-256 da39c33f5f6b30e24cd791f2c89997a33364f58b1c99da9f6b7c633409d3af7e

See more details on using hashes here.

File details

Details for the file ros2_tui-0.1.7-py3-none-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ros2_tui-0.1.7-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 2697f9930fa7f816287b5c4118fc1ba40cfaff87a048f3a0c7ef6e1534249a84
MD5 216b643598045e2201cfafc1612375ac
BLAKE2b-256 569d3bfc51e6c9fe7d339879ee1ee0ddaaddd9eb66956b1520d26bfaed35244c

See more details on using hashes here.

File details

Details for the file ros2_tui-0.1.7-py3-none-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for ros2_tui-0.1.7-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 b1fa6b556d101eb12deb6e0978b1cf532158189da9a9f566b0125cb73df2616b
MD5 9a23e5374cf5970b1fb4b6858b2236a6
BLAKE2b-256 757c9b3d7c91af5a4e50887b9e74702eeeafddeece00a297f148557c45c31f04

See more details on using hashes here.

File details

Details for the file ros2_tui-0.1.7-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for ros2_tui-0.1.7-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6e9e283870918612c6e32c42bd2578ea466ad2d4d9483d2651761345e8b1993b
MD5 82fbb66bfe3daee6d61f94a08bfc4b03
BLAKE2b-256 0cc731a7ee6d0f1b7537df538501eb6c94fbdb77824e983585b0c1797b8b78f8

See more details on using hashes here.

File details

Details for the file ros2_tui-0.1.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ros2_tui-0.1.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b805b05ff157ba8de821a7becf1a65774fed2f4f3d41bd7ed7dfcee58f944200
MD5 8739b7c841e9b239d591ab564f0d8421
BLAKE2b-256 c4fe4a324bf02b66ec890ddd8a8f893f1df563d64192d58dd4f3731668e6f4ee

See more details on using hashes here.

File details

Details for the file ros2_tui-0.1.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for ros2_tui-0.1.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 9597cc187c73ff86792e2453d66e13715a765184019c0f202383aa02b305164b
MD5 a45a8344f3f5f31ce83ac46f03406943
BLAKE2b-256 b662b6719ce9c350e5ad9b0c1522008d630908ee14ca98705d2db0fbced66b9e

See more details on using hashes here.

File details

Details for the file ros2_tui-0.1.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for ros2_tui-0.1.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 9b329ad86321770a99f782ff42a774b19ebe116488bd229836ff97c9fba1fc75
MD5 51cc973285fbf832d77fa6e39cb22915
BLAKE2b-256 d24ee5f27803ef65fcb22827cd963ef17836d430414e0e25ee4c290d5fca92a2

See more details on using hashes here.

File details

Details for the file ros2_tui-0.1.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ros2_tui-0.1.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 12450610985fa692b927c22994ae45c1856f8e5388024c4456be1daa91a8dec6
MD5 b006a05d2372fc7dc4790c8f5ad947ab
BLAKE2b-256 4cbb014508df10802c048c329e88be2d817cde9031aa845ced1eb938fdbd4f51

See more details on using hashes here.

File details

Details for the file ros2_tui-0.1.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for ros2_tui-0.1.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 059f014d10c055117ee7203cb68f499e27886090a1e761c728376aece9d73a88
MD5 2c5ca2df52dfb974fefba5974a48011d
BLAKE2b-256 485607a92e74191a9b2ead1e13ad123050ce084ddbf3faabb6635a1b1ae372b5

See more details on using hashes here.

File details

Details for the file ros2_tui-0.1.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ros2_tui-0.1.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9a9843157043acc3491b4fa841d49e0f9e1b7d483331447acb89a0724f33f4bc
MD5 28cfd1dafa1b52ee11600a40696263a7
BLAKE2b-256 a9db4a57e03ee341e00a2072f856bcae140677b1b4dba90ba1b6dd25592eaaaa

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.7 This release

10 files

0.1.6

10 files

0.1.5

10 files

0.1.4

10 files

0.1.3

10 files

0.1.2

10 files

0.1.0

10 files

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