Holonomic + gyro/PID

I’ve been doing some research on holonomic drivetrains, and understand the physics behind it. I’m assuming that, of course, error will begin to mount up, which requires some additional programming to overcome.

I’ve heard people say they use a gyro and a PID loop, but I’m confused as to how the gyro is implemented. And, even if the gyro is used to control the angle, how can you control the velocity? Doesn’t the gyro itself rack up some error over time?

I’d appreciate any advice and any good links. Thanks!

Usually, when a gyro is implemented, it is used for “field-centric” control. The robot is moved relative to the field, whatever direction it might be facing. This is usually implemented by converting the X/Y inputs from the joystick into a polar coordinate (magnitude and direction), and then add the gyro heading to that direction, then convert the polar coordinate into four motor outputs for either the omni wheels or mecanum wheels.

By itself, an omnidirectional drive has no control loop (or controls the speed of its wheels using P/PID and encoders), but there isn’t much error to build up in the drive alone.

Possible sources of gyro error:
IF you boot up while moving, then the gyro accumulator will set the centerpoint to whatever it was when you booted up, and then when you stop moving it will think you are continuously spinning. I do not know if it is possible to set the centerpoint manually.
IF you somehow manage to max out the gyro’s output (since it has a 5v or 0v limit), you will loose all of the data above that point. Which means you will be off.
The gyro does have a little bit of running error, which might or might not be negligible during a 2.5 minute match. I have only ever used it during auto, and the error in 15 seconds is negligible.

If you would like to experiment with new drivetrains (especially field-centric driving), I highly suggest that you prototype during the off-season.

Any more questions? feel free to ask.

The gyro is used in allowing the robot to be controlled reletive to the driver(driver-centric) as opposed to the traditional robot-centric mode.

For example, if you push forward on the stick, the robot will move away from you, pulling it back will bring it closer to you.

A PID loop can be used to control this angle more precisely.

Gyros DO drift over time. This is measured by Degrees/minute. Check your model’s datasheet for the exact rate.

I recommend you have your program “Zero” out the gyro reading at the beginning of autonomous and teleop(given that the angle should the same at the end of auton). In Arizona last year, our robot was left on during an especially long reset period and our autonomous program behaved strangely, almost incurring a penalty.

Perhaps you could use a complementary filter with an accelerometer and gyro. This will make your angle heading more accurate. Google is your friend.

A PID loop is can also be used to control the velocities of each wheel. You must use an encoder on each wheel.

I would use a gyro to make sure that when you want your robot to go straight, that it goes straight and does not turn. Encoders will help you keep your wheels spinning at the same speed which should keep you going straight but if your wheels have different amounts of traction then the gyro can be used to keep the robot going straight. For velocity you can try an accelerometer or just use the encoders, even though it’d be hard to get a good measurement, again because of traction.

I disagree. There is generally not enough slip to make a difference. I would argue that an accelerometer is an almost useless sensor for FRC robots, since we have access to encoders, which measure much more precisely than accelerometers.

I would actually argue that it is easier for a driver to drive the robot directly (robot-centric) than field-centricly, since 1. it is easier to drive, and 2. once you get used to driving, it is very nice to have direct control of where you want your robot go go.

Just because you have a holonomic drive, that does not mean it must use a gyro and be field-centric.

Could you please explain what error you are referring to, which will begin to mount up ?


I believe he may be referring to the error in all sensors which may deviate from the actual, true reality, like a gyro reading +/- .01 degrees per second turn when it’s in fact stopped. It’s the nearly unavoidable stuff in cheap electronic parts.

Thank you, that’s one possible interpretation… but I’d like to hear from the OP if that’s what he meant… or if he had something else in mind.

He doesn’t mention gyro in the first paragraph where he says he understands the physics but is concerned that “error will begin to mount up”.

He mentions gyro in the second paragraph, but says he doesn’t know how it is implemented. So I inferred that he wasn’t referring to gyro error in the first paragraph.


We’ve seen wheelspin when accelerating quickly, and the wheels will slip when the robot gets hit hard. Both of those are relatively common in a match, so the encoders will no longer be at the correct position. This doesn’t mean that encoders are useless sensors, but that they aren’t a magic bullet. A clever algorithm would decide which one is more likely to be right, and use it to correct the other one based on the measured conditions.

Or, you could use follower wheels with encoders on them.

Which work best on flat ground. Not a problem in 2009 when the ground was flat, but I wouldn’t have been willing to put them on our robot this year.

Kris noted the simplest use of a yaw rate sensor and it’s easiest implementation: driving straight. We have used this technique on most of our 'bots, holonomic, treaded & wheeled, since 2004. The algorithm is a simple multiplier on the yaw rate detected. We usually determine it empirically, This is added to the motor outputs to create an automatic, opposite spin to the measured yaw rate. When driving straight, the yaw rate is close to zero, so the effect is nil…easy and powerful. Add in a small deadband around zero yaw rate, if it wants to twitch when still. This also helps, if someone is trying push on a corner of your 'bot. Typically we give the driver a button or switch, to turn the effect on and off. We always want the driver to have the final decision on handling.

We’ve used the gyro for field-centric control, as well. Our results are mixed - a great implementation with our 2004 holonomic 'bot, and a rather disastrous implementation with our swerve drive, last year. Give yourself a lot of time for driver training and robot testing.


What was disastrous about it?


Wow you guys are all really helpful! I think two separate issues are coming up here, mostly due to my ignorance.

  1. Driver-centric vs. Robot-centric: It seems that this issue is not related to the type of drive train. For example, by turning the joystick into a polar coordinate, if I push the joystick to (0.5,pi/4), then I could see using a gyro to constantly PID to the angle even without holonomic wheels. Error in this case could be caused by the gyro, which if it mounts up might require the driver to zero the gyro midway through the match.

  2. Holonomic vs….well, non-holonomic: Having never tried a holonomic drivetrain, I was wondering if error could mount up naturally. For example, pushing the joystick to (0.5, pi/4) might for some reason not move the robot at precisely this amount due to environmental factors. I was wondering if teams use a gyro or other sensors to deal with this, but maybe this isn’t a significant problem.

I’d appreciate any attempts to help clarify this stuff for me. Thanks :slight_smile:

This isn’t a holonomic vs non-holonomic question. You could ask the same question (or a similar question) about a simple tank drive: “If I push both joysticks forward by the same amount, will the robot go precisely straight ahead?”. The answer is no, and it doesn’t matter because the driver adjusts (within reason) the joystick position(s) to get the response he seeks.

The only reason holonomic is different is because it has three degrees of freedom, and it’s annoying for the driver if, for example, he’s got a Halo-style interface and he has to continuously hold a rotation command in order to keep the robot from rotating while he’s busy working the fwd/rev and strafe joystick. That’s when gyro feedback or a “calibrate” button on the joystick is nice to have.


We had a setup very similar to this (http://www.chiefdelphi.com/media/photos/32440) on our 2010 robot. It was only used during autonomous, but it could have been used during the match if we had reason to.

Because of this we used a servo to pick it up during teleop. The only thing that may have worried me a little is going the plywood bump, but the omni wheel seemed to handle it fine.
(the only time we really damaged it was due to people not paying attention when setting the bot on the cart)

Alright, I’m starting to understand. In the case of holonomic, there is usually joystick 1 (fow/rev and strafe), and joystick 2 (rotation). Would it be advisable to use a P/PID function that controls the rate of rotation of the robot? For example, if joystick 2 is at (0,0) but the gyro senses 5deg/sec, make some corrections. No reason to use P/ID on fow/rev and strafe?

That is one of four popular ways to do it. It’s called Halo-style. See this link for 2 other ways. A fourth way is to use a 3-axis joystick: X, Y, and Z (twist).

Would it be advisable to use a P/PID function that controls the rate of rotation of the robot? For example, if joystick 2 is at (0,0) but the gyro senses 5deg/sec, make some corrections.

If your drivetrain is well-designed and balanced, and your wheels are carefully aligned and the mec rollers spin freely, and you use PID to control the 4 wheel speeds, it shouldn’t be necessary.

But you can if you want. Here’s one way.

No reason to use P/ID on fow/rev and strafe?

Right. Besides, how are you going to sense fwd/rev and strafe speeds for the PID process variable input? With a couple of idler wheels?


Cool, even if it isn’t necessary during driver control, it would likely be for autonomous mode.

Thank you so much!

…insufficient testing to uncover errors in the steering motor’s output logic coupled with a bad Cypress board and a hardware issue with our CAN bus. ::ouch:: Using the sensor to determine field orientation angle worked fine. We ditched the Cypress board, fixed the CAN issues and reverted back to robot-oriented control and what you are calling a halo-style driving scheme. We just did not have time to untangle the logic.