Skip to content
Apex Robotics

[ 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
Free speed, from the motor and the wheel

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
Pod offsets, top view
84168X PODY POD+X+Y18 IN · MM

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
Names the code asks the hubs for
  • “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
Hue windows of the colour sorter
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
Holding a world bearing
HIVE
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
Flywheel speed per ball · 96 in shot

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
Webcam 1's field of view
FWDWEBCAM 1 · FIXED TO THE CHASSIS

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
Wiring after the 2026-10-11 rewire

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

96in

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.

Open the Robot LabThe model on its own bench · orbit, explode, change the look

[ 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

Side view, drawn to scale: a POLLEN ball leaves the 14 inch muzzle through the fixed 40° hood toward a CELL 94 inches away and 53.4 inches up. The solver's answer: 2,590 RPM, a 0.45 second flight, 2 iterations. The apex is 53.4 inches up, 0.45 seconds after launch. Tick marks along the arc are 0.1 seconds apart.
[ SHOT · POLLEN ]Solver · Ballistics.java
Flywheel
2,590RPM
Flight time
0.45s
Hood
40°FIXED
Iterations
2
Flight log · every 0.1 s
t s0.10.20.30.40.45
x in20.841.662.383.194.0
z in29.541.148.952.853.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

[ FULL SPEC SHEET ]

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.

Frame 01
Frame 02
Frame 03
Frame 04

Robot photos pending — first build season