ros_tap
Zero config telemetry tap for any ROS robot on your network.
██████╗ ██████╗ ███████╗ ████████╗ █████╗ ██████╗
██╔══██╗██╔═══██╗██╔════╝ ╚══██╔══╝██╔══██╗██╔══██╗
██████╔╝██║ ██║███████╗ ██║ ███████║██████╔╝
██╔══██╗██║ ██║╚════██║ ██║ ██╔══██║██╔═══╝
██║ ██║╚██████╔╝███████║ ██║ ██║ ██║██║
╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝
ros_tap discovers ROS 1 and ROS 2 robots on your network, subscribes to their topics, and streams telemetry wherever you want. No ROS install required. It's just a tap. You decide where the data goes.
Install
pip install ros_tap # core (CycloneDDS + NumPy)
pip install 'ros_tap[s3]' # + S3/R2 support
pip install 'ros_tap[all]' # everything
Commands
scan
See what's on the network.
ros_tap scan # terminal dashboard
ros_tap scan --json # machine readable
ros_tap scan --domain 42 # specific DDS domain
ros_tap scan --ros1-uri http://robot:11311 # specific ROS 1 master
record
Stream telemetry to stdout, local NPZ files, or S3.
ros_tap record # stdout as JSONL
ros_tap record -o ./data # NPZ to local dir (default)
ros_tap record -o ./data -f jsonl # JSONL instead
ros_tap record -o s3://bucket/prefix # stream to S3
ros_tap record -c power,actuators # filter by category
ros_tap record -t /imu,/battery # filter by topic
ros_tap record | jq '.data' # pipe to anything
runs
List recorded runs.
ros_tap runs # list all runs in ./ros_tap_data
ros_tap runs -d /path/to/data # custom directory
push
Upload a local run to S3 or Cloudflare R2.
ros_tap push ./ros_tap_data/run_20260608_abc -b my-bucket
ros_tap push ./ros_tap_data/run_20260608_abc -b my-bucket --endpoint https://acct.r2.cloudflarestorage.com
Each push updates an index.json in the bucket with all runs, their time ranges, topics, and sample counts.
s3://my-bucket/ros_tap/
index.json
runs/
run_20260608_193000_a1b2c3/
manifest.json
imu_data_0000.npz
joint_states_0000.npz
run_20260608_200000_d4e5f6/
manifest.json
...
info
Check installed backends and environment.
ros_tap info
Storage formats
NPZ (default for local recording)
Compressed NumPy archives. Each session creates a run directory with per topic .npz files and a manifest.json. Dramatically smaller than JSONL for numeric sensors.
Load a run in Python:
from ros_tap.loader import Run, list_runs
runs = list_runs("./ros_tap_data")
run = runs[-1]
imu = run.load("/imu")
print(imu["timestamps"].shape)
print(imu["linear_acceleration.x"])
JSONL
Use --format jsonl or pipe to stdout:
{"ts": 1718000000.0, "node": "/bot", "topic": "/battery_state", "type": "sensor_msgs/BatteryState", "ros": 2, "data": {...}}
How it works
ROS 2: Joins the DDS network as a passive participant via CycloneDDS. Discovers nodes, topics, and types through multicast. No ROS 2 install needed.
ROS 1: Queries the ROS Master's XML RPC API. Gets the full topic graph in one call.
Auto detect: Tries both and merges results. Works with ros1_bridge setups.
Read only. Never publishes. Does not interfere with existing software on the robot.
Auto detected categories
| Category | Example topics |
|---|---|
power |
/battery_state, /battery |
actuators |
/joint_states, /motor_states |
diagnostics |
/diagnostics |
odometry |
/odom |
imu |
/imu |
lidar |
/scan |
camera |
/camera/image_raw |
command |
/cmd_vel |
thermal |
/temperature |
navigation |
/gps, /gnss |
force_torque |
/force, /torque |
system |
/cpu_monitor, /memory_monitor |
License
Apache 2.0
Metadata
Release files for ros-tap 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| ros_tap-0.3.0.tar.gz | 19.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ros_tap-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 42.2 kB
Release files / ros_tap-0.3.0.tar.gz
| Download URL | ros_tap-0.3.0.tar.gz |
|---|---|
| Size | 19.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
861f45de978482ca9053f93906ed8c8ae6ae74441a8c349724564cbad98554a3
|
|
BLAKE2b-256 checksum How to use checksums |
b62ceb9407444d3cf505e273c67d9afa5de17ec2bbc30dca4533b1f76f277607
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / ros_tap-0.3.0-py3-none-any.whl
| Download URL | ros_tap-0.3.0-py3-none-any.whl |
|---|---|
| Size | 22.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d47d405ebf429225b1f65984ab061c5eb92f7608040be385021dd0cd0e163e62
|
|
BLAKE2b-256 checksum How to use checksums |
409ee2da3e7d88fbf8d0785153216042198bbc594a58fc1b3f465629ef365153
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Security for ros-tap 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.