Vector-based swerve drive representation

A while ago (before the days of WPILib swerve and paths) I wrote a post on how we, at 1014, implemented our swerve drive. It’s got some differences from the current approaches here and might help answer a few questions posted here by taking another perspective.

Here’s a link to the post and here’s our code from that year. Hopefully someone finds it interesting.