◆ ABU Robocon · Basketball Robot · CV + Strategy Engine · 2025
COMPUTER VISION
STRATEGY ENGINE
Full-stack vision pipeline untuk robot basket ABU Robocon —
YOLOv8 3-class detection (bola, hoop, robot lawan),
zone-based strategy engine dengan keputusan dribble, approach, shoot,
dan slam dunk berdasarkan fusi IMU, depth estimation, dan pixel offset hoop.
ABU ROBOCON · MATCH MODE
OPPONENT DETECTED
YOLOv8 · 3-class
Zone Strategy Engine
Kalman · SORT Tracker
IMU Sensor Fusion
Slam Dunk Logic
ROS 2 Humble
robot@strategy:~$
python main.py
--mode match --strategy full --ros-publish
FULL PIPELINE — PERCEPTION → DECISION → ACTUATION
📷Camera
CSI
▶
⚙Pre-
process
▶
🎯YOLO
3-class
▶
〄Kalman
+SORT
▶
⚠IMU
Fusion
▶
⊕Zone
Classify
▶
◈Strategy
Engine
▶
↗Angle
Calc
▶
📡ROS
Publish
robot@strategy:~$
./live_strategy
--field-map --cv-overlay --decision-feed
CURRENT ACTION
DRIBBLE
Moving to approach zone...
ZONE A · dist=4.2m · opp=safe
[SYS] Strategy engine v2.1 initialized
[SYS] Loading YOLOv8n weights/best.pt...
[OK] Model ready — 3 classes detected
[IMU] MPU-6050 calibration complete
[STR] ABU Robocon match started
[RUN] Entering field — DRIBBLE mode
robot@strategy:~$
cat config/zones.yaml
◎
Zone A — Dribble
dist > 4.0 m
Robot terlalu jauh. Navigasi ke zone B sambil dribble, track lawan, hindari tabrakan.
NAVIGATE
◉
Zone B — Approach
1.8 m < dist ≤ 4.0 m
Sweet spot. Mulai alignment ke hoop, hitung pan_err & dist, tunggu lawan clear sebelum maju.
ALIGN
⊕
Zone C — Shoot
0.8 m < dist ≤ 1.8 m
Range optimal. Eksekusi full parabola angle chain: pixel offset → depth → IMU comp → θ_final.
SHOOT
◈
Zone D — Slam Dunk
dist ≤ 0.8 m
Skip parabola — robot cukup dekat. Arm aktuator extend vertikal, bola masuk dari atas hoop langsung.
SLAM DUNK
robot@strategy:~$
python angle_solver.py
--imu-comp --hoop-fixed --pixel-offset --depth
SHOOT ANGLE FORMULA CHAIN — 4 INPUT FUSION
Step 1 — Pixel offset → angular error
Δx_px = hoop_cx − frame_cx [pixel]
pan_err = Δx_px × (FOV_h / W) [°, yaw motor target]
tilt_err = Δy_px × (FOV_v / H) [°, tilt correction]
Step 2 — Bounding box → depth
dist = (f_px × D_hoop) / bb_h [m]
D_hoop=0.45m · f_px=focal in px
Step 3 — Parabola angle (Zone C only)
Δh = H_hoop(3.05m) − H_robot_cam
θ_raw = atan( (v²+√(v⁴−g(gd²+2Δh·v²))) / gd )
v=8 m/s · g=9.81 m/s²
Step 4 — IMU compensation
θ_final = θ_raw − pitch_imu − tilt_err
pan_cmd = pan_err [→ /robot/yaw_cmd]
DUNK = arm_extend(dist≤0.8m) [skip θ]
SHOOT θ vs DISTANCE — ZONE OVERLAY
robot@strategy:~$
cat strategy/decision_tree.py
--export-table
FULL DECISION TABLE — ZONE × CONDITION → ACTION
| Zone | Dist. to Hoop | Opponent | Ball Held | IMU Stable | Decision | Angle Calc |
| A · FAR | > 4.0 m | Any | Yes | Any | DRIBBLE | — |
| A · FAR | > 4.0 m | Any | No | Any | DEFEND / CHASE | — |
| B · MID | 1.8–4.0 m | Blocking | Yes | Any | DRIBBLE (evade) | Stand-by |
| B · MID | 1.8–4.0 m | Clear | Yes | Yes | APPROACH + ALIGN | pan_err, dist |
| C · SHOOT | 0.8–1.8 m | Clear | Yes | Yes | SHOOT | θ_final full chain |
| C · SHOOT | 0.8–1.8 m | Blocking | Yes | Yes | HOLD → WAIT CLEAR | Pre-computed |
| C · SHOOT | 0.8–1.8 m | Any | Yes | No | ABORT → STABILIZE | IMU unsafe |
| D · DUNK | ≤ 0.8 m | Any | Yes | Yes | SLAM DUNK | Arm extend only |
| D · DUNK | ≤ 0.8 m | Any | Yes | No | ABORT → REVERSE | IMU unsafe |
robot@strategy:~$
python eval.py
--all-classes --match-sim
3-CLASS DETECTION PERFORMANCE
| Class | Precision | Recall | mAP@50 | Note |
| basketball | 91.8% | 93.1% | 94.3% | Orange, high contrast |
| hoop | 89.2% | 90.5% | 91.7% | Fixed H=3.05m |
| opponent_robot | 86.4% | 85.9% | 88.5% | Variable shape |
Total training imgs2,640 (3 classes)
AugmentationMosaic · flip · HSV · blur · rotate
Inference deviceRaspberry Pi 5 · NCNN
ROS topics out/shoot_cmd · /yaw_cmd · /dunk_cmd
DECISION FREQUENCY — SIMULATED MATCH