A lazygit-inspired terminal UI for ROS 2: topics, nodes, services, params, live message inspection and plotting.
Project description
Rosight
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.
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). |
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 of any numeric field — pick a field in the message tree and press p. 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. |
Screenshots
Nodes (
2)
Services (
3)
Actions (
4)
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 smallstate.toml). - Runtime domain switch —
:domain 5reconnects the rclpy backend on a newROS_DOMAIN_IDwithout 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-rosto stay offline.
Install
Rosight is not yet on PyPI; install from source:
git clone https://github.com/deyuf/rosight
cd rosight
pip install -e .
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 docs/installation.md
for the recommended --system-site-packages venv layout that keeps the system
rclpy reachable while pip manages everything else.
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 tabqorCtrl+C— quitr— manual refresh
Plotting workflow (the question new users ask most):
- Messages tab, cursor over a topic, Enter to subscribe (focus auto-jumps to the message tree)
- Use arrow keys / Space to expand fields in the tree
- Cursor on a numeric leaf (int / float), press p — series is added and the Plot tab opens
Documentation
| Topic | File |
|---|---|
| Installation per distro | docs/installation.md |
| Daily usage | docs/usage.md |
| Keybindings | docs/keybindings.md |
| Configuration | docs/configuration.md |
| Plotting deep-dive | docs/plotting.md |
| Architecture | docs/architecture.md |
| Contributing | docs/development.md |
| FAQ | docs/faq.md |
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
MultiThreadedExecutordaemon thread so DDS spinning never blocks the Textual main loop. SeeDESIGN.mdfor 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rosight-0.1.0.tar.gz.
File metadata
- Download URL: rosight-0.1.0.tar.gz
- Upload date:
- Size: 81.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
84818de569d2152c73171a68d0d30539e3f813ad8a610221670d0ee1246b37da
|
|
| MD5 |
39f0129406d94e5fcb30be6b596188c8
|
|
| BLAKE2b-256 |
773e227e7b815a48fbe5d2fed3a45a5d995e1b64a6b0a4c33c9410592385944b
|
File details
Details for the file rosight-0.1.0-py3-none-any.whl.
File metadata
- Download URL: rosight-0.1.0-py3-none-any.whl
- Upload date:
- Size: 57.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1aa764540f77bef8b3a3da241ff18b9dae3ea203a473576bd2c127ba12ae199
|
|
| MD5 |
846bf197407966b52490b4c5768fd070
|
|
| BLAKE2b-256 |
d82edd81907c18c3b944b7ad98a14baa5ac7ac95ec617ae058d09cdfc3ae2545
|