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
94.3%
Ball mAP@50
91.7%
Hoop mAP@50
88.5%
Opponent mAP@50
28 fps
Inference
4
Strategy Zones
≤ 0.8m
Dunk Threshold
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
ROBOT-EYE CAM · /dev/video0 28.2 FPS · 12ms
SCANNING...
IMU + SENSOR FUSION
Pitch (IMU Y)
0.0°
Roll (IMU X)
0.0°
Dist. to Hoop
Opponent Dist.
◈ FIELD MAP — ZONE CLASSIFIER ZONE: —
STRATEGY DECISION OUTPUT
CURRENT ACTION
DRIBBLE
Moving to approach zone...
ZONE A · dist=4.2m · opp=safe
Pan error
Shoot θ
IMU comp.
STRATEGY LOG
[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
ZoneDist. to HoopOpponentBall HeldIMU StableDecisionAngle Calc
A · FAR> 4.0 mAnyYesAnyDRIBBLE
A · FAR> 4.0 mAnyNoAnyDEFEND / CHASE
B · MID1.8–4.0 mBlockingYesAnyDRIBBLE (evade)Stand-by
B · MID1.8–4.0 mClearYesYesAPPROACH + ALIGNpan_err, dist
C · SHOOT0.8–1.8 mClearYesYesSHOOTθ_final full chain
C · SHOOT0.8–1.8 mBlockingYesYesHOLD → WAIT CLEARPre-computed
C · SHOOT0.8–1.8 mAnyYesNoABORT → STABILIZEIMU unsafe
D · DUNK≤ 0.8 mAnyYesYesSLAM DUNKArm extend only
D · DUNK≤ 0.8 mAnyYesNoABORT → REVERSEIMU unsafe
robot@strategy:~$ python eval.py --all-classes --match-sim
3-CLASS DETECTION PERFORMANCE
ClassPrecisionRecallmAP@50Note
basketball91.8%93.1%94.3%Orange, high contrast
hoop89.2%90.5%91.7%Fixed H=3.05m
opponent_robot86.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