Skip to main content

Zero config telemetry tap for any ROS 1 or ROS 2 robot on your network. Discover, subscribe, stream. No ROS install required.

Project description

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

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

ros_tap-0.3.0.tar.gz (19.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ros_tap-0.3.0-py3-none-any.whl (22.7 kB view details)

Uploaded Python 3

File details

Details for the file ros_tap-0.3.0.tar.gz.

File metadata

  • Download URL: ros_tap-0.3.0.tar.gz
  • Upload date:
  • Size: 19.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.13

File hashes

Hashes for ros_tap-0.3.0.tar.gz
Algorithm Hash digest
SHA256 861f45de978482ca9053f93906ed8c8ae6ae74441a8c349724564cbad98554a3
MD5 cdcbb22a257293d93a99af81380cde21
BLAKE2b-256 b62ceb9407444d3cf505e273c67d9afa5de17ec2bbc30dca4533b1f76f277607

See more details on using hashes here.

File details

Details for the file ros_tap-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: ros_tap-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 22.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.13

File hashes

Hashes for ros_tap-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d47d405ebf429225b1f65984ab061c5eb92f7608040be385021dd0cd0e163e62
MD5 7a46670ffbdd526f1fa06180f32b54ba
BLAKE2b-256 409ee2da3e7d88fbf8d0785153216042198bbc594a58fc1b3f465629ef365153

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page