I’ve been working at the software problem on-and-off for almost 3 years at this point. We have fairly solid hardware at this point. But the controls are very difficult due to the complicated relationship between steering and driving, and I don’t think it is for the reasons most people expect. Here are just a couple examples of challenges that I’ve seen.
(1)
Imagine you have a module that is totally stopped, and you want to make it go full speed forwards and turn slowly to the right. This is something that happens a lot during normal driving.
You do the math to convert from steering and wheel speed to motor speeds, and get 6000RPM for Motor A and 4000RPM for Motor B.
You then pass these speeds on to a velocity controller for each motor. The controller decides to send 100% power to Motor A because the error is large, and… 100% power to Motor B because the error is also large enough to saturate the output.
Both motors accelerate at about the same speed until finally Motor B is fast enough to not saturate the controller. During this time, you have no control over steering.
(2)
Say you want to command the robot to drive full speed ahead while spinning. With a standard swerve, you can’t quite do this. Some of your wheel speed needs to go towards spinning the robot, so you won’t be going forwards at full speed. Fortunately, this issue can be painted over without doing anything too complex.
On a diff swerve, there is an extra issue. Driving while spinning requires your modules to constantly be steering. And steering takes away additional speed/torque from the wheel.
This is especially concerning at the start of the maneuver, when some modules might be pointing in the right direction and others in a totally wrong direction, meaning they need to steer at different rates and therefore have the wheels also accelerate differently.
I’ve observed this causing erratic behavior when try to go from stopped straight into a fast drive+spin, and be stuck driving out of control for 5+ seconds until either all the modules get lined up well enough to regain control or the driver lets go of the sticks.