This is a cool project, good work! I have seen this idea before over the years and people usually have issues with the consistency and accuracy because they don’t add in a closed-loop control component.
1st Order Control
Essentially you want a controller that will make a robot follow a motion trajectory instead of just a set point. You can record the motor velocity and position and then use a controller that (probably) looks this:
cmd_velocity(t) = replay_velocity(t) + Kp * ( replay_position(t) - curr_position(t) )
where Kp is a tunable gain. The velocity would be a feedforward component, and the position is closed loop control.
2nd Order Control - Weird Boring Theory
If you can command raw voltage to motors, you could probably up this to a second-order model and also control acceleration (sorta). Similar to the first model, you would have a feed forward acceleration and the closed-loop feedback on the velocity and position terms.
robot_acceleration(t) = replay_acceleration(t) + Kd * ( replay_velocity(t) - current_velocity(t) ) + Kp * ( replay_position(t) - current_position(t) )
This is loosely based on Inverse Dynamics Control, specifically equation 46. There they use acceleration values and then push it through an inverse dynamic model of the robot to get the desired force/torque to apply to actuators,. That is almost definitely out of scope for high-school vex though.
I feel like you might be able to replace that acceleration term with the commanded motor voltage from a user run that you want to replay and it would output a motor voltage instead. It feels like the commanded motor voltage should be somewhat proportional to the robot acceleration. It is certainly more complicated than that, but would probably still see substantial performance improvements over just replaying user input alone.
2nd Order Control - Easy equation to copy-paste, very nice!
Record the analog motor voltages, velocity, and position of your robot over time as you drive it. Then, a robot controller might look like something like this:
robot_voltage(t) = replay_voltage(t) + Kd * ( replay_velocity(t) - current_velocity(t) ) + Kp * ( replay_position(t) - current_position(t) )
The velocity and position terms will probably be much smaller than the recorded voltages, but that little bit of closed-loop control could yield substantial improvements in performance and consistency. You could apply these models to any actuated subcomponent of your robot (both sides of drive train, lift).
It is early and I have procrastinated my real job writing this, so take it with a grain of salt, but it seems legitimate on the surface.