I’ve been working on a ROS 2 project where I’m moving fast on different control scripts. Every few hours I’m redeploying a new version to the robot, testing it, tweaking parameters, redeploying again. The loop is tight but the data problem kept getting worse.
Every time I deployed a new script I’d lose track of which run produced which data. I had terminal windows open with ros2 topic echo piping to files, but I’d forget to restart them after a redeploy, or I’d overwrite the previous run’s data, or I’d come back the next day and have no idea which bag file matched which version of the code. I tried writing wrapper scripts to timestamp everything but then I had a different wrapper for every robot and every experiment.
What I actually wanted was something that just sat on the network and recorded everything the robot published, regardless of what code
I was running on it. Something I didn’t have to redeploy or reconfigure every time I changed the robot’s software. Just a tap on the network that stayed running and captured every run cleanly.
So I built ros_tap. It’s a pip installable CLI that joins the DDS network (or queries a ROS 1 Master) from any machine, discovers all the nodes and topics automatically, and streams everything as JSONL. You don’t install anything on the robot. You don’t need ROS on the monitoring machine either, it uses CycloneDDS directly.
pip install ros_tap
ros_tap scan # see every robot and topic on the network
ros_tap record # stream to stdout as JSONL
ros_tap record -o ./data # write to local files, auto rotated
ros_tap record -o s3://bucket/prefix # upload straight to S3
ros_tap record -c power,imu,actuators # filter by category
It auto classifies topics into categories like power, actuators, imu, lidar, camera so you can filter without memorizing topic names.
It’s read only, never publishes anything, so it won’t interfere with whatever is already running on the robot. It pipes everything to our internal S3 buckets so the rest of the team can build analytics around this super quickly.
The thing that made the biggest difference for me was being able to just leave it running. Redeploy the robot, ros_tap picks up the new topics automatically. Every run gets its own timestamped data. No more lost experiments.
It supports both ROS 1 and ROS 2, and auto detects which is available on the network.
-
PyPI: Client Challenge
Would love feedback, especially on what topic patterns or categories people want auto detected. Right now it covers the common ones (battery, joints, IMU, lidar, camera, temperature) but I’m sure I’m missing some that are obvious to people working on different platforms.