LeRobot-Arena / ROBOT_ARCHITECTURE.md
blanchon's picture
squash: initial commit
3aea7c6
|
raw
history blame
13.1 kB

Robot Control Architecture v2.0 - Master/Slave Pattern

This document describes the revolutionary new Master-Slave Architecture that enables sophisticated robot control with clear separation between command sources (Masters) and execution targets (Slaves).

๐Ÿ—๏ธ Architecture Overview

The new architecture follows a Master-Slave Pattern with complete separation of concerns:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   UI Panel      โ”‚    โ”‚  Robot Manager   โ”‚    โ”‚    Masters      โ”‚
โ”‚                 โ”‚โ—„โ”€โ”€โ–บโ”‚                  โ”‚โ—„โ”€โ”€โ–บโ”‚                 โ”‚
โ”‚ โ€ข Manual Controlโ”‚    โ”‚ โ€ข Master/Slave   โ”‚    โ”‚ โ€ข Remote Server โ”‚
โ”‚ โ€ข Monitoring    โ”‚    โ”‚ โ€ข Command Router โ”‚    โ”‚ โ€ข Mock Sequence โ”‚
โ”‚ (disabled if    โ”‚    โ”‚ โ€ข State Sync     โ”‚    โ”‚ โ€ข Script Player โ”‚
โ”‚  master active) โ”‚    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ”‚
                                โ–ผ
                       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                       โ”‚   Robot Model    โ”‚โ—„โ”€โ”€โ–บโ”‚     Slaves      โ”‚
                       โ”‚                  โ”‚    โ”‚                 โ”‚
                       โ”‚ โ€ข URDF State     โ”‚    โ”‚ โ€ข USB Robots    โ”‚
                       โ”‚ โ€ข Joint States   โ”‚    โ”‚ โ€ข Mock Hardware โ”‚
                       โ”‚ โ€ข Command Queue  โ”‚    โ”‚ โ€ข Simulations   โ”‚
                       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐ŸŽฏ Key Concepts

Masters (Command Sources)

  • Purpose: Generate commands and control sequences
  • Examples: Remote servers, predefined sequences, scripts
  • Limitation: Only 1 master per robot (exclusive control)
  • Effect: When active, disables manual panel control

Slaves (Execution Targets)

  • Purpose: Execute commands on physical/virtual robots
  • Examples: USB robots, mock robots, simulations
  • Limitation: Multiple slaves per robot (parallel execution)
  • Effect: All connected slaves execute the same commands

Control Flow

  1. No Master: Manual panel control โ†’ All slaves
  2. With Master: Master commands โ†’ All slaves (panel disabled)
  3. Bidirectional: Slaves provide real-time feedback

๐Ÿ“ File Structure

src/lib/
โ”œโ”€โ”€ robot/
โ”‚   โ”œโ”€โ”€ Robot.svelte.ts              # Master-slave robot management
โ”‚   โ”œโ”€โ”€ RobotManager.svelte.ts       # Global orchestration
โ”‚   โ””โ”€โ”€ drivers/
โ”‚       โ”œโ”€โ”€ masters/
โ”‚       โ”‚   โ”œโ”€โ”€ MockSequenceMaster.ts    # Demo sequences
โ”‚       โ”‚   โ”œโ”€โ”€ RemoteServerMaster.ts    # HTTP/WebSocket commands
โ”‚       โ”‚   โ””โ”€โ”€ ScriptPlayerMaster.ts    # Script execution
โ”‚       โ””โ”€โ”€ slaves/
โ”‚           โ”œโ”€โ”€ MockSlave.ts             # Development/testing
โ”‚           โ”œโ”€โ”€ USBSlave.ts              # Physical USB robots
โ”‚           โ””โ”€โ”€ SimulationSlave.ts       # Physics simulation
โ”œโ”€โ”€ types/
โ”‚   โ””โ”€โ”€ robotDriver.ts               # Master/Slave interfaces
โ””โ”€โ”€ components/
    โ”œโ”€โ”€ scene/
    โ”‚   โ””โ”€โ”€ Robot.svelte             # 3D visualization
    โ””โ”€โ”€ panel/
        โ””โ”€โ”€ RobotControlPanel.svelte # Master/Slave connection UI

๐Ÿ”ง Core Components

RobotManager

Central orchestrator with master-slave management

import { robotManager } from '$lib/robot/RobotManager.svelte';

// Create robot
const robot = await robotManager.createRobot('my-robot', urdfConfig);

// Connect demo sequence master (disables manual control)
await robotManager.connectDemoSequences('my-robot', true);

// Connect mock slave (executes commands)  
await robotManager.connectMockSlave('my-robot', 50);

// Connect USB slave (real hardware)
await robotManager.connectUSBSlave('my-robot');

// Disconnect master (restores manual control)
await robotManager.disconnectMaster('my-robot');

Robot Class

Individual robot with master-slave coordination

// Master management
await robot.setMaster(sequenceMaster);
await robot.removeMaster();

// Slave management
await robot.addSlave(usbSlave);
await robot.addSlave(mockSlave);
await robot.removeSlave(slaveId);

// Control state
robot.controlState.hasActiveMaster    // true when master connected
robot.controlState.manualControlEnabled  // false when master active
robot.controlState.lastCommandSource     // "master" | "manual" | "none"

// Manual control (only when no master)
await robot.updateJointValue('joint_1', 45);

๐Ÿ”Œ Master Drivers

Mock Sequence Master

Predefined movement sequences for testing

const config: MasterDriverConfig = {
  type: "mock-sequence",
  sequences: DEMO_SEQUENCES,  // Wave, Scan, Pick-Place patterns
  autoStart: true,
  loopMode: true
};

await robotManager.connectMaster('robot-1', config);

Demo Sequences:

  • Wave Pattern: Greeting gesture with wrist roll
  • Scanning Pattern: Horizontal sweep with pitch variation
  • Pick and Place: Complete manipulation sequence

Remote Server Master (Planned)

HTTP/WebSocket command reception

const config: MasterDriverConfig = {
  type: "remote-server",
  url: "ws://robot-server:8080/ws",
  apiKey: "your-api-key",
  pollInterval: 100
};

Script Player Master (Planned)

JavaScript/Python script execution

const config: MasterDriverConfig = {
  type: "script-player", 
  scriptUrl: "/scripts/robot-dance.js",
  variables: { speed: 1.5, amplitude: 45 }
};

๐Ÿค– Slave Drivers

Mock Slave

Perfect simulation for development

const config: SlaveDriverConfig = {
  type: "mock-slave",
  simulateLatency: 50,      // ms response delay
  simulateErrors: false,    // random failures
  responseDelay: 20         // command execution time
};

await robotManager.connectSlave('robot-1', config);

Features:

  • โœ… Perfect command execution (real = virtual)
  • โœ… Configurable latency and errors
  • โœ… Real-time state feedback
  • โœ… Instant connection

USB Slave (Planned)

Physical robot via feetech.js

const config: SlaveDriverConfig = {
  type: "usb-slave",
  port: "/dev/ttyUSB0",     // auto-detect if undefined
  baudRate: 115200
};

Features:

  • โœ… Direct hardware control
  • โœ… Position/speed commands
  • โœ… Real servo feedback
  • โœ… Calibration support

Simulation Slave (Planned)

Physics-based simulation

const config: SlaveDriverConfig = {
  type: "simulation-slave",
  physics: true,
  collisionDetection: true
};

๐Ÿ”„ Command Flow Architecture

Command Structure

interface RobotCommand {
  timestamp: number;
  joints: {
    name: string;
    value: number;      // degrees for revolute, speed for continuous
    speed?: number;     // optional movement speed
  }[];
  duration?: number;    // optional execution time
  metadata?: Record<string, unknown>;
}

Command Sources

Master Commands

// Continuous sequence from master
master.onCommand((commands) => {
  // Route to all connected slaves
  robot.slaves.forEach(slave => slave.executeCommands(commands));
});

Manual Commands

// Only when no master active
if (robot.manualControlEnabled) {
  await robot.updateJointValue('shoulder', 45);
}

Command Execution

// All slaves execute in parallel
const executePromises = robot.connectedSlaves.map(slave => 
  slave.executeCommand(command)
);
await Promise.allSettled(executePromises);

๐ŸŽฎ Usage Examples

Basic Master-Slave Setup

// 1. Create robot
const robot = await robotManager.createRobot('arm-1', urdfConfig);

// 2. Add slaves for execution
await robotManager.connectMockSlave('arm-1');      // Development
await robotManager.connectUSBSlave('arm-1');       // Real hardware

// 3. Connect master for control
await robotManager.connectDemoSequences('arm-1');  // Automated sequences

// 4. Monitor status
const status = robotManager.getRobotStatus('arm-1');
console.log(`Master: ${status.masterName}, Slaves: ${status.connectedSlaves}`);

Multiple Robots with Different Masters

// Robot 1: Demo sequences
await robotManager.createRobot('demo-1', armConfig);
await robotManager.connectDemoSequences('demo-1', true);
await robotManager.connectMockSlave('demo-1');

// Robot 2: Remote control
await robotManager.createRobot('remote-1', armConfig);
await robotManager.connectMaster('remote-1', remoteServerConfig);
await robotManager.connectUSBSlave('remote-1');

// Robot 3: Manual control only
await robotManager.createRobot('manual-1', armConfig);
await robotManager.connectMockSlave('manual-1');
// No master = manual control enabled

Master Switching

// Switch from manual to automated control
await robotManager.connectDemoSequences('robot-1');
// Panel inputs now disabled, sequences control robot

// Switch back to manual control  
await robotManager.disconnectMaster('robot-1');
// Panel inputs re-enabled, manual control restored

๐Ÿš€ Benefits

1. Clear Control Hierarchy

  • Masters provide commands exclusively
  • Slaves execute commands in parallel
  • No ambiguity about command source

2. Flexible Command Sources

  • Remote servers for network control
  • Predefined sequences for automation
  • Manual control for testing/setup
  • Easy to add new master types

3. Multiple Execution Targets

  • Physical robots via USB
  • Simulated robots for testing
  • Mock robots for development
  • All execute same commands simultaneously

4. Automatic Panel Management

  • Panel disabled when master active
  • Panel re-enabled when master disconnected
  • Clear visual feedback about control state

5. Safe Operation

  • Masters cannot conflict (only 1 allowed)
  • Graceful disconnection with rest positioning
  • Error isolation between slaves

6. Development Workflow

  • Test with mock slaves during development
  • Add real slaves for deployment
  • Switch masters for different scenarios

๐Ÿ”ฎ Implementation Roadmap

Phase 1: Core Architecture โœ…

  • Master-Slave interfaces
  • Robot class with dual management
  • RobotManager orchestration
  • MockSequenceMaster with demo patterns
  • MockSlave for testing

Phase 2: Real Hardware

  • USBSlave implementation (feetech.js integration)
  • Calibration system for hardware slaves
  • Error handling and recovery

Phase 3: Remote Control

  • RemoteServerMaster (HTTP/WebSocket)
  • Authentication and security
  • Real-time command streaming

Phase 4: Advanced Features

  • ScriptPlayerMaster (JS/Python execution)
  • SimulationSlave (physics integration)
  • Command recording and playback
  • Multi-robot coordination

๐Ÿ›ก๏ธ Safety Features

Master Safety

  • Only 1 master per robot prevents conflicts
  • Master disconnect automatically restores manual control
  • Command validation before execution

Slave Safety

  • Rest positioning before disconnect
  • Smooth movement transitions
  • Individual slave error isolation
  • Calibration offset compensation

System Safety

  • Graceful degradation on slave failures
  • Command queuing prevents overwhelming
  • Real-time state monitoring
  • Emergency stop capabilities (planned)

๐Ÿ”ง Migration from v1.0

The new architecture is completely different from the old driver pattern:

Old Architecture (v1.0)

// Single driver per robot
const driver = new USBRobotDriver(config);
await robot.setDriver(driver);
await robot.updateJointValue('joint', 45);

New Architecture (v2.0)

// Separate masters and slaves
await robotManager.connectMaster(robotId, masterConfig);   // Command source
await robotManager.connectSlave(robotId, slaveConfig);     // Execution target

// Manual control only when no master
if (robot.manualControlEnabled) {
  await robot.updateJointValue('joint', 45);
}

Key Changes

  1. Drivers โ†’ Masters + Slaves: Split command/execution concerns
  2. Single Connection โ†’ Multiple: 1 master + N slaves per robot
  3. Always Manual โ†’ Conditional: Panel disabled when master active
  4. Direct Control โ†’ Command Routing: Masters route to all slaves

The new architecture provides dramatically more flexibility while maintaining complete backward compatibility for URDF visualization and joint control.


This architecture enables sophisticated robot control scenarios from simple manual operation to complex multi-robot coordination, all with a clean, extensible design.