[ 03 / ROBOT ]
APEX-R1.
A turret shooter for BIOBUZZ™ that aims while it drives.
Concept model · generated from RobotConstants.java · real CAD pending
- DWG
- DWG-003
- REV
- A
- UPDATED
- 2026-10-12
- STATUS
- IN DEVELOPMENT
Scroll to spin the chassis — the turret holds its lockScroll · 8 subsystems, then aim it yourself
Telemetry: as you scroll, the chassis heading changes while the turret angle changes the opposite way, so the shooter keeps pointing at the HIVE — except at the turret's ±170° hard stops.
Scroll to spin the chassis — the turret holds its lock
Click a part to read about it
Concept model · generated from RobotConstants.java · real CAD pending
[ 01 / DRIVE ]
Drivetrain
Four mecanum wheels let the chassis strafe and turn at once, so the robot can reposition while the turret keeps aiming.
- Wheels
- 4 × 104 mm mecanumRobotConstants.java · Drive.WHEEL_DIAMETER_IN = 4.094488
- Motors
- 4 × goBILDA 5202-series (312 RPM)RobotConstants.java · Drive.TICKS_PER_REV = 537.7
- Free speed
- 66.9 in/sRobotConstants.java · Drive.FREE_SPEED_IN_PER_SEC
- Slow mode
- 35 % powerRobotConstants.java · Drive.SLOW_MODE_SCALE
- Wiring
- Left side on Expansion Hub, right side on Control Hubhub-backup/README-rewire.md
312 rpm× π× 4.094 in÷ 60=66.9 in/s
Strafe, drive and turn add per wheel, so the robot can slide sideways while it spins.
RobotConstants.java · Drive.FREE_SPEED_IN_PER_SEC = 66.889
[ 02 / ODOMETRY ]
Odometry
The goBILDA Pinpoint tracks where the robot is and how fast it is moving. In BIOBUZZ™ the AprilTags move, so odometry — not vision — localises the robot.
- Computer
- goBILDA Pinpoint (“odomcomp”)RobotConstants.java · Names.PINPOINT
- Pod offsets
- X −84 mm · Y −168 mmRobotConstants.java · Odo.X/Y_POD_OFFSET_MM
- Fused IMU
- 1500 Hz heading ratedocs/03-ARCHITECTURE.md
- Pose history
- 0.5 s (latency correction)RobotConstants.java · Odo.POSE_HISTORY_SECONDS
- Paths
- Pedro PathingPedroConstants.java
Only the sideways offset of the forward pod and the forward offset of the sideways pod matter — that is all the Pinpoint asks for.
RobotConstants.java · Odo.X_POD_OFFSET_MM = −84 · Odo.Y_POD_OFFSET_MM = −168
[ 03 / INTAKE ]
Intake
A driven roller and two continuous-rotation servos pull POLLEN and NECTAR off the tiles into the hopper.
- Main roller
- goBILDA 5202 motor (“intakemain”)RobotConstants.java · Names.INTAKE
- Side rollers
- 2 × continuous-rotation servosRobotConstants.java · Names.INTAKE_SERVO_L/R
- Capacity rule
- Max 4 scoring elements controlledCompetition Manual TU04 · G407
- “rightintake”Control · servo 1
- “intakemain”Expansion · motor 2
- “leftintake”Expansion · servo 5
hub-backup/README-rewire.md · the 2026-10-11 rewire
[ 04 / HOPPER ]
Hopper + sorter
A REV Color Sensor V3 in the hopper throat classifies each ball, picks the shooter RPM for it, and ejects the opponent's NECTAR — a rule-compliance feature (G408), not just an efficiency one.
- Sensor
- REV Color Sensor V3 (“ball_color”)RobotConstants.java · Names.BALL_COLOR
- POLLEN hue
- 35°–85° (yellow)RobotConstants.java · Colors.POLLEN_HUE_MIN/MAX
- Red / blue hue
- 340°–20° · 190°–265°RobotConstants.java · Colors
- Ball present
- < 25 mmRobotConstants.java · Colors.BALL_PRESENT_MM
- Rule
- No control of opponent NECTARCompetition Manual TU04 · G408
- P · POLLEN
- 35–85°
- R · NECTAR
- 340–20°
- B · NECTAR
- 190–265°
A ball counts only above 0.35 saturation and closer than 25 mm — then the sorter sets the RPM for it, or spits out the opponent's NECTAR.
RobotConstants.java · Colors.POLLEN/RED/BLUE_HUE_MIN/MAX · MIN_SATURATION · BALL_PRESENT_MM
[ 05 / TURRET ]
Turret
A 5:1 geared turret holds a world-space aim. Heading-velocity feedforward counter-rotates it as the chassis spins, so the correction happens before the error does.
- Travel
- ±170°RobotConstants.java · Turret.MIN/MAX_ANGLE_RAD
- Gearing
- 5 : 1RobotConstants.java · Turret.TICKS_PER_RAD = 85.5777 × 5
- Control
- PID + kS + heading-velocity kVRobotConstants.java · Turret.KP/KD/KS/KV
- On-target tolerance
- 1.5°RobotConstants.java · Turret.TOLERANCE_RAD
- Max power
- 85 %RobotConstants.java · Turret.MAX_POWER
- Heading
- +100°
- Turret
- −100°
turret = wrap(azimuth − heading)
power += −ω × kV (kV = 0.11)
Turn the chassis 100° and the turret turns −100°: the line to the HIVE never moves. The Pinpoint reports the turn rate ω directly (fused IMU, 1500 Hz), so the turret starts turning back before an error appears — until its ±170° stop.
Turret.java · setTargetFieldAngleRad() · update(headingVelRad) · Turret.KV = 0.11
[ 06 / SHOOTER ]
Shooter
One 4-inch flywheel behind a fixed 40° hood. With the angle fixed, flight time falls straight out of the geometry and the solver only has to choose RPM.
- Flywheel
- 4.0 in diameterRobotConstants.java · Shoot.FLYWHEEL_DIAMETER_IN
- Hood
- Fixed 40° launch pitchRobotConstants.java · Shoot.LAUNCH_PITCH_DEG
- Muzzle
- 14 in above the floor, 2 in forwardRobotConstants.java · Shoot.MUZZLE_Z_IN / MUZZLE_X_IN
- Max speed
- 5000 RPMRobotConstants.java · Shoot.MAX_FLYWHEEL_RPM
- At speed
- ±100 RPM held for 0.15 sRobotConstants.java · Shoot.RPM_TOLERANCE / READY_STABLE_SEC
- Spin-up ramp
- 4000 RPM/sRobotConstants.java · Shoot.RPM_RAMP_PER_SEC
rpm = 60 × v ÷ (η × π × D)
D = 4.0 in · η POLLEN 0.50 · η NECTAR 0.42
- POLLEN
- 2,590 rpm
- NECTAR
- 3,083 rpm
Same shot to the CELL of our HIVE model (53.4 in up), same 0.45 s flight: the heavier NECTAR grips the wheel less, so it needs more RPM — which is why the colour sensor sits before the shooter. The bars fill at the code's ramp, 4,000 rpm/s: a step to full speed draws close to the motor's 9.2 A stall current, and with four drive motors accelerating that browns out the Control Hub.
Ballistics.java · muzzleSpeedToRpm() · BallType.java · Shoot.MAX_FLYWHEEL_RPM = 5000 · Shoot.RPM_RAMP_PER_SEC = 4000
[ 07 / VISION ]
Vision
A webcam tracks the HIVE CELL's AprilTag Cluster to find the target; an optional Limelight 3A polls at 100 Hz. Vision measures the target — odometry measures the robot.
- HIVE camera
- “Webcam 1”, 640 × 480RobotConstants.java · Camera.WIDTH/HEIGHT
- Mount
- 5 in forward · 10.5 in upRobotConstants.java · Camera.X_IN / Z_IN
- Ball camera
- “Webcam 2”RobotConstants.java · Names.WEBCAM_BALLS
- Optional
- Limelight 3A at 100 HzRobotConstants.java · Camera.LIMELIGHT_POLL_HZ
- Target
- AprilTag Cluster, IDs 30–45Competition Manual TU04 · 9.9
- Freshness
- Estimate trusted for 1.5 sRobotConstants.java · Hive.MAX_ESTIMATE_AGE_SEC
2 × atan(320 ÷ 622) = 54.4°
The camera is fixed to the chassis, not the turret. When the HIVE leaves its view, odometry carries the last sighting for up to 1.5 s — try it in the aim playground below.
RobotConstants.java · Camera.FX = 622 · WIDTH = 640 · MOUNTED_ON_TURRET = false · Hive.MAX_ESTIMATE_AGE_SEC = 1.5
[ 08 / ELECTRONICS ]
Electronics
A REV Control Hub and Expansion Hub run the code. Devices are found by name, so a rewire is a Driver Station job, not a programming job.
- Controllers
- REV Control Hub + Expansion Hubhub-backup/README.md
- Software
- FTC SDK v12.0 · JavaTEAM-README.md
- Pinpoint bus
- Control Hub I2C (never bus 0 — IMU)hub-backup/README-rewire.md
Control Hub
- motor 0rightback · drivetrain
- motor 1rightfront · drivetrain
- motor 3Flywheel · shooter
- servo 1rightintake · intake
- I2C ?odomcomp · Pinpoint (never bus 0)
- I2C 0imu · built-in IMU
Expansion Hub
- motor 1leftfront · drivetrain
- motor 2intakemain · intake
- motor 3leftback · drivetrain
- servo 5leftintake · intake
Note the capital F in Flywheel: hardwareMap.get() is case-sensitive.
hub-backup/README-rewire.md · names must match the Robot Configuration exactly
[ 09 / AIM ]
Aim it yourself.
Pick a range and a turret angle. The solver — the same maths as the team's Ballistics.java — chooses the flywheel speed, and the feeder only lets a ball go when all four gates of isReadyToFire() agree.
Range to HIVE
8 ft 0 in
- TOF
- 0.45 s
- Flywheel
- 2,590 rpm
- Apex
- 53.4 in
Turret · -170° … +170°
2,590RPM
Flywheel
Band = ready window ±100 rpm · ramp 4,000 rpm/s
Dashed: Webcam 1's view, ±27.2° (fixed to the chassis)
Fire gates
Solution: pass
2,590 rpm · 0.45 s
in range · turret can reach
On target: pass
settled
turret within ±1.5°
At speed: pass
2,590 / 2,590 rpm
±100 rpm for 0.15 s
HIVE fresh: pass
webcam sees it
seen < 1.5 s ago
Readyall four gates agree
Feeder idle · 0 shots
Ready to fire.
Standing still, the solver converges in 2 passes; while strafing it typically takes 4–6 (max 6). The CELL aim point is the centre of the upward opening in our HIVE model, 53.4 in up; the hood, flywheel, limits and gates are the robot's own. In 3D the ball flies at half speed so you can follow it.
[ 10 / DATA SHEET ]
The numbers.
Six figures that define APEX-R1. Each one names the constant in the team's code, or the rule in the Competition Manual, that it comes from.
01
18in
Start cube
Competition Manual TU04 · R102
02
104mm
Mecanum wheels
RobotConstants.java · Drive.WHEEL_DIAMETER_IN
03
±170°
Turret travel
RobotConstants.java · Turret.MIN/MAX_ANGLE_RAD
04
4in
Flywheel
RobotConstants.java · Shoot.FLYWHEEL_DIAMETER_IN
05
40°
Fixed hood
RobotConstants.java · Shoot.LAUNCH_PITCH_DEG
06
5,000RPM
Flywheel max
RobotConstants.java · Shoot.MAX_FLYWHEEL_RPM
- Flywheel
- 2,590RPM
- Flight time
- 0.45s
- Hood
- 40°FIXED
- Iterations
- 2
| t s | 0.1 | 0.2 | 0.3 | 0.4 | 0.45 |
|---|---|---|---|---|---|
| x in | 20.8 | 41.6 | 62.3 | 83.1 | 94.0 |
| z in | 29.5 | 41.1 | 48.9 | 52.8 | 53.4 |
From 94 in away the CELL sits at the top of the arc, so the ball arrives level. That makes 2,590 RPM the least flywheel speed that reaches this CELL through the fixed 40° hood — closer or farther, the solver asks for more.
SIDE VIEW · TRUE SCALE · GRID 12 in · TICKS 0.1 s
The whole machine on one sheet. Weight stays pending until the robot has been built and weighed.
- Codename
- APEX-R1
- Season
- BIOBUZZ™ presented by RTX, 2026–27
- Starting size
- 18 × 18 × 18 inCompetition Manual TU04 · R102
- Expansion limit
- 18 × 24 × 29 inCompetition Manual TU04 · R105
- Drivetrain
- Mecanum, 4 × 104 mmRobotConstants.java · Drive
- Localisation
- goBILDA Pinpoint odometryRobotConstants.java · Odo
- Turret
- ±170° at 5 : 1RobotConstants.java · Turret
- Shooter
- 4 in flywheel, fixed 40° hood, 5000 RPM maxRobotConstants.java · Shoot
- Vision
- Webcam on the HIVE AprilTag Cluster; optional Limelight 3ARobotConstants.java · Camera
- Control system
- REV Control Hub + Expansion Hub
- Software
- Java · FTC SDK v12.0 · Pedro Pathing
- Weight
- PENDING — weigh after first build
- Status
- In development
[ 11 / PHOTOS ]
Build photos.
APEX-R1 is being built this season. Photos go up here as it comes together — until then, the 3D model above is drawn from the team's code.
Robot photos pending — first build season