# Holonomic Omni-Directional Drive Setup Logic

Hello CD,

My team is currently working on a pretty unique drive-train concept that features a standard 6WD with 4 traction wheels in the back and 2 omni wheels in the front. There will also be though an omni wheel mounted in the back center of our robot that is perpendicular to the other wheels in the drive-train that will also be able to drop down and push the 4 traction wheels off the ground leaving only 3 omni wheels touching the ground.

Some pics for understanding:

Video of Omni Wheel Being deployed:

We tested to see if this would actually work by mapping the middle omni wheel to a joystick value. By manually compensating we found that we were in fact able to move in any direction like a holonomic drive robot.

Omni Directional Drive Test:

What we would like to do now is have 2 separate drive modes; standard and omni directional. We got the standard drive already down but the omni directional one is a bit difficult. What we basically want to have is a steering wheel controlling rotation, and a joystick for throttle and lateral movement. What would be the logic for this to be done correctly? Has this been done before? We are programming in lab-view by the way.

Thanks and please ask for clarification if necessary.

First I’d like to congratulate you guys on such an interesting design. Something I haven’t seen before…

As for you problem of how to program it, I believe you want the axis of the robot to remain the whole time with the axis of the steering wheel so suggest a gyro for the rotational proportion of drive on the robot, that way you can input a value in degrees, from the steering wheel by scaling the axis of -1 and 1 to -180 and 180 respectively, and just use all 3 of your wheels spinning in one direction to get there. For example if I wanted to spin clockwise 90 degrees. I’d turn the steering wheel 90 degrees. I’d have my back wheel spin so the robot goes left, the front left wheel to go forward, and the front right wheel to go backwards, until the gyro on the robot matches the given angle from the steering wheel.

As far as I’m concerned you also don’t even need to use the back omni-wheel to rotate, I would only use it if you can get it to work nicely with the other ones as it might make rotation more quick.

In the case of using the all three omni-wheels, one would only need to program some scalar quantity depending on how close the desired angle is to the current angle into the tank drive proportion for the front two wheels, and for the third wheel a separate motor control that also reads the same scalar quantity.

Well that takes care of the rotation proportion of the drive, now the directional part.

Now assuming you also want it to move while rotated, relative to its starting position (when you push forward on the joystick. It would always go forward to the other side of the field) it can be quite difficult. I assume it won’t be to impossible if you just add all the values up to a defined value for it to finally accept. So if I needed it to rotate. It would accept the rotation scalar value and add on the directional scalar value. Thus giving it its final speed so you could rotate but also drive.

The gyro here also plays a role as you can use some math, specifically trigonometry I believe to find how how fast each wheel needs to turn. For example lets say I’m turned 45 degrees from my original position clockwise and its steady there. It won’t be accepting rotational values from the steering wheel in this case.

I wouldn’t want both front wheels to drive forward as the would result in me driving at a 45 degree angle from my starting position. I would use trig, in this case, sine and cosine to find your x-displacement and y-displacement. Assuming I wanted full speed in a 0 degree direction (in this case from 1 and -1), using sine, [sine(theta) = X-displacement/H , and rewriting that as X-Displacement = H*Sine(teta)] we can figure out the x-displacement to be .7, and using the same principles for the Y-displacement with cosine, to be .7 as well. You’ll plug the X-displacement value of .35 into the right and left values of your tank drive for the front wheels(because you have two wheels you need to split up the power between both of them). And plug in .7 to your back onmi-wheel in the direction that would make your bot go forward.

If you were turning while moving, you’d simply add these values to the values from the rotation calculation portion and give it a final value. There are also certain quadrants where you’ll need change some calculation accordingly in order to get the right direction. For example if I was going counter clockwise 45 degrees. That would mean you would want to use -45 degrees. As well as some other calculation changes that aren’t on the top of my head right now for quadrants… You might want to revisit your math teacher if you get lost in the calculations.

I’m sure there’s a more experienced programmer out there that can tell you to do it a simpler way. But this is the only way that I can think of how to do the omni-drive that you’d like.

And even this is all theoretical. I don’t know if it would actually work. I just thought it out in my head and how I would go about doing something like this.

Hopefully though this would give you enough insight on how to go about doing such a drive with three wheels and maybe you can figure out a better way on how to do it yourself! :D. If you do figure out a better way, I’d really like to know.

Good luck to programming it!