Autonomous sorter for small VEX hardware. An SO-ARM101 picks one piece from a pile and drops it into an enclosure; a camera classifies it; a rotating arm turns to the matching bin and lets it fall in. Repeats until the pile is empty.
Team 11101B — Henry, Vihaan, Aditya
pile ─▶ SO-ARM101 pick ─▶ enclosure ─▶ classify (Arducam) ─▶ rotating-arm router ─▶ bin
▲ │
└──────────────────────── repeat until empty ◀───────────────────────────┘
./scripts/install.sh # Python 3.12 venv + all dependencies
source .venv/bin/activate
python run.py --dry-run # runs the whole pipeline with NO hardware (simulated)Then wire up real hardware:
./scripts/find_ports.sh # get USB ports -> put them in config.yaml
# edit config.yaml (ports, poses, bins, camera indices), set run.dry_run: false
python run.pyThat's it — edit one file (config.yaml), run one file (run.py).
| Section | What you set |
|---|---|
run |
continuous vs step mode, dry_run, when to give up |
arm |
USB port, ACT policy id, and the scripted home / inspect / box_drop poses |
cameras |
indices for top, wrist, and the box Arducam |
perception |
pile / gripper regions and the empty-pile threshold |
classifier |
model path, the class labels, confidence cutoff |
router |
controller port and each label's bins angle |
- The ACT policy grasps a piece and lifts to the
inspectpose. - Gripper position says whether it grabbed anything at all (empty grasp → retry).
- The wrist camera counts pieces in the gripper:
2+→ drop back and retry,1→ continue. - The top camera counts pieces left on the tray; several
0reads in a row → done.
- ACT pick policy — set
arm.policyto your Hub id (e.g.VEXAutoSort/act_pick_v1). - Classifier — drop a TorchScript model at
models/classifier.pt(224×224 RGB → logits overlabels). Missing model ⇒ everything is labelledunknownso the loop still runs. - Router firmware — the Arduino answers
G<angle>\nwithOK\n(seeautosort/router.py).
config.yaml # the one config
run.py # the one entry point
autosort/
config.py # load + validate config.yaml
arm.py # SO-ARM101: ACT pick + scripted place + gripper feedback
perception.py # blob-count checks: single-grasp + empty-pile
classifier.py # Arducam piece classification
router.py # rotating-arm bin routing (serial)
pipeline.py # the loop that ties it together (also `python -m autosort.pipeline`)
scripts/ # install.sh, find_ports.sh
models/ # trained weights (gitignored)
The structure, control loop, config, and dry-run are complete and runnable.
Three integration points are marked as stubs until the trained assets exist: the ACT
policy preprocessing (arm.pick), the classifier weights (classifier.py), and the
router firmware protocol (router.py).