Driving Style

Hello Everybody,

Over the weekend, we competed at the STEMly Cup Championship. I was driver for this event and was using Tank controls. While i was driving, i felt like i was driving all over the place and was not in control. My question is what type of driving controls do your team use and enjoy using? I was think of trying out Arcade for next season.

We started out with tank drive, but quickly switched over to arcade. Tank is, as you found, pretty difficult to control. Arcade for us worked a lot better, and there are many different ways to set it up to suit your personal preferences.

We use a drive setup I call “rocket cheese.” It’s cheezy-drive style arcade (arcade where the turning stick is scaled by some polynomial function of the forwards stick), except we use the triggers for the forwards stick. This makes it really easy for the drivers to hold a constant speed or a constant angle, and using triggers makes it overdetermined, giving the driver more options and control. It’s called rocket cheese because the scaling comes from cheezy drive and the trigger combining comes from Rocket League.

Our team (4935) has been using tank drive for three of our four years, choosing not to use it in 2015.

If you feel as if you are driving all over the place or are not in control, you may be moving the joysticks too much. Our driver(s) prefer to hold the joystick close to its base, making small adjustments. A hard part of tank drive is learning to efficiently make turns, which takes practice.

The best advice, however, is to practice and experiment with multiple different types of controls to see what you prefer best.

Arcade drive seems more intuitive for a lot of new drivers. However, experienced drivers appreciate the finite control afforded by tank drive.
My suggestion would to be to hold the sticks at the base, instead of on the handles. This will give you much more precise control.
As always, practice makes perfect.

(sniped above)

I’ve found that, in general, arcade drive with the turning axis and forward reverse axis separated is the drivetrain most drivers pick up the most quickly. It’s important to use two joysticks for this instead of putting both functions on one, as it allows for more movement control that way.

I’ve had some success actually replacing the throttle joystick with the triggers on a gamepad (one forward, one reverse) as well, but it’s whatever the driver does best with.

Two stick arcade offers no less control than tank drive - there are no movements that are impossible to replicate on arcade drive that tank drive can do. It is simply faster for a driver to think about what they want the robot to do and then move the joysticks to match that intention, rather than trying to derive in their head which way each motor should spin and how much in order to recreate the desired robot action.

Caveat here - tank style controls start to be REALLY finicky at high speeds or long moves where the small differences in stick values add up to missing your target without a lot of manual adjustment.

While changing control schemes may make the robot easier to control, the number one thing that will make you better at driving is practice. If you practice constantly, and get to know how your robot behaves to inputs, then the control scheme will start to matter less and less.

We have used arcade the last couple years, but it depends some on whoever the driver is. I use left handed arcade controls even though im right handed. Its just how I was basically trained by the previous driver. When I drive with tank or normal arcade, I feel like I can barely drive like the OP’s driving. Practice makes perfect. Find a style that works for you and practice, practice practice!

My team has always used tank drive, with an important change which I think brings it all together.

On each joystick, the controller outputs a number from -1 to 1. The simplest implementation is to simply feed that value directly into the motor controller, i.e. input of 0.5 from the controller -> output of 0.5 to the motor controller.

However, it is important to note that the difference between 10 and 20 percent throttle is significant, while the difference between 80 and 90 percent throttle is comparatively negligible. A good way to account for this is by squaring the input from the motor controller (while retaining the sign, of course). This yields finer control on the low-end and coarser control on the high end. For example, a controller input of 0.7 will result in a motor output of 49% throttle.

My team used this squared-inputs system last year, and was very successful. Having the two-sided control offered by tank drive coupled with the fine movement enabled by the squared inputs allowed for precise gear-placing and overall movement.

Of course both systems work if you implement them right, but squared-input tank drive has worked really well for us.

This. It is very difficult to get the fine tuning movement when using joysticks, especially those on gaming controllers. I HIGHLY recommend holding the joysticks very low and resting the pinky side of your hand on the joystick stand. These two things alone will give you significantly more control.

Besides this past year with swerve, 103 has used standard tank for the most part with a few exceptions.

We used this style of joysticks way beyond when most teams did because they were easier to move very gradually. The current joysticks often have too much resistance to get really fine tuning which makes regular tank drive very difficult.

We have not programmatically altered the driving setup with exception of 2009 where we implemented a non-slip ramp up, but if we go back to tank we very well may consider something like cheezy drive.

We use the exact same control scheme and we came up with it the same way totally independently.

I’ve found success with two separate joysticks for the forward/backwards and steering axes, with the throttle axis squared and the steering input cubed. It really allowed some very precise control when needed. I’ll echo the argument that there isn’t any maneuver that can be accomplished with tank control that can’t be done with split arcade. In the rare scenario when you may want to move only one side of your drive, it can be done by supplying a diagonal input with a little forethought, and imo is a very worthwhile tradeoff for not having to consider left and right motor values for any given steering arc.

Awesome to see another team coming up with the same idea (you guys were probably first, we only started using it this offseason), I think it might catch on!

Also, forgot to mention that we use this really sweet gamepad with concave sticks and no physical deadband whatsoever: https://www.amazon.com/Thrustmaster-Controller-Official-Xbox-360-6306200/dp/B008JABA5C

Our drivers love it and it’s worked great for us so far, no damage whatsoever from a few days of driver practice and 2 offseason competitions.

I always called this GTA drive because that’s the most popular game that used trigger inputs the first year one of my teams implemented it.

(The squaring / cubing the steering input isn’t exclusive to Cheesy Drive or something they “invented”, per se; but a lot of other Cheesy Drive principles could be applied to this sort of control scheme)

IMO especially if your robot has functionality on two sides this control scheme is the “best”.

We did driver trials sometime in late January of this year.

Kids started out using whatever their preference was (tank with sticks, arcade with a stick, or split arcade with a controller). For every student who picked either stick solution, we asked them to try split arcade with the controller. We tried about a dozen kids, and every single one did better with the split arcade.

We tried all kinds of polynomial functions, ‘nudge’ buttons, ‘drive straight’, etc. The best results came from split arcade with geometrically scaling the turn input based upon whether the stick was >50% from center, and also creating a “snail speed” mode which cut the power output to 70%.

We tried the GTA style of driving, and both of our drivers hated it. Yet this year’s robot drove forward for 99% of a match, which meant that a driver never had to do precision alignment in reverse (our climb was forgiving). If we ever pick from one side and place with the other, that may change.

It’s not that we square/cube our steering input (though we do do that - actually, we allow arbitrary polynomial scaling for all throttles through our config file) - we multiply the steering input by some function of the magnitude forward throttle (currently, we’re using .2 + .6*sqrt(fwd), though it’s up to driver preference). This is a generalization of the Cheezy Drive concept of “multiply the rotation by the forward throttle.”

Since all of this is determined in config, not code, it’s really easy for our drivers to play around with completely different control schemes and see what they like.

same here! is there any code i can take a look at, because i’m going to be diving into that this year, along with CAN

Here are our example styles.

Here is what we finally settled on.

Note that WPILib squares your arguments to arcadeDrive and tankDrive by default (in 2017, at least.) So if you manually squared your inputs, you would actually have a 4th-degree curve in your output.

This is also super annoying if you’re trying to use arcadeDrive as the output of a turn-to-angle loop and haven’t memorized the documentation.