Robotics-AI Training in Hyperrealistic Game Environments
Project description
Infinite synthetic data generation for embodied AI
https://github.com/user-attachments/assets/0ab2953d-b188-4af7-a225-71decdd2378c
Lucky Robots
Hyperrealistic robotics simulation framework with Python API for embodied AI training and testing.
Quick Start
-
Download LuckyEngine from our releases page and set the path:
# Set environment variable (choose one method): # Method 1: Set LUCKYENGINE_PATH directly to the executable export LUCKYENGINE_PATH=/path/to/LuckyEngine # Linux/Mac export LUCKYENGINE_PATH=/path/to/LuckyEngine.exe # Windows # Method 2: Set LUCKYENGINE_HOME to the directory containing the executable export LUCKYENGINE_HOME=/path/to/luckyengine/directory
-
Install
pip install luckyrobots
-
Run Example
git clone https://github.com/luckyrobots/luckyrobots.git cd luckyrobots/examples python controller.py --skip-launch # If LuckyEngine is already running
Basic Usage
from luckyrobots import LuckyEngineClient
# Connect to LuckyEngine
client = LuckyEngineClient(
host="127.0.0.1",
port=50051,
robot_name="unitreego1",
)
client.wait_for_server()
# Optional: Fetch schema for named observation access
client.fetch_schema()
# Get RL observation
obs = client.get_observation()
print(f"Observation: {obs.observation[:5]}...") # Flat vector for RL
print(f"Timestamp: {obs.timestamp_ms}")
# Named access (if schema fetched)
# obs["proj_grav_x"] # Access by name
# obs.to_dict() # Convert to dict
# Send controls
client.send_control(controls=[0.1, 0.2, -0.1, ...])
# Get joint state (separate from RL observation)
joints = client.get_joint_state()
print(f"Positions: {joints.positions}")
print(f"Velocities: {joints.velocities}")
API Overview
Core Classes
LuckyEngineClient - Low-level gRPC client
wait_for_server(timeout)- Wait for LuckyEngine connectionget_observation()- Get RL observation vectorget_joint_state()- Get joint positions/velocitiessend_control(controls)- Send actuator commandsget_agent_schema()- Get observation/action names and sizesreset_agent()- Reset agent state
LuckyRobots - High-level wrapper (launches LuckyEngine)
start(scene, robot, task)- Launch and connectget_observation()- Get observationstep(controls)- Send controls and get next observation
Models
from luckyrobots import ObservationResponse, StateSnapshot
# ObservationResponse - returned by get_observation()
obs.observation # List[float] - flat RL observation vector
obs.actions # List[float] - last applied actions
obs.timestamp_ms # int - wall-clock timestamp
obs.frame_number # int - monotonic counter
obs["name"] # Named access (if schema fetched)
obs.to_dict() # Convert to name->value dict
Available Robots & Environments
Robots
- unitreego1: Quadruped robot
- so100: 6-DOF manipulator with gripper
- stretch_v1: Mobile manipulator
Scenes
- velocity: Velocity control training
- kitchen: Residential kitchen environment
Tasks
- locomotion: Walking/movement
- pickandplace: Object manipulation
Development
Setup with uv (recommended)
# Clone and enter repo
git clone https://github.com/luckyrobots/luckyrobots.git
cd luckyrobots
# Install uv if you haven't
curl -LsSf https://astral.sh/uv/install.sh | sh
# Create venv and install deps
uv sync
# Run tests
uv run pytest
# Run example
uv run python examples/controller.py --skip-launch
Setup with pip
git clone https://github.com/luckyrobots/luckyrobots.git
cd luckyrobots
pip install -e ".[dev]"
Regenerating gRPC Stubs
The Python gRPC stubs are in src/luckyrobots/grpc/generated/ and are
generated from protos in src/luckyrobots/grpc/proto/.
python -m grpc_tools.protoc \
-I "src/luckyrobots/grpc/proto" \
--python_out="src/luckyrobots/grpc/generated" \
--grpc_python_out="src/luckyrobots/grpc/generated" \
src/luckyrobots/grpc/proto/*.proto
Project Structure
src/luckyrobots/
├── client.py # LuckyEngineClient (main API)
├── luckyrobots.py # LuckyRobots high-level wrapper
├── models/ # Pydantic models
│ ├── observation.py # ObservationResponse, StateSnapshot
│ └── camera.py # CameraData, CameraShape
├── engine/ # Engine management
├── grpc/ # gRPC internals
│ ├── generated/ # Protobuf stubs
│ └── proto/ # .proto files
└── config/ # Robot configurations
Contributing
- Fork the repository
- Create a feature branch
- Make changes and add tests
- Run
uv run ruff check .anduv run ruff format . - Submit a pull request
Architecture
Lucky Robots uses gRPC for communication:
- LuckyEngine: Physics + rendering backend (Unreal Engine + MuJoCo)
- Python client: Connects via gRPC (default
127.0.0.1:50051)
gRPC Services
| Service | Status | Description |
|---|---|---|
| MujocoService | ✅ Working | Joint state, controls |
| AgentService | ✅ Working | Observations, reset |
| SceneService | 🚧 Placeholder | Scene inspection |
| TelemetryService | 🚧 Placeholder | Telemetry streaming |
| CameraService | 🚧 Placeholder | Camera frames |
| ViewportService | 🚧 Placeholder | Viewport pixels |
License
MIT License - see LICENSE file.
Support
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Discord: Community Server
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file luckyrobots-0.1.77.tar.gz.
File metadata
- Download URL: luckyrobots-0.1.77.tar.gz
- Upload date:
- Size: 32.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.24
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75497df9f330c322f377838f831c04136c5e817231a4def5cdf7a73f968b3c07
|
|
| MD5 |
46c26ae01b80e7a19a98988b4388f4e9
|
|
| BLAKE2b-256 |
f8212ecf501eb16612c9db721d474ce004ae2a1177ce0edff8bcc29f943cf673
|
File details
Details for the file luckyrobots-0.1.77-py3-none-any.whl.
File metadata
- Download URL: luckyrobots-0.1.77-py3-none-any.whl
- Upload date:
- Size: 57.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.24
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ca0e5f7642395df2bd9f8385e5026a75327ad105277337baf6fd52ce825652b9
|
|
| MD5 |
cd313b4d535c052bf72af8109478134b
|
|
| BLAKE2b-256 |
dd1da14d5898d1bb3cd748a7360a014db161af6fc1a3ce23355e7ab3e98f37d1
|