Files

401 lines
11 KiB
Markdown

# Enuxia Vacuum
**Open, local-first robotics stack for autonomous vacuum robots.**
Enuxia Vacuum is an independent open-source fork of [VacuumTiger](https://github.com/codetiger/VacuumTiger), now developed by **Enuxia** as a platform for fully local robot control, mapping, navigation and cleaning.
The project started from a practical goal: take commodity robot-vacuum hardware and turn it into a robot that can be understood, modified, self-hosted and improved without depending on a proprietary cloud.
Today, our primary development platform is the **Proscenic M6 Pro / 3irobotix CRL-200S**.
> The long-term goal is not merely to reproduce the factory firmware.
> It is to build a cleaner, more modular and more capable robotics stack around the hardware.
---
## Why Enuxia Vacuum?
Most consumer robot vacuums are closed systems:
- proprietary firmware;
- vendor-controlled cloud services;
- undocumented hardware protocols;
- limited local APIs;
- difficult long-term maintenance;
- little room for experimentation.
Enuxia Vacuum takes the opposite approach:
- **local-first** — the robot can operate without a vendor cloud;
- **open** — hardware protocols and software architecture are inspectable;
- **modular** — hardware access, SLAM, navigation and UI are separated;
- **self-hostable** — high-level computation can run on your own Linux infrastructure;
- **hardware-aware** — the stack is built around real sensors, actuators and failure modes;
- **hackable** — the project is intended to be understood and extended.
---
## Current status
The CRL-200S / M6 Pro platform is already functional as a development robot.
| Area | Status |
|---|---|
| Root / recovery access | ✅ Validated |
| Low-level hardware control | ✅ Validated |
| Wheel encoders | ✅ Validated |
| IMU | ✅ Validated |
| Bumpers | ✅ Validated |
| Cliff sensors | ✅ Validated |
| Battery / charging telemetry | ✅ Validated |
| Vacuum / brushes | ✅ Validated |
| Delta-2D LiDAR | ✅ Decoded and corrected |
| GD32 cold-boot initialization | ✅ Fixed |
| Local sensor streaming | ✅ Operational |
| 2D SLAM | 🟡 Functional, still being consolidated |
| Global navigation | 🟡 Existing baseline |
| Navigation V2 | 🚧 In development |
| Local obstacle avoidance | 🚧 Planned / in development |
| Cleaning coverage planner | 📋 Planned |
| Docking | 📋 Planned |
| Local API | 📋 Planned |
| PWA / Android application | 📋 Planned |
---
## Architecture
The current architecture keeps the hardware-facing code on the robot while allowing heavier robotics workloads to run on a Linux machine on the local network.
```text
┌──────────────────────────────────────────────┐
│ User layer │
│ PWA / Android / diagnostics │
└──────────────────────┬───────────────────────┘
│
▼
┌──────────────────────────────────────────────┐
│ Mission Manager │
│ map / clean / goto / dock │
└──────────────────────┬───────────────────────┘
│
┌──────────────┴──────────────┐
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ Exploration │ │ Cleaning Planner │
│ frontier / info │ │ coverage / rooms │
└────────┬─────────┘ └────────┬─────────┘
└──────────────┬─────────────┘
▼
┌─────────────────┐
│ Global Planner │
│ Theta* │
└────────┬────────┘
▼
┌─────────────────┐
│ Local Planner │
│ DWA │
└────────┬────────┘
▼
┌─────────────────┐
│ SangamIO │
│ hardware layer │
└────────┬────────┘
▼
┌─────────────────┐
│ Robot │
└─────────────────┘
```
A layered local costmap is planned between perception and the local planner:
```text
SLAM static map
Live LiDAR
Bumper contacts
Cliff sensors
No-go zones
Robot footprint
│
▼
Layered Costmap
│
▼
Local Planner
```
---
## Repository layout
```text
enuxia-vacuum/
├── sangam-io/ # Hardware abstraction and robot drivers
├── dhruva-slam/ # SLAM, mapping and current navigation stack
├── dhruva-nav/ # Upstream navigation research / reusable building blocks
├── drishti/ # Engineering and diagnostic UI
├── vastu-slam/ # SLAM library
├── protocol-mitm/ # Reverse-engineering / protocol tooling
└── slam-test/ # Integration and algorithm tests
```
The internal component names are intentionally preserved during the first stages of the fork. Renaming them all at once would make upstream comparison and regression analysis unnecessarily difficult.
---
## Primary hardware: Proscenic M6 Pro / CRL-200S
The current development target uses:
- **SoC:** Allwinner A33
- **MCU:** GD32F103
- **LiDAR:** Delta-2D
- **MCU UART:** `/dev/ttyS3`
- **LiDAR UART:** `/dev/ttyS1`
- **Linux:** Tina Linux / OpenWrt based userspace
The hardware driver exposes the robot through SangamIO, which provides a robot-agnostic control and telemetry interface to higher-level software.
### Validated CRL-200S work
The Enuxia fork includes additional work validated on real M6 Pro hardware, including:
- GD32 initialization reliable after cold boot;
- corrected Delta-2D angular decoding;
- stable full-revolution LiDAR scans;
- wheel / bumper / cliff / battery telemetry;
- drive, vacuum and brush control;
- persistent bumper observations in SLAM;
- SLAM pose-graph and submap correction work;
- exploration and navigation failure handling improvements.
---
## SangamIO
[`sangam-io/`](sangam-io/) is the hardware abstraction layer.
It is responsible for:
- robot-specific protocol handling;
- sensor acquisition;
- wheel commands;
- actuators;
- LiDAR control;
- telemetry streaming;
- hardware-independent commands for upper layers.
High-level navigation code should not need to understand the GD32 protocol directly.
See [sangam-io/README.md](sangam-io/README.md).
---
## DhruvaSLAM
[`dhruva-slam/`](dhruva-slam/) provides the current mapping and localization stack.
It includes:
- wheel odometry;
- LiDAR preprocessing;
- scan matching;
- occupancy-grid mapping;
- submaps;
- loop closure;
- pose graph optimization;
- map streaming;
- the current navigation/exploration baseline.
The existing navigator is considered a **baseline**, not the final architecture.
See [dhruva-slam/README.md](dhruva-slam/README.md).
---
## Navigation V2
Navigation is the next major Enuxia development milestone.
The current architecture couples global planning, frontier exploration and recovery too tightly. Navigation V2 will separate these responsibilities.
Target design:
```text
Mission
↓
Goal
↓
Global planner (Theta*)
↓
Global path
↓
Local costmap
↓
Local planner (DWA)
↓
Velocity commands
↓
Progress / stuck detector
↓
Recovery manager
```
### Goals
Navigation V2 is intended to provide:
- real local obstacle avoidance;
- footprint-aware collision checking;
- dynamic obstacle handling;
- measured, encoder-based recovery;
- repeated-contact memory;
- robust stuck detection;
- independent global and local planning;
- clean separation between exploration and navigation.
A bumper contact must become information, not simply trigger a timed reverse command.
---
## Mapping vs cleaning
Mapping and cleaning are intentionally treated as two separate problems.
### Mapping
```text
unknown space
↓
frontier detection
↓
safe approach poses
↓
navigation
↓
map expansion
```
### Cleaning
Once a stable map exists:
```text
saved map
↓
room segmentation
↓
coverage planning
↓
cleaning lanes
↓
local obstacle avoidance
↓
return to dock
```
Future cleaning modes may include:
- whole-home cleaning;
- room cleaning;
- zone cleaning;
- spot cleaning;
- multiple passes;
- no-go / no-mop areas;
- multi-floor maps.
---
## Building
### SangamIO
```bash
cd sangam-io
rustup target add armv7-unknown-linux-musleabihf
cargo build --release \
--target armv7-unknown-linux-musleabihf
```
Depending on your toolchain, an ARM cross-linker may be required.
### DhruvaSLAM
```bash
cd dhruva-slam
cargo test
cargo build --release
```
### Drishti
```bash
cd drishti
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python drishti_ui.py --help
```
---
## Safety
This project controls physical hardware.
During development:
- supervise all motion tests;
- keep a reliable way to stop the robot;
- test away from stairs and drops;
- do not bypass cliff protection;
- do not run the factory hardware controller and SangamIO at the same time on platforms where they compete for the same hardware;
- expect experimental navigation code to fail.
Enuxia Vacuum is research and development software. It is not currently a safety-certified robotic system.
---
## Project origin
Enuxia Vacuum did **not** start from a blank repository.
It is derived from the open-source **VacuumTiger** project:
- upstream repository: `codetiger/VacuumTiger`
- original root copyright notice: Copyright © 2024 Harishankar Narayanan
- upstream history is intentionally preserved in this repository
The fork retains upstream code, history and applicable copyright/license notices while developing an independent technical direction under Enuxia.
We are grateful to the upstream project for the reverse-engineering and software foundation that made this work possible.
See [ATTRIBUTION.md](ATTRIBUTION.md) for details.
---
## License
This repository is a derivative work containing code from multiple upstream components.
The root `LICENSE` inherited from VacuumTiger is MIT. Some subprojects also declare MIT, Apache-2.0, or dual MIT/Apache-2.0 licensing in their own metadata.
**Applicable upstream notices and component-specific licenses must be preserved.**
Before packaging or redistributing binaries, review the license metadata of the components you are distributing.
---
## Enuxia
Enuxia develops local-first systems that connect software, infrastructure and physical hardware.
This project follows the same principle:
> **The machine should remain understandable, controllable and useful without depending on somebody else's cloud.**