Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,4 @@ camera_samples
build
dist
.strands_robots
.coverage
.kiro
.coverage
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,23 @@ trainer = create_trainer("groot",
trainer.train()
```

### Networking: Device Connect

Strands Robots uses [Device Connect](https://github.com/arm/device-connect) by Arm as its primary networking layer — registry-based discovery, structured RPC schemas, device-to-device events, and policy enforcement. Every `Robot()` automatically registers as a Device Connect device when `device-connect-edge` is installed (zero configuration in D2D mode).

If `device-connect-edge` is not installed, robots fall back to a built-in Zenoh P2P mesh for basic peer discovery and coordination.

```python
from strands_robots.tools.robot_mesh import robot_mesh

robot_mesh(action="peers") # discover devices
robot_mesh(action="tell", target="so100-lab-1", # invoke
instruction="pick up the cube")
robot_mesh(action="emergency_stop") # e-stop all
```

See the [Device Connect guide](strands_robots/device_connect/GUIDE.md) for architecture, E2E demos, and production deployment.

## Simulation

Three backends. Same `Robot()` interface.
Expand Down
16 changes: 10 additions & 6 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ dependencies = [
"Pillow>=8.0.0",
"msgpack>=1.0.0",
"pyzmq>=27.0.0",
"device-connect-edge>=0.2.0",
"device-connect-agent-tools>=0.1.0",
]

[project.optional-dependencies]
Expand All @@ -66,14 +68,11 @@ isaac = [
"usd-core>=24.0", # OpenUSD (pxr) for MJCF→USD asset conversion
]
newton = [
"newton>=1.0.0",
"warp-lang>=1.11.0",
"mujoco-warp",
"mujoco>=3.5.0",
"warp-lang>=1.9.0",
"newton-sim>=0.3.0",
"trimesh",
"scipy",
"mujoco>=3.5.0",
"numpy>=1.24.0",
# Requires NVIDIA GPU + CUDA
]
cosmos-transfer = [
"torch>=2.1.0",
Expand All @@ -96,6 +95,10 @@ cosmos-predict = [
zenoh = [
"eclipse-zenoh>=1.0.0",
]
device-connect = [
"device-connect-edge",
"device-connect-agent-tools",
]
vla = [
"transformers>=5.0.0",
"sentencepiece>=0.1.99",
Expand All @@ -119,6 +122,7 @@ all = [
"strands-robots[cosmos-transfer]",
"strands-robots[cosmos-predict]",
"strands-robots[zenoh]",
"strands-robots[device-connect]",
]
dev = [
"pytest>=6.0",
Expand Down
21 changes: 21 additions & 0 deletions strands_robots/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,27 @@
except (ImportError, AttributeError, OSError):
pass

# Device Connect integration (optional — wraps robots as DC devices)
try:
from strands_robots.device_connect import (
ReachyMiniDriver,
RobotDeviceDriver,
SimulationDeviceDriver,
init_device_connect,
)

__all__.extend(
["init_device_connect", "RobotDeviceDriver", "SimulationDeviceDriver", "ReachyMiniDriver"]
)
try:
from device_connect_agent_tools.adapters.strands import discover_devices, invoke_device

__all__.extend(["discover_devices", "invoke_device"])
except ImportError:
pass
except (ImportError, AttributeError, OSError):
pass

# Zenoh Robot Mesh (peer-to-peer — every Robot is a peer by default)
try:
from strands_robots.tools.robot_mesh import robot_mesh
Expand Down
Loading