BabyROS
BabyROS is a mini version of ROS built on top of the Zenoh protocol. It provides a familiar pub/sub/client/server architecture for robotics and distributed systems without the heavy overhead of a full ROS installation.
Features
- Powered by Zenoh: Ultra-low latency and high-throughput communication.
- Minimalist: No complex middleware setup; just Python and Zenoh.
- Familiar API: Designed for developers transitioning from ROS/ROS2.
Getting Started
1. Clone the Repository
git clone https://github.com/telekinesis-ai/babyros
Change directory
cd babyros
2. Environment Setup (Recommended)
We recommend using Miniconda or Anaconda to manage your environment:
conda create -n babyros python=3.11
Activate your environment:
conda activate babyros
You can deactivate your environment:
conda deactivate babyros
3. Installation
Install the package in editable mode for development:
pip install -e .
(For Inter-Device Communication) Installation
Install the Zenoh router. Documentation available in: Zenoh Docs
Usage Example
To see BabyROS in action, you can run the provided example scripts.
Publisher
Open a terminal and run:
python examples/publisher_example.py
When testing is done, kill terminal with Ctrl+C.
Subscriber
In a second terminal (with the babyros environment active), run:
python examples/subscriber_example.py
When testing is done, kill terminal with Ctrl+C.
Open Issues
- Datatype information
- Safety checks
Zenoh Config Comparison Between Zenoh, BabyROS, and RMW Zenoh
| Key | BabyROS | Zenoh | RMW Zenoh |
|---|---|---|---|
| adminspace.enabled | False | False | True |
| connect.endpoints | [] | [] | ['tcp/localhost:7447'] |
| connect.exit_on_failure | None | None | — |
| connect.exit_on_failure.client | — | — | True |
| connect.exit_on_failure.peer | — | — | False |
| connect.exit_on_failure.router | — | — | False |
| connect.retry | None | None | — |
| connect.retry.period_increase_factor | — | — | 2.0 |
| connect.retry.period_init_ms | — | — | 1000 |
| connect.retry.period_max_ms | — | — | 4000 |
| connect.timeout_ms | None | None | — |
| connect.timeout_ms.client | — | — | 0 |
| connect.timeout_ms.peer | — | — | -1 |
| connect.timeout_ms.router | — | — | -1 |
| listen.endpoints | — | — | ['tcp/localhost:0'] |
| listen.endpoints.peer | ['tcp/[::]:0'] | ['tcp/[::]:0'] | — |
| listen.endpoints.router | ['tcp/[::]:7447'] | ['tcp/[::]:7447'] | — |
| listen.exit_on_failure | None | None | True |
| listen.retry | None | None | — |
| listen.retry.period_increase_factor | — | — | 2.0 |
| listen.retry.period_init_ms | — | — | 1000 |
| listen.retry.period_max_ms | — | — | 4000 |
| listen.timeout_ms | None | None | 0 |
| mode | None | None | peer |
| open.return_conditions.connect_scouted | None | None | True |
| open.return_conditions.declares | None | None | True |
| queries_default_timeout | None | None | 600000 |
| routing.interests.timeout | None | None | 10000 |
| routing.peer.mode | None | None | peer_to_peer |
| routing.router.peers_failover_brokering | None | None | True |
| scouting.delay | None | None | 500 |
| scouting.gossip.autoconnect | None | None | — |
| scouting.gossip.autoconnect.peer | — | — | ['router', 'peer'] |
| scouting.gossip.autoconnect.router | — | — | [] |
| scouting.gossip.autoconnect_strategy | None | None | — |
| scouting.gossip.autoconnect_strategy.peer.to_peer | — | — | greater-zid |
| scouting.gossip.autoconnect_strategy.peer.to_router | — | — | always |
| scouting.gossip.enabled | None | None | True |
| scouting.gossip.multihop | None | None | False |
| scouting.gossip.target | None | None | — |
| scouting.gossip.target.peer | — | — | ['router'] |
| scouting.gossip.target.router | — | — | ['router', 'peer'] |
| scouting.multicast.address | None | None | 224.0.0.224:7446 |
| scouting.multicast.autoconnect | None | None | — |
| scouting.multicast.autoconnect.client | — | — | ['router'] |
| scouting.multicast.autoconnect.peer | — | — | ['router', 'peer'] |
| scouting.multicast.autoconnect.router | — | — | [] |
| scouting.multicast.autoconnect_strategy | None | None | — |
| scouting.multicast.autoconnect_strategy.peer.to_peer | — | — | greater-zid |
| scouting.multicast.autoconnect_strategy.peer.to_router | — | — | always |
| scouting.multicast.enabled | None | None | False |
| scouting.multicast.interface | None | None | auto |
| scouting.multicast.listen | None | None | True |
| scouting.multicast.ttl | None | None | 1 |
| scouting.timeout | None | None | 3000 |
| timestamping.drop_future_timestamp | None | None | False |
| timestamping.enabled | None | None | — |
| timestamping.enabled.client | — | — | True |
| timestamping.enabled.peer | — | — | True |
| timestamping.enabled.router | — | — | True |
| transport.link.tls.close_link_on_expiration | None | None | False |
| transport.link.tls.enable_mtls | None | None | False |
| transport.link.tls.verify_name_on_connect | None | None | True |
| transport.link.tx.keep_alive | 4 | 4 | 2 |
| transport.link.tx.lease | 10000 | 10000 | 60000 |
| transport.link.tx.queue.congestion_control.block.wait_before_close | 5000000 | 5000000 | 60000000 |
| transport.shared_memory.enabled | True | True | False |
| transport.shared_memory.transport_optimization.message_size_threshold | 3072 | 3072 | 512 |
| transport.shared_memory.transport_optimization.pool_size | 16777216 | 16777216 | 50331648 |
| transport.unicast.accept_pending | 100 | 100 | 10000 |
| transport.unicast.accept_timeout | 10000 | 10000 | 60000 |
| transport.unicast.max_sessions | 1000 | 1000 | 10000 |
| transport.unicast.open_timeout | 10000 | 10000 | 60000 |
License
Distributed under the Apache-2.0 License. See LICENSE for more information.
Metadata
Release files for babyros 0.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| babyros-0.1.6.tar.gz | 20.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| babyros-0.1.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 38.3 kB
Release files / babyros-0.1.6.tar.gz
| Download URL | babyros-0.1.6.tar.gz |
|---|---|
| Size | 20.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0b9a63d72185aab4ec7ee7ade12d881edd2c4d4b5131011ff41db757f4597e4a
|
|
BLAKE2b-256 checksum How to use checksums |
7bbde38fc0112a2ec19e6064259bdf643f5071ed147af130be478b71b9af53a5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 27, 2026.
Transparency logRelease files / babyros-0.1.6-py3-none-any.whl
| Download URL | babyros-0.1.6-py3-none-any.whl |
|---|---|
| Size | 17.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7ae2f1a2529c2489a28c70fddca110df3bdf086ca0b7dcd6b3d31a3a24c205e0
|
|
BLAKE2b-256 checksum How to use checksums |
899ff18a21468f216415c71f7a6579ae3341f1326bbef2c455b0b4bcd26ffdbe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 27, 2026.
Transparency log