Skip to main content

A Terminal User Interface (TUI) for monitoring and managing ROS2 topics and parameters

Project description

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.

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/topics.git
cd topics/topics
cargo build --release

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

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 Rust ros2 CLI only TUI, Real-time metrics ⚡ Fast
params Rust ros2 CLI only TUI, Parameter management ⚡ Fast
rqt_topic Python Full ROS2 + Qt GUI, Rich features 🐌 Heavy
ros2 topic Python Full ROS2 CLI only 🚀 Fast but limited

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

  • Topic filtering and search (F4 search mode)
  • Hierarchical topic grouping with collapsible groups
  • Add topic message preview/echo functionality
  • services app
  • actions app

Project details


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.3-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.3-py3-none-musllinux_1_2_i686.whl (3.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

ros2_tui-0.1.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ros2_tui-0.1.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (3.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ros2_tui-0.1.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (4.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ros2_tui-0.1.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (3.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ros2_tui-0.1.3-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.3-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.3-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ros2_tui-0.1.3-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1dbdc11440d89af23e512887cf0c4debe1dc040010a87939932b47d772345e3d
MD5 6a668641612b3356af0f51225589758d
BLAKE2b-256 d1d14e741b644e3449fdb17e99ae197e7e78ae58c8b455e891dda31b612eb8eb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ros2_tui-0.1.3-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 775bc01936c172e99758e19a0ef3653cff950fb535f07de5033ccdeed42a9bae
MD5 a1c8efe3851b58cb4cce258421ab3db8
BLAKE2b-256 b9d0026436ad0b57676ef4f22dd8783b973e20323b2b001261a5be7ceb9b78cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ros2_tui-0.1.3-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 48a7cb22ddaa3c2b6e7bbdc70a5df2cef9edeed0702406d8dce85eae1590495d
MD5 d4c4afe2bcb31716dc48f5c3cd84cc06
BLAKE2b-256 89d500f0abb59d9ee8505a46ae8f25c468b96d61a11441c4d1827ee88c28318f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ros2_tui-0.1.3-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b4aa294cc629684fbb6cb9d1861e9fe1c8f196875db7187f7723cc956adb17aa
MD5 7cc431553642f0871348acb8bd521424
BLAKE2b-256 ec264b32763f352de0b5227ae91685181ad3749f33a6d91ac199c7e99ed7c6be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ros2_tui-0.1.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 85b75fc9f6a6ccccda04810e32f436e2941475376e3eea44853a2e8261143d94
MD5 ad7ba70418417cd5b192661cb17cabdc
BLAKE2b-256 1954c89fa565988f67bdef4839841718836b96a365cea0ae1605b5ed24ca1efc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ros2_tui-0.1.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 c75ff9adf6a370cbcbf364e5a0498b077be432d07c39266ac8c7905aa678e25b
MD5 8e655dfcfe44077c47a057e0fb4ea6e5
BLAKE2b-256 d1c1920eef62e803905b69ba5e038c473eeec6b6e2ec10b5061439b7cd2c48d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ros2_tui-0.1.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 0c37292dbee0c06910731c02c37228d6edc579f1315290f1631c2be353201e77
MD5 920905b0f3d3e3af17b8666bec3851bf
BLAKE2b-256 aa3931b53b93cbca425c5285d1ab915750d2074c9ff2ab868e8c09329bc58d2a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ros2_tui-0.1.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 5a679b265149dae26ba97d2ca311087b0601e26c591069398c35cb43fde6d884
MD5 b68cf55d49f10bf109ccab84653538dd
BLAKE2b-256 d56d14a8fe191ddef5325faddb344e4b8efee95431e29cdab0ad27042fa58001

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ros2_tui-0.1.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 5b366aabb0edfe9a8fc8b4e0852260622ae242ce7b4075476c3d4d8bc52a0404
MD5 63276c14dda9040d3d9a6922094ab3e1
BLAKE2b-256 ab948b39361c605748fd8e6a26acd17cca6555ac58c6c7638448919cba853afc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ros2_tui-0.1.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e0b530e7cdb2bb8d4f4a4560d4d956c55475fe6960f250519c5013dc0d2f1126
MD5 ad39327382504b3db93babcee8caafac
BLAKE2b-256 6f2fbb8daa3a0f09b83e996d910720dc38d947272db3ea31123278a7cd17f275

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page