The Omnidirectional Holonomic Platform more commonly known as the Killough Platform was invented by Stephen Killough and Francois Pin at the Oak Ridge National Laboratories. It uses three specially designed wheel assemblies that can provide force along only one axis (with the rotation of the axle). It moves freely along the direction of the axle.
I have wanted to play with a Killough platform for about 3 years so I jumped at a chance to try one out. Many people have developed Killough platform designs using Legos. I was mainly interested in playing with the software. I used the physical design of Rama created by Philippe Hurbain. This was one of the most elegant designs that I came across (plus I couldn't find the big balloon tires used by other designs).
Movies: From Above Zoomed In (these are about 2M each) |
I wasn't up to attempting this with graphical programming. I wrote the control code in NQC. The most critical part of the software design is to find a way to accurately control the motor speed. To get a full range of motion, you need to be able to drive the motors independently at a wide range of speeds. I have had limited success with this, but really need some rotation sensors so that I can use a closed loop control algorithm to better control motor speed.
The best I could do on my first attempt was to use Pulse Width Modulation for speed control. I have three NQC motor control tasks, one for each motor. Each task monitors a global variable specifying a target speed index (from 0-10). This is used to control the relative time on and off for the motor. A main task sets target speeds for the three motors, then waits while they run. Various combinations of motor speeds are used to drive the platform: around a square without changing orientation, around a circle while turning, turning about 1 wheel, and turning about the center.
With my first attempt at PWM control, I stopped the motor with braking (Off command) during the off part of each control period. This was the only way I could get the motor to actually move at a slow speed and maintain a fairly linear relationship between the speed index and actual speed. The downside is that it made for very jerky motion. If you watch the video, the jerkiness of the motion is due more to the PWM speed control, than the wheel design.
My second attempt floated the motor during the off part of each control period. I found that I couldn't do this for very low speeds or the wheels wouldn't turn at all, they just rocked back and forth. I added a transition point, so that above a certain speed setting, the motor would use the floating stop. This smoothed out the faster speeds, but gave quite a non-linear result. The momentum of the wheel really added to the speed and I had to stretch out the off periods by a factor of three to get a linear response. This worked OK, but was very sensitive to the environment the wheel was in. It worked OK on the carpet in my home office, but not on the deeper carpet in another part of the house, or the hard wood floor.
My next attempt will be to use rotation sensors to accurately measure the true speed for much more accurate control under changing conditions.
I'm hoping that the servo motors in the NXT kit will make this type of motor control much easier. It also has quite a bit more processing horsepower and I hope enough memory to implement trigonometric functions using a lookup table. This would make it possible to drive the system with separate targets for the x, y, and angular velocities. I can't currently calculate the motor speeds necessary to do complex motion on the fly, I have to calculate them offline and program fixed motor speed and timings in the demo code.
Feel free to send comments to me (Steve Appling).