Consider a 3-wheeled, omnidirectional robot (also called a kiwi drive). To see what this looks like see this YouTube video. We can control the motor speeds using a microcontroller.
Task: We have to translate it at a given speed $V$, along a given angle $\theta$:
The wheels are omni wheels. They have rollers along the perimeter, so they can move perpendicular to the plane too:
Now, the correct approach is to break the required velocity vector into components along the plane of the wheel(s) and perpendicular to them, for each wheel. We then control the motors to move at these speeds (we control only the velocity along the plane of the wheels, i.e the "rim" velocity), and this does the job.
Basically, if each wheel has a velocity $V\cos(x)$ along its plane (i.e the rim velocity), and $V\sin(x)$ perpendicular to the plane(i.e the roller velocity),then the wheel will have a resultant velocity of $V$, at an angle $x$ from the axis in the plane of the wheel. $x$ is different for all the wheels, and the values $\theta$, $60+\theta$,$60-\theta$ ensure that the resultant velocity of each wheel is $V$, at an angle $\theta$ from the x axis. (Shown in red in the diagram above). This ensures that the bot translates with $V$ at angle $\theta$.
The only issue I have with this approach is that we are only controlling the rim velocities, and not the roller velocities. We can only give the speeds $V\cos(x)$ to each motor, but apparently this is all we need. How are we ensuring that the roller velocities adjust appropriately ($V\sin(x)$) to give the required velocity vector for each wheel, and hence for the bot?
This might have something to do with no-slip , but I don't know how to start analyzing this at all. I still think we aren't doing enough to ensure the velocity vector is correct...