Skip to main content

A lazygit-inspired terminal UI for ROS 2: topics, nodes, services, params, live message inspection and plotting.

Project description

Rosight logo

Rosight

PyPI Python CI Docs License: MIT

Rosight = ROS + sight. A keyboard-driven terminal cockpit for ROS 2.

Browse the live ROS 2 graph โ€” messages, nodes, services, actions, parameters, TF, bags, interfaces โ€” and live-plot any numeric field, all from one screen without a mouse. Built for SSH, tmux, robot consoles.

๐Ÿ“– Docs: https://deyuf.github.io/rosight/

Messages tab

What's inside

Nine tabs, keyboard-driven, all on one screen:

# Tab What you can do
1 Messages Filter the topic table, Enter to subscribe, the right pane shows live hz / bw / jitter and the message tree. Press i for static topic info (types, publishers, QoS). Press v to open a live image preview for sensor_msgs/Image / CompressedImage topics.
2 Nodes Discover every node, drill into its publishers, subscribers, service servers/clients, action servers/clients.
3 Services List services with types. c opens a call form (planned).
4 Actions List action servers with types. Goal monitor (planned).
5 Params Browse parameters per node, get / set with type awareness.
6 Plot Multi-series live plot โ€” scalar time-series and 1D-array snapshots (e.g. LaserScan ranges). Pick a numeric leaf or numeric array in the message tree and press p / Enter. Pause / window-scale / CSV export.
7 TF Auto-built frame tree from /tf and /tf_static.
8 Bags ros2 bag record / play / info. The header tells you which key stops the recording while it's running.
9 Interfaces Browse msg / srv / action definitions of every interface package on the system.

Image rendering uses the terminal's native graphics protocol when available (kitty / sixel / iTerm2) and falls back to Unicode half-blocks otherwise โ€” see docs/plotting.md for the support matrix.

Screenshots

Nodes tab Nodes (2)

Services tab Services (3)

Actions tab Actions (4)

Bags tab Bags (8) โ€” recording state

Cross-cutting features:

  • Auto-QoS โ€” subscriber profile is negotiated to match every publisher of a topic (BEST_EFFORT vs RELIABLE, TRANSIENT_LOCAL, etc.), so sensor topics "just work".
  • Theme persistence โ€” pick a theme via Ctrl+P โ†’ Change theme; it survives restarts (stored next to your config in a small state.toml).
  • Runtime domain switch โ€” :domain 5 reconnects the rclpy backend on a new ROS_DOMAIN_ID without restarting the app.
  • Live notifications โ€” important actions (subscribed, started recording, switched domain) show as toasts; nothing important hides in a covered status bar.
  • No ROS required for the UI โ€” the package imports cleanly without rclpy, so you can dev / unit-test on cloud machines. Run with --no-ros to stay offline.

Install

From PyPI:

pip install rosight

Then, in any terminal where you want to use it:

source /opt/ros/<distro>/setup.bash
rosight

If you maintain multiple distros, source the one whose rclpy should drive discovery before launching. See the installation guide for the recommended --system-site-packages venv layout that keeps the system rclpy reachable while pip manages everything else.

From source (for development):

git clone https://github.com/deyuf/rosight
cd rosight
pip install -e ".[dev]"

Quick start

# launch (inherits ROS_DOMAIN_ID from env)
rosight

# pick a domain explicitly + log to file
rosight --domain-id 5 --log-file /tmp/rosight.log

# UI-only mode, no rclpy needed (great for theme / layout dev)
rosight --no-ros

Inside the app:

  • ? โ€” keyboard reference overlay
  • : โ€” command palette (topic <filter>, plot <topic> <path>, record, domain <N>, quit)
  • 1โ€“9 โ€” jump to a tab
  • q or Ctrl+C โ€” quit
  • r โ€” manual refresh

Plotting workflow (the question new users ask most):

  1. Messages tab, cursor over a topic, Enter to subscribe (focus auto-jumps to the message tree)
  2. Use arrow keys / Space to expand fields in the tree
  3. Cursor on a numeric leaf (int / float), press p โ€” series is added and the Plot tab opens

Documentation

Full docs site: https://deyuf.github.io/rosight/

Topic Page
Installation per distro Install
Daily usage Usage
Keybindings Keybindings
Configuration Configuration
Plotting deep-dive Plotting
Architecture Architecture
Contributing Development
FAQ FAQ

Project layout

src/rosight/
โ”œโ”€โ”€ app.py             # Textual App, panel registry, global key bindings
โ”œโ”€โ”€ cli.py             # argparse entry point
โ”œโ”€โ”€ config.py          # TOML config loader + state.toml persistence
โ”œโ”€โ”€ ros/
โ”‚   โ”œโ”€โ”€ backend.py     # central rclpy facade (lifecycle, sub mgmt, domain switch)
โ”‚   โ”œโ”€โ”€ introspection.py  # dynamic message-type resolution
โ”‚   โ”œโ”€โ”€ qos.py         # plain-data QoS + auto-negotiation
โ”‚   โ””โ”€โ”€ stats.py       # hz / bw monitors
โ”œโ”€โ”€ utils/
โ”‚   โ”œโ”€โ”€ datatable.py   # row-cursor preservation + last-column auto-fit
โ”‚   โ”œโ”€โ”€ ringbuffer.py  # thread-safe bounded buffers
โ”‚   โ”œโ”€โ”€ path.py        # message field-path parser
โ”‚   โ””โ”€โ”€ formatting.py  # human-readable display helpers
โ””โ”€โ”€ widgets/           # one file per panel + status bar / help / palette

Tech stack & rationale โ€” short version

  • Python 3.10+ + rclpy (first-class ROS 2 client, dynamic message introspection via rosidl_runtime_py)
  • Textual โ‰ฅ 0.79 (modern async TUI, CSS-like styling, headless pilot tests โ€” that's how the 80-test suite stays meaningful for a TUI)
  • plotext for ANSI plotting in the Plot tab
  • hatch + ruff + mypy + pytest-asyncio for the dev loop
  • MkDocs Material for the docs site
  • rclpy runs on its own MultiThreadedExecutor daemon thread so DDS spinning never blocks the Textual main loop. See DESIGN.md for the full reasoning.

Status

Beta. Discovery, subscription, plotting, TF, bag record/play, theme persistence, runtime domain switch โ€” all working. Auto-forms for service call and action goal are on the roadmap.

License

MIT. See LICENSE.

Project details


Download files

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

Source Distribution

rosight-0.2.0.tar.gz (809.6 kB view details)

Uploaded Source

Built Distribution

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

rosight-0.2.0-py3-none-any.whl (67.6 kB view details)

Uploaded Python 3

File details

Details for the file rosight-0.2.0.tar.gz.

File metadata

  • Download URL: rosight-0.2.0.tar.gz
  • Upload date:
  • Size: 809.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rosight-0.2.0.tar.gz
Algorithm Hash digest
SHA256 8ef41c8cc94cdf509852b260f2d61afc6a0be9f59a9afdd6010f8c9cf2f1fd2e
MD5 7ae74e9cb22731429e14376fba88ec80
BLAKE2b-256 2264ae65396625253dcee74c9ba728d6eeb9bd58d9a2ed4fe8c1a94c171e5b78

See more details on using hashes here.

Provenance

The following attestation bundles were made for rosight-0.2.0.tar.gz:

Publisher: ci.yml on deyuf/rosight

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rosight-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: rosight-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 67.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rosight-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a4f8572810bca018e988a534d68a53a102dba0dad8a59e8b934d41c4913f9041
MD5 d1de0d4ff5786a997cf899f55425e089
BLAKE2b-256 cffdc71122d3186b0c7931cfeb20cf4e2cda04ad2c55bb61429a57eb6bf9e224

See more details on using hashes here.

Provenance

The following attestation bundles were made for rosight-0.2.0-py3-none-any.whl:

Publisher: ci.yml on deyuf/rosight

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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