Sally & Cruz · Push Back Gamma Robots
KUdos VEX-U's higher-ceiling 24" and 15" Gamma redesign for Push Back.

Overview
Sally and Cruz were my sixth set of VEX-U robots and KUdos VEX-U's intended Worlds robots for the 2025-2026 Push Back season. Sally was the blue 24" robot and Cruz was the yellow 15" robot, sharing one core design; their names and colors continued the season's Cars theme.
They were a ground-up redesign built after Luigi and Guido hit the practical ceiling of their Skills-focused tank architecture. Where Luigi and Guido were proven but limited, Sally and Cruz were designed around a holonomic H-drive, under-Goal clearance, faster acceleration, a wider low-compression Block path, and an integrated wing, giving a much higher competitive ceiling. The robots were fully built, but a compressed four-week schedule left too little time to tune them, so we competed at Worlds with the proven Luigi and Guido instead (see Worlds Readiness Decision below).
My Role
Team Captain · Lead Designer & Fabricator. I led Sally and Cruz end to end: strategy, mechanical design, CAD, manufacturing, assembly, wiring, and autonomous programming.
- Set the Gamma strategy and architecture from three tournament post-mortems, and defined the requirements and weight targets
- Created the master sketches and modeled every subsystem in Onshape (drivetrain, strafe pod, intake, indexer, outtake, wing, Multi-Tool, aligners, odometry, electronics, pneumatics)
- Designed the 12-motor H-drive and iterated the rocker strafe pod through multiple gearing iterations
- Designed all custom parts for CNC routing, laser cutting, and 3D printing, and produced the manufacturing and buy sheets
- Led mechanical assembly, integration, wiring, and pneumatic plumbing on both robots
- Integrated the custom Pinpoint, Raspberry Pi, and encoder localization stack
- Personally programmed the Skills and match autonomous routines
Outcome
Sally and Cruz were fully designed, manufactured, assembled, wired, and mechanically completed, and every major system functioned to some degree. They demonstrated a substantially higher capability ceiling than Luigi and Guido, but the schedule did not allow enough integration and tuning to reach it reliably.
Choosing Luigi and Guido for Worlds did not reject the Gamma architecture; it recognized that a higher-potential robot still needs enough development time to become dependable. With more time, the autonomous routines, H-drive tuning, driver practice, and mechanical scoring tuning would have raised Sally and Cruz to the level they were designed for. The build became a clear lesson in the difference between mechanical completion and full-system readiness.
| Feature | Spec |
|---|---|
| Robot classes | 24" (Sally) and 15" (Cruz), shared clone design |
| Drivetrain | 12-motor H-drive (10 forward/back, 2 strafe) |
| Drive speed | ~5.8 ft/s forward/back · ~1.9 ft/s strafe (480 rpm / 160 rpm on 2.75" wheels) |
| Height | ~12" under-Goal · ~16.5" Long Goal scoring |
| Weight target | Under 20 lb (goal: under 15 lb) |
| Block capacity | 7 Blocks, target 10 (two-wide path) |
| Scoring | Long and top Center Goal (outtake); low Center Goal (reversed intake) |
| Localization | goBILDA Pinpoint, custom magnetic encoders, Raspberry Pi Zero 2 W |
| Build window | 4 weeks; physically built 2 weeks before Worlds |
| Status | Fully built; not competition-tuned before Worlds |
Problem & Goal
Luigi and Guido still performed well, but continued iteration could not remove the fundamental limits of their architecture:
- Tank drive restricted lateral movement and field positioning
- Limited acceleration made them easy to defend and pin
- They could not drive underneath the Long Goal
- Double parking was difficult and approach-sensitive
- Block compression caused recurring indexer and outtake jams
- Wings were designed after the rest of the robot and not planned into the architecture from the ground up
- Several systems were optimized for Robot Skills, not Worlds match play
The goal of Sally and Cruz was not to patch these one by one but to design a pair of robots with a substantially higher competitive ceiling, built around holonomic movement and Worlds match play from the start.
Design Requirements
- Fit the VEX-U 24" and 15" size limits with one shared clone design
- H-drive with 10 motors forward/back and 2 for strafe, moving laterally without rotating
- Accelerate faster than Luigi and Guido and drive beneath the Long Goal
- Front-to-back, two-wide Block path carrying at least 7 Blocks (target 10) with less compression
- Sort Blocks by color and reject before scoring
- Score the Long Goal and top Center Goal from the outtake, and the low Center Goal by reversing the intake
- Wing designed into the core architecture, supporting hover and descore
- Repeatable Match Loader interaction, reliable double parking, and earning the Autonomous Win Point
- Retain the custom Pinpoint and Raspberry Pi localization stack with linear, spring-loaded odometry pods
- Stay under ~20 lb, ideally under 15 lb, and remain repairable
Process
- 01Reviewed the Illini, Gear Slingers, and CBU tournament post-mortems and set the redesign priorities
- 02Compared tank, H-drive, X-drive, and swerve; chose an H-drive for lateral movement with relatively simple construction
- 03Selected a shared clone architecture for the 24" and 15" robots
- 04Built the master sketches and Block CAD in Onshape and packaged every subsystem
- 05Designed the 10-motor drivetrain, 2-motor rocker strafe pod, two-wide indexer, and lower-Goal funnel
- 06Selected a simple pivoting outtake over a four-bar and designed the three wing states
- 07Designed the rotating polycarbonate Match Loader Multi-Tool and linear spring-loaded odometry pods
- 08Completed the manufacturing, inventory, and buy sheets
- 09CNC routed, laser cut, and 3D printed the custom parts and built both robots
- 10Found the first strafe pod would not deploy; reworked its gearing and dropped the ratio from 480 to 160 rpm for torque
- 11Wired, labeled, and plumbed the drivetrain, mechanisms, sensors, and pneumatics
- 12Integrated the Pinpoint, Raspberry Pi, custom encoders, and odometry pods
- 13Mechanically completed both robots two weeks before Worlds and began autonomous programming
- 14Brought all four robots to St. Louis and continued debugging, tuning, and driver practice
- 15Determined two days out that Sally and Cruz needed more time, and competed with Luigi and Guido
Challenges
- Reworking the rocker strafe pod after its first gear arrangement produced no usable deployment force, then trading top speed for torque (480 to 160 rpm) to make lateral movement work at all
- Packaging a 12-motor H-drive, a two-wide Block path, pneumatics, and the full custom electronics stack into a frame short enough to drive under the Long Goal
- Getting a holonomic H-drive's three-axis motion to localize and drive reliably in autonomous, which needs far more tuning than a tank drive
- Fitting fabrication, wiring, integration, programming, and tuning of two highly custom robots into a four-week window
Robot Subsystems
Sally and Cruz shared one core subsystem architecture. While one was labeled 24" and the 15", both fit in a 15" cubed package as they were identical clones.
12-Motor H-Drive
Each robot used 12 drivetrain motors on 2.75" omni wheels: 10 for forward and backward movement, geared from 600 rpm cartridges down to 480 rpm, and 2 for lateral strafing. The 10-motor forward/back drive ran a slightly lower wheel speed than Luigi and Guido, but the extra motors and lower rpm gave faster acceleration, which matters more in match play than top speed because the robot reaches useful speed and changes direction sooner.
Holonomic movement let the robots strafe to align with Goals and Match Loaders, reposition under the Long Goal, escape defensive pressure, and adjust wing position, all while holding orientation. Keeping orientation fixed also meant a single wing could cover one side instead of requiring two sets of mirrored wings.
The drivetrain used a 1/4" aluminum bellypan and packaged its motors around short 0.875" shafts, with 1/8" outer polycarbonate bearing plates doubling as finished exterior plates. The drivetrain gears themselves were pushed to the outside of the frame specifically to keep the chassis thin enough for the 2-wide indexer running down the center.
Rocker Strafe Pod
A standard H-drive pod keeps its wheels in constant contact with the field, which usually makes for a smaller, simpler package but leaves the strafe wheels with little traction, a real problem for holonomic movement since lateral grip is what makes it work at all. We built a rocker pod instead: the strafe wheels, 2.75" omnis like the rest of the drivetrain, sat in a pod that stayed above the field when inactive and dropped down when the strafe motors applied torque. Staying lifted while inactive also bought ground clearance a fixed-contact pod couldn't give up, which the robots needed to double park. The pod rotated on what we called a "zombie axle": live, since it transmits wheel power through its own shaft and gears, but also effectively dead, since the pod itself pivots freely on that shaft through bearings.
The first version ran 2 motors on 600 rpm cartridges geared to 480 rpm, matching the forward/back drive. It did not deploy: its gear arrangement produced an ineffective reaction force, and forcing the wheels down just damaged the tiles instead of moving the robot. I added an idler stage to reverse the wheel direction relative to the motors, which flipped the torque reaction and rotated the pod down into the field. Even with that fix, the 480 rpm motors strafed with torque but heated up fast, and were not sustaining the full 480 rpm under load, both a reliability concern. I swapped in 200 rpm cartridges geared down to about 160 rpm; the slower ratio strafed reliably without the heat issue, though it still needed tuning.
When deployed, the strafe wheels dropped about 1/4" below the field surface, digging slightly into the foam tiles for the traction lateral movement needs. That deployment also did double duty for traction: rotating the pod down lifted the robot slightly, shifting its weight off the forward/back drive wheels and onto the strafe wheels, while the same rotation dug those wheels into the tiles for more surface contact. Between the added weight and the deeper bite into the foam, the strafe wheels got the grip they needed to move the robot laterally.
Lightweight Frame & Packaging
The robots had to stay short enough to drive beneath the Long Goal while packaging 12 motors, a two-wide Block path, pneumatics, electronics, and odometry.
Weight came out through pocketed aluminum plates, polycarbonate structure and mechanisms, thin sheet where possible, shared plates between subsystems, and compact packaging. Pocketing the bellypan alone cut it from 2.01 to 1.16 lbs.
The bellypan's parking ramps did double duty: on the intake side they funneled Blocks into the intake and helped guide the robot into the Park Zone, and every ramp had free-spinning wall-rider disks built in, so the robot could glide along a wall it drove into during autonomous instead of catching and getting stuck on it. A separate extension piece mounted to the bottom of the bellypan acted as a parking hardstop, physically limiting how far the robot could drive into the Park Zone, which made it significantly easier for both robots to double park instead of one taking up the entire zone.
The robot stood about 12" tall in its under-Goal configuration and rose to about 16.5" when the outtake tilted up to score the Long Goal. The low frame opened movement and strategy options Luigi and Guido never had, at the cost of tighter packaging. Because of this tighter packaging, each subsystem was designed for easier service in case a mechanism or component were to fail, with blocking subsystems or components designed to be easily attached within 30 seconds.
Long Goal Aligner & Electronics Protection
A Long Goal aligner was built directly into the bellypan rather than as a separate deployable mechanism. It sat low because the Long Goal's base is wider at the bottom than the top, and a 3D-printed extension increased its contact with the base. It only had to correct misalignments under about 1/2"; the H-drive could strafe to fix anything larger.
The same print did double duty: it mounted the pneumatic reservoir tank and shrouded the Raspberry Pi, its battery pack, and the goBILDA Pinpoint. That protection was a direct response to Luigi and Guido, where the exposed Raspberry Pi was damaged during competition.
Front-to-Back Intake
The intake collected Blocks from the floor and fed the two-wide indexer, driven by 2 motors at 600 rpm turning 2" flex wheels, mounted directly above the intake rollers. It handled Match Loader collection, Park Zone pickup, and Center Goal rushes.
Fully built, the intake was too long to fit inside the 15" starting size, so it pivoted all the way up until it touched the indexer, and the Multi-Tool's polycarbonate flap held it there in the starting configuration. At the start of autonomous, deploying the Multi-Tool dropped the intake down so it could begin picking up Blocks.
Placing the intake opposite the outtake let the robot collect Match Loaded Blocks and drive straight to a Long Goal without turning around. The intake also handled low Center Goal scoring: reversing it pushed Blocks back out the front and into the Goal.
The intake motors were originally meant to sit behind the indexer, driving the rollers through a long chain run so their weight stayed centralized. That packaged badly, so the motors ended up mounted directly above the intake rollers instead, driving them with a short, simple transmission.
Two-Wide Indexer, Color Sorting & Lower Goal Funnel
The two-wide indexer, inspired by Ruiguan's Block path, was designed to cut Block compression while carrying at least 7 Blocks (target 10) and supporting faster autonomous cycles. It ran on 2 motors at 600 rpm through 4 sets of 2" rubber-band rollers. The bottom set of rollers rode on a rubber-banded pivot, letting it give slightly to absorb compression instead of jamming against a fixed set. An optical sensor read Block color before scoring so an unwanted Block could be rejected rather than scored.
A lower Center Goal funnel was built into the indexer: when the intake reversed for low-Goal scoring, the funnel narrowed the two-wide path to a single-file outlet so the intake could eject Blocks cleanly. A single 3/8" bore, 2" stroke pneumatic cylinder drove the funnel between its two states, with slots to keep it centered: retracted, it funneled Blocks to single file for low-Goal scoring; extended, it opened back up for normal two-wide intaking. The indexer, sorting, and funnel were mechanically functional but needed more software integration and Block testing.
Pivoting Outtake
The outtake scored the Long Goal and top Center Goal, driven by a single motor at 600 rpm running a 2" rubber-band roller and 2" flex wheels directly, and tilted by 2 pneumatic cylinders (3/8" bore, 1" stroke). A simple pivot was chosen over a four-bar because it was mechanically simpler, kept Block compression more consistent, used fewer moving parts, packaged more easily under the Long Goal, and opened an extra scoring path when raised.
The outtake aligned differently for each Goal: Long Goal alignment came from the bellypan-integrated aligner described above, while Center Goal alignment came from angled ramps built onto the end of the outtake itself.
A flap at the outtake's mouth served two purposes: it kept Blocks from being pushed back out of the robot while intaking, and it acted as a roof so scored Blocks stayed in the Goal instead of flying out the top. Its flap sat tucked inside the outtake plates, so three positions were driven by two stacked 3/8" bore pneumatic cylinders: both retracted gave the stowed position, extending only the short cylinder gave the Long Goal position, and extending both gave the Center Goal position. The short cylinder was designed for a 0.5" stroke; the long cylinder was designed for a 0.75" stroke, but the part we wanted had a 4-6 week lead time, so we substituted a 1" stroke cylinder with a spacer limiting it to an effective 0.75", which incidentally left more surrounding material at the slot the flap rides in. Luigi and Guido had gotten the same three positions from a ziptie, but there was no good place for one on the Gamma flap. Low Center Goal scoring did not use the outtake at all; that was the reversed intake through the indexer funnel.
Wing
The wing was part of the original architecture rather than a late addition, which improved its mounting, packaging, deployment geometry, and structure. It used two separate 3/8" bore pneumatic cylinders to reach three states: a 0.5" stroke cylinder lifted it from stowed (below the Long Goal clearance limit) up out of the way, and a 1" stroke cylinder actuated it between hover (extended above the Long Goal) and descore (positioned inside the Long Goal to remove Blocks). It functioned but still needed driver practice.
Luigi and Guido's wing and pivot had broken during the season, so the Gamma wing was built to avoid that outright: dead-axle construction throughout, 1/8" aluminum plates, and 3D-printed sandwich spacers, versus Luigi and Guido's 1/16" polycarbonate and 3D-printed parts. It also deployed differently. Luigi and Guido's wing was a one-time deploy that stayed extended for the rest of the match; the Gamma wing folded back to fully stowed after every hover or descore cycle, so nothing stuck out of the starting size unless the wing was actively in use.
It shipped without a static aligner. I had wanted a shorter wing with a fixed aligner; the driver preferred a longer wing with none, arguing the H-drive's strafe would make lineup easy enough, and we went with the driver's call. In hindsight a short wing with no aligner would have been better: the H-drive never delivered the fully holonomic, swerve-like control that decision assumed due to the speed reduction of the rocker, and in practice the strafe was used mostly to escape pressure and make small corrections, not to drive holonomically. Running Luigi and Guido at Worlds also drove home how much a dedicated alignment aid actually matters in real matches.
Match Loader Multi-Tool
A polycarbonate plate rotated freely on a shaft, with a V-shaped front cutout to guide it into the Match Loader. The V let the plate enter a fully loaded Match Loader even when its Blocks sat at odd angles; without it, the plate would sometimes fail to go in at all. The plate was also made wider than it needed to be, giving extra side-to-side margin for alignment error. A single 3/8" bore, 2" stroke pneumatic cylinder deployed the plate out toward the Loader; once it entered horizontally, contact with the Loader rotated it passively into an angled ramp that let the Match Loaded Blocks fall straight toward the intake. That passive rotation cut the number of powered actions needed and let one piece adapt to the Loader geometry.
The first built version did not reach deep enough into the Match Loader and interfered with the intake as it pivoted, so I reworked its geometry. The revised design fixed both problems and worked well in testing.
Linear Odometry Pods
The Gamma odometry pods moved straight up and down instead of pivoting: each slid on rounded shafts through bushings, spring-loaded downward against the field, with a custom magnetic encoder feeding the goBILDA Pinpoint. The linear motion cut the swept volume a pivoting pod needs and kept a direct vertical force into the field. Each pod used a single 2" wheel, a direct lesson from Luigi and Guido, where a single wheel per pod had proven more accurate for the Pinpoint than the old double-wide setup.
The pods were meant to lift pneumatically before parking, but that was never built, and the cylinder was never finalized past a rough guess of a 3/8" bore, 1.5" stroke. The planned mechanism was a bicycle-brake-cable concept: a string routed through fixed pneumatic tubing, pulled by one cylinder to raise both pods about 1.25" at once. As built, the pods stayed spring-loaded down, riding about 1/4" into the tiles for consistent tracking.
The linear slides themselves fought us with sliding friction. Running the pods on bushings was the starting point; removing the bushings entirely helped slightly, and white lithium grease helped a bit more, but neither matched how smoothly Luigi and Guido's pivoting 4-bar pods moved. The fix for next time is to stop building the slide and use a real linear rail, like an MGN carriage, so sliding friction isn't something we have to fight at all.
Pneumatic System
The pneumatic layout drove the wing lift and actuation, the indexer lower-Goal funnel, the outtake lift and flap states, and the Multi-Tool. It also reserved a line for the odometry-pod lift described above, which was never plumbed.
Manufacturing & Fabrication
Sally and Cruz were highly custom robots manufactured in a compressed window across March and April 2026.
The structural side plates for the intake, indexer, wing, and H-drive were laser-cut from 1/8" 6061 aluminum, donated and cut externally, a significant time and cost saving during a tight build schedule. Larger and 1/4" aluminum parts were cut on the team's CNC router and through outside fabrication shops.
3D-printed components used a standardized 4-wall, 20% gyroid-infill print setting, and every custom part was tracked under the team's KUDOS-2025A-P-### part-numbering scheme for manufacturing, inventory, and the engineering notebook.
Custom Electronics & Localization
Sally and Cruz reused the custom electronics stack from Luigi and Guido, minus the Limelight:
- goBILDA Pinpoint odometry computer
- Custom magnetic quadrature encoders on linear spring-loaded tracking-wheel pods
- Raspberry Pi Zero 2 W communication coprocessor with the KUdos Raspberry Pi Expansion Hat
- Optical sensors for Block detection and color sorting
- Wireless hotspot for remote access, bridged to the V5 Brain
The Pinpoint computed position and heading from its integrated IMU and the custom encoders, while the Raspberry Pi bridged the custom sensors to the V5 Brain. No Limelight vision was used on Sally and Cruz; that stayed on Luigi and Guido. The Pi was mounted vertically for port access, and the Pinpoint was isolated from chassis vibration on VHB tape with access holes for removal, the whole cluster tucked behind the aligner-print shroud. Reliable localization mattered more here than on a tank drive, since autonomous had to coordinate forward, lateral, and rotational motion at once.
Driver Controls
The robots used arcade-style drive controls: the left stick handled forward/backward and turning, and the right stick's X axis handled H-drive strafe. Scoring used a tap-to-pre-open, hold-to-score flow: a tap staged the mechanism for either the high or low Goal (clearing the wing, setting the outtake tilt, and opening the flap), and holding then ran the motors to score. The wing had four driver states: deploy, hover, descore, and stow.
The control scheme was still being refined when development stopped. One known bug remained unresolved: moving from the low-Goal outtake position to a wing descore would incorrectly spin the indexer.
Autonomous Development
I personally programmed the Skills and match autonomous routines. The planned routines covered maximum-score Skills routing, Long Goal and Center Goal rushes, the Autonomous Win Point, color-sorted scoring, Park Zone collection, double parking, and wing hover and descore, all on Pinpoint-based forward, lateral, and rotational movement.
The H-drive needed a fundamentally different motion approach than the tank-drive Luigi and Guido: the autonomous system had to control three movement axes while holding field position, which takes far more tuning. The routines were solvable but unfinished when time ran out.
Worlds Readiness Decision
Sally and Cruz were physically complete two weeks before the 2026 VEX Robotics World Championship. Their four-week window had to hold fabrication, assembly, wiring, plumbing, integration, programming, testing, tuning, and driver practice, and finishing the builds halfway through left only two weeks for full-system development.
We brought all four robots to St. Louis and kept working on the Gamma robots there. Two days before Worlds, we judged that Sally and Cruz had not had enough debugging, autonomous development, tuning, and repeatability testing. They had the higher ceiling, but Luigi and Guido had already run three competitions, sat close to their own ceiling, and had understood controls, maintenance, spares, and failure modes.
The call came down to time and competition risk: with a longer runway we would have kept developing the Gamma robots toward their ceiling, but for Worlds we chose the proven robots that were ready.
What I Learned
- How to turn tournament post-mortems into measurable design requirements
- How to recognize when an architecture has hit its practical ceiling and warrants a redesign rather than more iteration
- How added drive motors can raise acceleration even at a lower wheel speed, and why speed-matching a mechanism does not guarantee it has the torque to work
- How gear direction and torque reaction make or break a rocker strafe pod
- How holonomic movement buys strategic capability at the cost of much harder autonomous software
- How a clone architecture cuts design work but multiplies the manufacturing load
- The difference between mechanical completion and full-system readiness, and how tuning and integration time gate whether a robot reaches its ceiling
- When to choose a proven robot near its ceiling over a higher-potential robot far below its own
