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.
๐ Docs: https://deyuf.github.io/rosight/
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 (
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
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 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
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
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.1.tar.gz.
File metadata
- Download URL: rosight-0.1.1.tar.gz
- Upload date:
- Size: 1.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
981e0793c89ac1d1c147a6f30071d3cd05a717ce08b4ec2aaba600b34fbc2d04
|
|
| MD5 |
3e204f569b9dea752da5afe074823bab
|
|
| BLAKE2b-256 |
f511b1817f71209a67e124d3cf7a181971342d0279b1fb219304a46498d3d44b
|
File details
Details for the file rosight-0.1.1-py3-none-any.whl.
File metadata
- Download URL: rosight-0.1.1-py3-none-any.whl
- Upload date:
- Size: 67.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3479976e365de22e52af16ac20902960d40919f381fa6153959b844a039c1cb0
|
|
| MD5 |
25ef31326ceb396fa15d79bedcae9978
|
|
| BLAKE2b-256 |
f0a28367a652e85284e46493e1e0971471448753a90bb5f33ed840193f9a22bb
|