ROS2 Launch Inspection Tool - Record and replay launch executions for performance analysis
Project description
play_launch
Record, replay, and analyze ROS 2 launch executions with resource monitoring and interactive management.
Installation
Install from PyPI:
pip install play_launch
Optional: Enable I/O monitoring (requires sudo):
play_launch setcap-io-helper
Quick Start
Launch any ROS 2 package with monitoring and Web UI enabled by default:
play_launch launch demo_nodes_cpp talker_listener.launch.py
Access Web UI at http://127.0.0.1:8080 for real-time node management and log streaming.
The Rust parser is used by default for speed. For maximum compatibility, use --parser python.
Usage
Launch Files
Replace ros2 launch with play_launch launch:
play_launch launch <package> <launch_file> [arguments...]
Single Nodes
Replace ros2 run with play_launch run:
play_launch run <package> <executable> [arguments...]
Two-Step Workflow
Record first, replay multiple times:
# Record
play_launch dump launch <package> <launch_file> [arguments...]
# Replay
play_launch replay
Features
All features enabled by default:
- Resource monitoring: CPU, memory, I/O, GPU (2s interval)
- Diagnostic monitoring:
/diagnosticsand/diagnostics_aggtopics - Web UI: Interactive management at
http://127.0.0.1:8080 - Container isolation: Composable nodes run in isolated processes via fork+exec (default)
Disable Features
Disable specific features:
play_launch launch <package> <launch_file> --disable-monitoring
play_launch launch <package> <launch_file> --disable-diagnostics
play_launch launch <package> <launch_file> --disable-web-ui
play_launch launch <package> <launch_file> --disable-all
Container Mode
Control how composable nodes are managed (default: isolated):
# Isolated: fork+exec per-node process isolation (default)
play_launch launch <pkg> <file> --container-mode isolated
# Observable: ComponentEvent publishing, shared process
play_launch launch <pkg> <file> --container-mode observable
# Stock: use original container from launch file, no override
play_launch launch <pkg> <file> --container-mode stock
Adjust Monitoring
Change sampling interval (default: 2000ms):
play_launch launch <package> <launch_file> --monitor-interval-ms 500
Configure Web UI
Change address or port (default: 127.0.0.1:8080):
play_launch launch <package> <launch_file> --web-addr 0.0.0.0:8080
Configuration File
Use YAML for advanced control:
# config.yaml
monitoring:
enabled: true
sample_interval_ms: 2000
processes:
- node_pattern: "NODE 'rclcpp_components/component_container*"
cpu_affinity: [0, 1]
nice: 5
Apply configuration:
play_launch replay --config config.yaml
Visualization
Generate interactive plots from monitoring data:
# Plot latest execution
play_launch plot
# Plot specific log directory
play_launch plot --log-dir play_log/2025-10-28_16-17-56
# Plot specific metrics
play_launch plot --metrics cpu memory
# List available metrics
play_launch plot --list-metrics
Output saved to play_log/<timestamp>/plot/:
cpu_timeline.html- CPU usage over timememory_timeline.html- Memory usage over timeio_timeline.html- I/O read/write ratescpu_distribution.html- CPU distribution box plotmemory_distribution.html- Memory distribution box plotstatistics.txt- Top 10 rankings for all metrics
Web UI Features
- Node management: Start/Stop/Restart individual or all nodes
- Container controls: Load/Unload composable nodes
- Real-time logs: Stream stdout/stderr with log level coloring and filtering
- Diagnostics panel: View
/diagnosticsmessages with level filtering - Status monitoring: Color-coded node states
- Auto-restart: Per-node automatic restart configuration
- Search & filter: Find nodes in large deployments
Output Structure
play_log/<timestamp>/
├── node/<node_name>/
│ ├── metadata.json
│ ├── metrics.csv # Resource metrics (when enabled)
│ ├── out/err # Process logs
│ ├── pid/status/cmdline
│ └── params_files/ # ROS parameter files
├── load_node/<name>/
│ └── out/err # Per-composable-node logs (isolated mode)
├── system_stats.csv # System-wide metrics
├── diagnostics.csv # Diagnostic messages (when enabled)
└── plot/ # Generated visualizations
Command Reference
# Launch (all features enabled by default)
play_launch launch <package> <launch_file> [args...]
play_launch run <package> <executable> [args...]
# Dump and replay
play_launch dump launch <package> <launch_file> [args...]
play_launch replay [--input-file record.json]
# Parser selection (Rust is default)
play_launch launch <pkg> <file> --parser rust # Default, fast
play_launch launch <pkg> <file> --parser python # Maximum compatibility
# Container mode
play_launch launch <pkg> <file> --container-mode isolated # Default
play_launch launch <pkg> <file> --container-mode observable
play_launch launch <pkg> <file> --container-mode stock
# Disable features
play_launch launch <pkg> <file> --disable-monitoring
play_launch launch <pkg> <file> --disable-diagnostics
play_launch launch <pkg> <file> --disable-web-ui
play_launch launch <pkg> <file> --disable-all
play_launch launch <pkg> <file> --disable-respawn
# Enable only specific features
play_launch launch <pkg> <file> --enable monitoring
play_launch launch <pkg> <file> --enable web-ui --enable diagnostics
# Adjust settings
play_launch launch <pkg> <file> --monitor-interval-ms 500
play_launch launch <pkg> <file> --web-addr 0.0.0.0:8080
play_launch launch <pkg> <file> --config config.yaml
# Logging
play_launch launch <pkg> <file> --verbose # Enable INFO level
RUST_LOG=play_launch=debug play_launch launch <pkg> <file> # DEBUG level
# Visualization
play_launch plot
play_launch plot --log-dir <dir>
play_launch plot --metrics cpu memory io gpu
play_launch plot --list-metrics
Development
See CLAUDE.md for development guidelines and architecture details.
# Run checks (clippy + rustfmt + ruff + cpplint + clang-format)
just check
# Format code
just format
# Run tests
just test
License
MIT License. See LICENSE.txt.
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 Distributions
Built Distributions
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 play_launch-0.8.0-py3-none-manylinux_2_35_x86_64.whl.
File metadata
- Download URL: play_launch-0.8.0-py3-none-manylinux_2_35_x86_64.whl
- Upload date:
- Size: 6.7 MB
- Tags: Python 3, manylinux: glibc 2.35+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b3fe0e28c7984d4b983b70a70b3f5bad2682cdbfaf596e75ad605ca4c4cacab9
|
|
| MD5 |
cca41e3d9476a9fe153d13c748a7752b
|
|
| BLAKE2b-256 |
4eec2d626bafa94cbafdd89bc071184b135d02a86b27c0cb12b4747880520a63
|
Provenance
The following attestation bundles were made for play_launch-0.8.0-py3-none-manylinux_2_35_x86_64.whl:
Publisher:
release-wheel.yml on NEWSLabNTU/play_launch
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
play_launch-0.8.0-py3-none-manylinux_2_35_x86_64.whl -
Subject digest:
b3fe0e28c7984d4b983b70a70b3f5bad2682cdbfaf596e75ad605ca4c4cacab9 - Sigstore transparency entry: 1143480216
- Sigstore integration time:
-
Permalink:
NEWSLabNTU/play_launch@82033762a337a5ec23b1ed97a72527a9b0d212f3 -
Branch / Tag:
refs/tags/v0.8.0 - Owner: https://github.com/NEWSLabNTU
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-wheel.yml@82033762a337a5ec23b1ed97a72527a9b0d212f3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file play_launch-0.8.0-py3-none-manylinux_2_35_aarch64.whl.
File metadata
- Download URL: play_launch-0.8.0-py3-none-manylinux_2_35_aarch64.whl
- Upload date:
- Size: 6.7 MB
- Tags: Python 3, manylinux: glibc 2.35+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d61949d8dd928d4a41571058568b67b0491b5548a6eb708352d295bcbb6a9c92
|
|
| MD5 |
20a9d2202c1c53347c1c6d9b0f9c6474
|
|
| BLAKE2b-256 |
d879591d0d5311d9ee5517fb3ae5da8560b21257c2aa032b0bd7741515f08a8e
|
Provenance
The following attestation bundles were made for play_launch-0.8.0-py3-none-manylinux_2_35_aarch64.whl:
Publisher:
release-wheel.yml on NEWSLabNTU/play_launch
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
play_launch-0.8.0-py3-none-manylinux_2_35_aarch64.whl -
Subject digest:
d61949d8dd928d4a41571058568b67b0491b5548a6eb708352d295bcbb6a9c92 - Sigstore transparency entry: 1143480323
- Sigstore integration time:
-
Permalink:
NEWSLabNTU/play_launch@82033762a337a5ec23b1ed97a72527a9b0d212f3 -
Branch / Tag:
refs/tags/v0.8.0 - Owner: https://github.com/NEWSLabNTU
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-wheel.yml@82033762a337a5ec23b1ed97a72527a9b0d212f3 -
Trigger Event:
push
-
Statement type: