Spaces:
Sleeping
Sleeping
| # RobotHub TransportServer Python Client | |
| A Python client library for real-time robotics control and video streaming via the RobotHub TransportServer platform. Built with AsyncIO for high-performance concurrent operations. | |
| ## π― Purpose | |
| This client library provides **easy access** to the RobotHub TransportServer from Python applications: | |
| - **Robotics Control**: Send joint commands and receive robot state updates | |
| - **Video Streaming**: Stream and receive video feeds via WebRTC | |
| - **Multi-Workspace**: Organize connections across isolated workspaces | |
| - **AsyncIO Support**: Non-blocking operations for real-time robotics | |
| ## π¦ Installation | |
| ```bash | |
| uv add transport-server-client | |
| ``` | |
| Or install from source: | |
| ```bash | |
| uv pip install -e . | |
| ``` | |
| ## π Quick Start | |
| ### Robotics Control | |
| #### Producer (Send Commands) | |
| ```python | |
| import asyncio | |
| from transport_server_client import RoboticsProducer | |
| async def main(): | |
| producer = RoboticsProducer('http://localhost:8000') | |
| # Create room and connect | |
| room_id = await producer.create_room() | |
| await producer.connect(room_id) | |
| # Send joint commands | |
| await producer.send_joint_update([ | |
| {'name': 'shoulder', 'value': 45.0}, | |
| {'name': 'elbow', 'value': -20.0} | |
| ]) | |
| # Send complete state | |
| await producer.send_state_sync({ | |
| 'shoulder': 60.0, | |
| 'elbow': -30.0, | |
| 'wrist': 15.0 | |
| }) | |
| await producer.disconnect() | |
| asyncio.run(main()) | |
| ``` | |
| #### Consumer (Receive Commands) | |
| ```python | |
| import asyncio | |
| from transport_server_client import RoboticsConsumer | |
| async def main(): | |
| consumer = RoboticsConsumer('http://localhost:8000') | |
| await consumer.connect('room-id') | |
| # Handle joint updates | |
| def on_joint_update(joints): | |
| print('π€ Robot moving:', joints) | |
| # Execute on your robot hardware | |
| def on_state_sync(state): | |
| print('π Robot state:', state) | |
| consumer.on_joint_update(on_joint_update) | |
| consumer.on_state_sync(on_state_sync) | |
| # Keep running | |
| await asyncio.sleep(60) | |
| await consumer.disconnect() | |
| asyncio.run(main()) | |
| ``` | |
| ### Video Streaming | |
| ```python | |
| import asyncio | |
| from transport_server_client.video import VideoProducer, VideoConsumer | |
| async def video_example(): | |
| # Producer - Stream video | |
| producer = VideoProducer('http://localhost:8000') | |
| room_info = await producer.create_room() | |
| await producer.connect(room_info['workspace_id'], room_info['room_id']) | |
| await producer.start_camera() | |
| # Consumer - Receive video | |
| consumer = VideoConsumer('http://localhost:8000') | |
| await consumer.connect(room_info['workspace_id'], room_info['room_id']) | |
| def on_frame(frame_data): | |
| print(f'Frame received: {len(frame_data)} bytes') | |
| consumer.on_frame_update(on_frame) | |
| await consumer.start_receiving() | |
| await asyncio.sleep(30) # Stream for 30 seconds | |
| await producer.disconnect() | |
| await consumer.disconnect() | |
| asyncio.run(video_example()) | |
| ``` | |
| ## π API Reference | |
| ### RoboticsProducer | |
| ```python | |
| # Connection | |
| await producer.connect(workspace_id, room_id) | |
| room_info = await producer.create_room() # Auto-generates IDs | |
| await producer.disconnect() | |
| # Control | |
| await producer.send_joint_update(joints) | |
| await producer.send_state_sync(state) | |
| await producer.send_emergency_stop(reason) | |
| # Room management | |
| rooms = await producer.list_rooms(workspace_id) | |
| await producer.delete_room(workspace_id, room_id) | |
| ``` | |
| ### RoboticsConsumer | |
| ```python | |
| # Connection | |
| await consumer.connect(workspace_id, room_id) | |
| state = await consumer.get_state_sync() | |
| # Event callbacks | |
| consumer.on_joint_update(callback) | |
| consumer.on_state_sync(callback) | |
| consumer.on_emergency_stop(callback) | |
| consumer.on_error(callback) | |
| ``` | |
| ### Video APIs | |
| ```python | |
| # VideoProducer | |
| await producer.start_camera(config) | |
| await producer.start_screen_share() | |
| await producer.stop_streaming() | |
| # VideoConsumer | |
| await consumer.start_receiving() | |
| consumer.on_frame_update(callback) | |
| consumer.on_stream_started(callback) | |
| ``` | |
| ## β‘ Factory Functions | |
| Quick setup helpers: | |
| ```python | |
| from transport_server_client import create_producer_client, create_consumer_client | |
| # Quick producer setup | |
| producer = await create_producer_client('http://localhost:8000') | |
| # Quick consumer setup | |
| consumer = await create_consumer_client('room-id', 'http://localhost:8000') | |
| ``` | |
| ## π§ Context Managers | |
| Automatic cleanup with context managers: | |
| ```python | |
| async with RoboticsProducer('http://localhost:8000') as producer: | |
| room_id = await producer.create_room() | |
| await producer.connect(room_id) | |
| await producer.send_state_sync({'joint1': 45.0}) | |
| # Automatically disconnected when exiting | |
| ``` | |
| ## π οΈ Development | |
| ```bash | |
| # Install dependencies | |
| uv sync | |
| # Install in development mode | |
| uv pip install -e ".[dev]" | |
| # Run tests | |
| pytest | |
| ``` | |
| --- | |
| **Start controlling robots with Python!** π€β¨ | |