unfinished Readme changes
This commit is contained in:
@@ -9,40 +9,38 @@ JackBot is a modular 3D hexapod robot control and machine learning framework bui
|
|||||||
JackBot is a Python-based hexapod robot project that combines:
|
JackBot is a Python-based hexapod robot project that combines:
|
||||||
|
|
||||||
* a robot control stack for a six-legged walking robot,
|
* a robot control stack for a six-legged walking robot,
|
||||||
* a physics simulator for testing in software before using real hardware, and
|
* a physics simulator (`simulation.py`) for testing in software before using real hardware, and
|
||||||
* a reinforcement learning pipeline that teaches the robot how to move through trial and error.
|
* a reinforcement learning pipeline that teaches the robot how to move through trial and error or pretraining from kinematics.
|
||||||
|
|
||||||
The project is not just one script or one model. It is a full control system that can:
|
The project is a full control system that can:
|
||||||
|
|
||||||
* run the robot in a PyBullet simulation,
|
* run the robot in a PyBullet simulation,
|
||||||
* accept human commands from a GUI or gamepad,
|
* accept human commands from a GUI or gamepad,
|
||||||
* stream target joint positions to physical hardware, and
|
* stream target joint positions to physical hardware (ESP32 / Arduino), and
|
||||||
* train a policy using PPO so the robot can learn locomotion automatically.
|
* train and evaluate policy checkpoints using PPO and Behavioral Cloning (BC).
|
||||||
|
|
||||||
## Why the Project Exists
|
## Why the Project Exists
|
||||||
|
|
||||||
A hexapod is hard to control manually because each leg has several joints and the robot has to maintain balance while moving. Instead of hard-coding every motion rule, this project uses the robot model and physics simulation as a testbed to learn walking behavior.
|
A hexapod is hard to control manually because each leg has several joints and the robot has to maintain balance while moving. Instead of hard-coding every motion rule, this project uses the robot model and physics simulation as a testbed to learn or refine walking behavior.
|
||||||
|
|
||||||
In practice, the workflow looks like this:
|
In practice, the RL workflow looks like this:
|
||||||
|
|
||||||
1. The robot starts from a standing pose.
|
1. The robot starts from a standing pose.
|
||||||
2. The policy receives sensory information from the simulation.
|
2. The policy receives sensory information (joint angles + command vector) from the simulation.
|
||||||
3. The policy chooses new joint target motions.
|
3. The policy chooses continuous target joint positions.
|
||||||
4. The simulation updates the physics.
|
4. The simulation steps forward and computes physics.
|
||||||
5. The policy receives a reward for surviving and moving in the right direction.
|
5. The policy receives shaped rewards for surviving, following commands, and remaining stable.
|
||||||
6. Over many iterations, PPO improves the controller.
|
6. Over many iterations, PPO improves the locomotion policy.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Key Components
|
## Key Components
|
||||||
|
|
||||||
* **Robot abstraction (`Robot.py`)**: wraps the robot body, robot state, and joint control API.
|
* **Robot abstraction (`Robot.py`)**: Wraps the robot body, state machine execution, joint control API, and backend selection.
|
||||||
* **Kinematics (`kinematics.py`)**: turns target leg poses into actual joint angles through inverse kinematics.
|
* **Kinematics (`kinematics.py`)**: Turns target leg positions into actual joint angles through inverse kinematics.
|
||||||
* **Simulation (`simulation.py`)**: creates and updates the PyBullet world where the robot can be tested safely.
|
* **Simulation (`simulation.py`)**: Consolidates PyBullet scene management, motor positioning, physics queries, and environment stepping into a single manager.
|
||||||
* **Inputs (`inputs/`)**: lets the robot be controlled from either a GUI, a gamepad, or a generated target command.
|
* **Inputs (`inputs/`)**: Interface for receiving control commands from a GUI, gamepad, or procedural random generators.
|
||||||
* **ML environment (`ml/env.py`)**: provides the Gymnasium environment that the policy interacts with.
|
* **ML Subsystem (`ml/`)**: Contains Gymnasium environments (`env.py`), custom callbacks (`callbacks.py`), behavioral cloning pretraining (`pretrain_bc.py`), PPO training (`run_train.py`), and multi-phase evaluation scripts (`run_eval.py`, `run_eval_training.py`).
|
||||||
* **PPO training (`ml/train.py`)**: trains a policy using stable-baselines3.
|
|
||||||
* **Evaluation (`ml/evaluate.py`)**: loads a saved model and runs policy rollouts to inspect performance.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -50,40 +48,40 @@ In practice, the workflow looks like this:
|
|||||||
|
|
||||||
```text
|
```text
|
||||||
JackBot/
|
JackBot/
|
||||||
├── main.py # manual control and hardware streaming entry point
|
├── main.py # Manual control, GUI, and hardware streaming entry point
|
||||||
├── Robot.py # robot wrapper and backend abstraction
|
├── Robot.py # Robot wrapper, gait execution, and backend abstraction
|
||||||
├── config.py # global settings and communication configuration
|
├── config.py # Global settings and hardware/backend configuration
|
||||||
├── kinematics.py # inverse kinematics used to map motion commands to joints
|
├── kinematics.py # Inverse kinematics mapping cartesian targets to joint angles
|
||||||
├── simulation.py # PyBullet simulation shell for the robot
|
├── simulation.py # PyBullet simulation manager (handles engine, URDF loading, & physics)
|
||||||
├── robot_init.py # neutral standing pose and initial joint values
|
├── robot_init.py # Neutral standing pose and initial joint definitions
|
||||||
├── DataTypes.py # typed data structures for positions and joint angles
|
├── DataTypes.py # Typed numpy structures for positions and joint angles
|
||||||
│
|
│
|
||||||
├── states/ # gait/state-machine behavior logic
|
├── states/ # Gait and state-machine behavior logic
|
||||||
│ ├── State.py
|
│ ├── State.py
|
||||||
│ ├── IdleState.py
|
│ ├── IdleState.py
|
||||||
│ ├── WalkingState.py
|
│ ├── WalkingState.py
|
||||||
│ └── WaveState.py
|
│ └── WaveState.py
|
||||||
│
|
│
|
||||||
├── inputs/ # command sources for the robot
|
├── inputs/ # Command input sources
|
||||||
│ ├── InputProvider.py
|
│ ├── InputProvider.py
|
||||||
│ ├── PygameController.py
|
│ ├── PygameController.py
|
||||||
│ └── RandomeInputProvider.py
|
│ └── RandomeInputProvider.py
|
||||||
│
|
│
|
||||||
├── gui/ # visual control frontend
|
├── gui/ # Visual control frontend (Tkinter/CustomTkinter)
|
||||||
│ └── MainWindow.py
|
│ └── MainWindow.py
|
||||||
│
|
│
|
||||||
├── EspCommunication.py # ESP32 communication layer
|
├── EspCommunication.py # ESP32 socket communication layer
|
||||||
├── ArduinoCommunication.py # Arduino serial communication layer
|
├── ArduinoCommunication.py # Arduino serial communication layer
|
||||||
├── JackBotUrdf.urdf # robot mesh and joint definition
|
├── JackBotUrdf.urdf # Robot URDF mesh and joint axis definition
|
||||||
│
|
│
|
||||||
└── ml/ # reinforcement learning subsystem
|
└── ml/ # Reinforcement Learning Subsystem
|
||||||
├── env.py # Gymnasium environment used by PPO
|
├── env.py # Gymnasium environment wrapping PyBullet & Robot control
|
||||||
├── SimManager.py # PyBullet scene setup and stepping
|
├── callbacks.py # Custom SB3 callbacks for TensorBoard logging & Curriculum progression
|
||||||
├── MetricsOverlay.py # HUD and visual overlays
|
├── pretrain_bc.py # Behavioral Cloning (BC) script to pre-train policy from IK teacher
|
||||||
├── train.py # PPO training entry point
|
├── run_train.py # Main training entry point (runs parallelized PPO via SubprocVecEnv)
|
||||||
├── run_train.py # command-line training launcher
|
├── run_eval.py # Phase-by-phase policy evaluator with CLI reports
|
||||||
├── evaluate.py # policy evaluation loop
|
├── run_eval_training.py # Benchmark reward system across phases using pure kinematics
|
||||||
└── run_eval.py # CLI wrapper for evaluation
|
└── MetricsOverlay.py # PyBullet HUD debug text and visual overlays
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -91,7 +89,7 @@ JackBot/
|
|||||||
## System Requirements
|
## System Requirements
|
||||||
|
|
||||||
* **Python 3.12** (Recommended)
|
* **Python 3.12** (Recommended)
|
||||||
* **OS:** Linux (Ubuntu/Debian) or Windows 10/11
|
* **OS:** Windows 10/11 or Linux
|
||||||
* **Dependencies:** `pybullet`, `gymnasium`, `stable-baselines3`, `torch`, `numpy`, `pygame`, `ikpy`, `pyserial`, `matplotlib`
|
* **Dependencies:** `pybullet`, `gymnasium`, `stable-baselines3`, `torch`, `numpy`, `pygame`, `ikpy`, `pyserial`, `matplotlib`
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -118,9 +116,9 @@ pip install -r requirements.txt
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Usage Guide
|
### Usage Guide
|
||||||
|
|
||||||
### 1. Manual Control & Hardware Streaming (`main.py`)
|
## Manual Control & Hardware Streaming (`main.py`)
|
||||||
|
|
||||||
`main.py` is the operational entry point for driving the robot manually via GUI sliders or a gamepad, running either in 3D PyBullet simulation or connected to physical hardware.
|
`main.py` is the operational entry point for driving the robot manually via GUI sliders or a gamepad, running either in 3D PyBullet simulation or connected to physical hardware.
|
||||||
|
|
||||||
@@ -139,19 +137,11 @@ Edit `config.py` prior to launching `main.py` to configure execution mode and co
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 2. How the Machine Learning System Works
|
### Machine Learning Pipeline (`ml/`)
|
||||||
|
|
||||||
The machine learning subsystem teaches the robot to move by interacting with a simulation environment instead of relying on a manually written gait controller.
|
The machine learning system trains the hexapod to move using a combination of Behavioral Cloning (BC) (optional) and Proximal Policy Optimization (PPO) driven by a multi-phase curriculum.
|
||||||
|
|
||||||
At a high level:
|
### ML Workflow Steps
|
||||||
|
|
||||||
* The policy receives a vector of observations from the simulator.
|
|
||||||
* The policy outputs a set of continuous joint deltas.
|
|
||||||
* Those outputs are applied to the robot in the physics simulation.
|
|
||||||
* The environment computes a reward based on survival, movement, stability, and command-following quality.
|
|
||||||
* PPO updates the policy over many training iterations to improve the controller.
|
|
||||||
|
|
||||||
#### What the policy sees and does
|
|
||||||
|
|
||||||
The policy input contains:
|
The policy input contains:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user