A real-time process monitor with support for ROS2 nodes, showing CPU, RAM, and GPU usage
Project description
ROS2Top
A real-time monitor for ROS2 nodes showing CPU, RAM, and GPU usage - like htop but for ROS2 nodes.
Features
- ๐ Real-time monitoring of all ROS2 nodes
- ๐ป CPU usage tracking per node
- ๐ง RAM usage monitoring
- ๐ฎ GPU usage tracking (NVIDIA GPUs via NVML)
- ๐ฅ๏ธ Terminal-based interface using curses
- ๐ Auto-refresh with configurable intervals
- ๐ท๏ธ Process tree awareness (includes child processes)
- ๐ Node registration API for reliable node-to-monitor communication
Installation
From PyPI (when published)
pip install ros2top
From Source
git clone https://github.com/AhmedARadwan/ros2top.git
cd ros2top
pip install -e .
Requirements
- Python 3.8+
- NVIDIA drivers (for GPU monitoring)
Python Dependencies
psutil>=5.8.0pynvml>=11.0.0
CPP Dependencies
- nlohmann json installed from source.
Usage
Examples
- Python Example: Complete ROS2 Python node with ros2top integration
- C++ Example: Complete ROS2 C++ package with ros2top integration
Basic Usage
# Run ros2top
ros2top
Command Line Options
ros2top --help # Show help
ros2top --refresh 2 # Refresh every 2 seconds (default: 5)
ros2top --version # Show version
Interactive Controls
The enhanced terminal UI provides responsive and interactive controls:
| Key | Action |
|---|---|
q or Q |
Quit application |
h or H |
Show help dialog |
r or R |
Force refresh node list |
p or P |
Pause/resume monitoring |
+ or = |
Increase refresh rate |
- |
Decrease refresh rate |
โ / โ |
Navigate through nodes |
Tab |
Cycle focus between UI panels |
Space |
Force immediate update |
Home/End |
Jump to first/last node |
Terminal UI
Visual Features
- Color-coded usage bars: Green (low), Yellow (medium), Red (high)
- Real-time progress bars for CPU, memory, and GPU
- Interactive navigation with keyboard shortcuts
- Adaptive refresh rates for optimal performance
System Overview Panel
The top panel shows real-time system information:
- CPU usage (per-core or summary based on terminal size)
- Memory usage with progress bar
- GPU utilization and memory (if available)
- ROS2 status and active node count
Display Columns
| Column | Description |
|---|---|
| Node | ROS2 node name |
| PID | Process ID |
| %CPU | CPU usage percentage (normalized by core count) |
| RAM(MB) | RAM usage in megabytes |
| GPU# | GPU device number (if using GPU) |
| GPU% | GPU utilization percentage |
| GMEM | GPU memory usage in MB |
Examples
Monitor nodes with 2-second refresh
ros2top --refresh 2
How It Works
- Node Registartion: Every node registers its name and PID at startup with ros2top.
- Resource Monitoring: Uses
psutilfor CPU/RAM andpynvmlfor GPU metrics. - Display: Curses-based terminal interface for real-time updates.
Troubleshooting
No GPU monitoring
- Install NVIDIA drivers
- Install pynvml:
pip install pynvml
Nodes not showing up
- Verify nodes are running:
ros2 node list - Check node info:
ros2 node info /your_node - Some nodes might not have detectable PIDs
Development
Setup Development Environment
git clone https://github.com/AhmedARadwan/ros2top.git
cd ros2top
pip install -e .
Running Tests
python -m pytest tests/
Code Style
black ros2top/
flake8 ros2top/
mypy ros2top/
Architecture
ros2top/
โโโ ros2top/ # Python package
โ โโโ __init__.py # Package initialization and public API
โ โโโ main.py # CLI entry point
โ โโโ node_monitor.py # Core monitoring logic
โ โโโ node_registry.py # Node registration system
โ โโโ gpu_monitor.py # GPU monitoring
โ โโโ ros2_utils.py # ROS2 utilities
โ โโโ ui/ # User interface components
โ โโโ __init__.py
โ โโโ terminal_ui.py # Main curses interface
โ โโโ components.py # UI components
โ โโโ layout.py # UI layout management
โโโ include/ # C++ headers
โ โโโ ros2top/
โ โโโ ros2top.hpp # C++ API for node registration
โโโ examples/ # Example integrations
โ โโโ python/ # Python examples
โ โ โโโ README.md
โ โ โโโ example_node.py
โ โโโ cpp/ # C++ examples
โ โโโ README.md
โ โโโ example_monitored_node/ # Complete ROS2 package
โโโ tests/ # Test suite
โ โโโ __init__.py
โ โโโ test_ros2top.py
โโโ cmake/ # CMake configuration
โโโ pyproject.toml # Python build configuration
โโโ requirements.txt # Python dependencies
โโโ LICENSE # MIT license
โโโ README.md # This file
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests
- Submit a pull request
License
MIT License - see LICENSE file for details.
Changelog
v0.1.3
- Remove dependency on ROS2 to start ros2top.
v0.1.2
- Enhance README
v0.1.1
- Add example usage
- Enhance README
v0.1.0
- Initial release
- Basic node monitoring with CPU, RAM, GPU usage
- Terminal interface with curses
- Command line options
- Node registration and process mapping
Similar Tools
htop- System process monitornvtop- GPU process monitorros2 node list- Basic ROS2 node listing
Acknowledgments
- Inspired by
htopandnvtop - Built for the ROS2 community
- Uses
psutilfor system monitoring andpynvmlfor GPU monitoring
Node Registration API
For the most reliable monitoring, ROS2 nodes can register themselves with ros2top. This is especially useful for:
- Multiple nodes running in the same Python process
- Complex applications where automatic detection might miss some nodes
- Getting additional metadata about nodes
Basic Registration
import ros2top
# Register your node (call this once when your node starts)
ros2top.register_node('/my_node_name')
# Send periodic heartbeats (optional, but recommended)
ros2top.heartbeat('/my_node_name')
# Unregister when shutting down (optional, automatic cleanup on process exit)
ros2top.unregister_node('/my_node_name')
Advanced Registration with Metadata
import ros2top
# Register with additional information
ros2top.register_node('/camera_processor', {
'description': 'Processes camera feed for object detection',
'type': 'vision_processor',
'input_topics': ['/camera/image_raw'],
'output_topics': ['/detected_objects'],
'framerate': 30
})
# In your main loop, send heartbeats every few seconds
ros2top.heartbeat('/camera_processor')
Node Detection
ros2top uses a node registration system for reliable node detection:
Primary Method: Node Registration API
The most reliable way is for ROS2 nodes to explicitly register themselves:
import ros2top
# Register your node
ros2top.register_node('/my_node', {'description': 'My awesome node'})
# Send periodic heartbeats (recommended)
ros2top.heartbeat('/my_node')
# Unregister when shutting down (optional - automatic cleanup on exit)
ros2top.unregister_node('/my_node')
Automatic Cleanup
- Nodes are automatically unregistered when the process exits
- Stale registrations are cleaned up periodically
- Registry is stored in
~/.ros2top/registry/
Benefits of Registration API
- Reliable: No dependency on tracing or process matching
- Fast: Instant node detection without scanning
- Accurate: Direct PID mapping from the registering process
- Simple: Works with any ROS2 node type (Python, C++, etc.)
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
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 ros2top-0.2.0.tar.gz.
File metadata
- Download URL: ros2top-0.2.0.tar.gz
- Upload date:
- Size: 35.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4808ba732a20eb754db2a31f397379f56ec76d8e36c8b3b396b51290e668f13f
|
|
| MD5 |
80f369e459d1158dfa572ae683b0fdf6
|
|
| BLAKE2b-256 |
ed0dee681a865f285d4447a1fcf19b389545a9fb46f27412cb7b67dde6225a50
|
File details
Details for the file ros2top-0.2.0-py3-none-any.whl.
File metadata
- Download URL: ros2top-0.2.0-py3-none-any.whl
- Upload date:
- Size: 34.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b8c74b75ac282da871fc708f1b8d4c45430d1e7d21928fe3cfe862f277369501
|
|
| MD5 |
690fec9d4aa0bdff3c842d3dbb487f29
|
|
| BLAKE2b-256 |
7ecfc75f5886b143bf41d334fb3facc8d3068a60896345676109b605827b5a0f
|