Selected work

Robotics · FRC 2023

Jerome

A 2023 FRC robot with a two-link inverse-kinematics arm, swerve drive, autonomous scoring, and auto-balance. Jerome was built to place cones and cubes at several scoring heights for the 2023 FRC game, ChargedUp.

Measured highlights

Ranked 54th of 3,700+ teams worldwide
Statbotics result after world championship
0.67s placement time
improved from 1.5s in offseason
4th in Curie Division
at the FIRST World Championship

Context

The 2023 game scored robots on how quickly and accurately they could place two different game pieces at several different heights, so the arm needed a reliable way to hit each position with confidence, not just get close.

Jerome is a swerve-drive competition robot with a two-link arm that uses inverse kinematics to place cones and cubes at several scoring heights. It also runs autonomous scoring routines and balances on the charging station using gyro feedback.

The software work

  1. Arm kinematics

    ArmCalculations.java used inverse kinematics to convert requested scoring positions into joint angles for Jerome's two-link arm.

  2. Autonomous scoring

    Autonomous routines built on the same arm calculations handled cube and cone placement, with PID tuned so simulated arm behavior stayed close to the physical mechanism.

  3. Drive and balance

    Jerome used field-centric swerve drive, gyro-based auto-balance, and early swerve discretization work that became the basis for the implementation used on Terry.

Jerome with its two-link arm raised
3D loads as this section approachesDrag to inspect
Jerome's exported CAD assembly. Drag to inspect on desktop.

My role

Responsibility
Software Lead
Team
Software team of about 10
Tools
Java · WPILib · Arm Kinematics · Autonomy · Swerve Discretization

I was lead programmer and head of operations and organization for a team of about 10. I wrote the arm's inverse-kinematics calculations, tuned the PID until the simulator closely matched the physical arm, and worked on the autonomous routines built around that arm. This was also the season where I started the discretized-swerve-kinematics work that was fully implemented on Terry the following year and eventually became part of WPILib's official ChassisSpeeds implementation.

Process & decisions

Make the first placement fast without giving up repeatability.

The arm could reach several scoring positions, but autonomous placement depended on more than reaching the right endpoint. The inverse-kinematics calculations, PID control, and autonomous timing all had to agree well enough for the arm to move quickly and repeat the same placement on the field.

Calculate the arm targets
I wrote the inverse-kinematics calculations in ArmCalculations.java so autonomous routines could derive joint targets from the requested arm position.
Match simulation to the real arm
I tuned the PID until the simulated mechanism tracked the physical arm closely enough to make autonomous testing useful before running the same routines on the robot.
Optimize the autonomous sequence
I built the placement routine around the arm's fastest repeatable motion rather than treating the arm calculations and autonomous timing as separate problems.

Outcome

In one match, Jerome, 1678, 4414, and 254 all began placing their first autonomous game piece at the same time. Jerome completed the placement first. That result reflects the speed of one autonomous placement, not the final score or outcome of the match.

Before
Arm motion and autonomous timing tuned together
After
First placement completed ahead of 1678, 4414, and 254